解决方法: 将num_workers设置为0
dataloader_train = DataLoader(dst_train, shuffle=True, batch_size=int(config.batch_size),
num_workers=config.num_workers)
num_workers是什么?
dataloader一次性创建num_worker个工作进程,并用batch_sampler将指定batch分给指定worker,worker将它负责的batch加载进RAM。
然后,dataloader从RAM中找本轮迭代要用的batch。如果找到了,就使用。如果没找到,就要num_worker个worker继续加载batch到内存,直到dataloader在RAM中找到目标batch。一般情况下都是能找到的,因为batch_sampler指定batch时当然优先指定本轮要用的batch
num_workers设置为0,就是没有worker了吗?
num_worker设置得大,好处是寻batch速度快,因为下一轮迭代的batch很可能在上一轮/上上一轮…迭代时已经加载好了。坏处是内存开销大,也加重了CPU负担(worker加载数据到RAM的进程是CPU复制的嘛)。num_workers的经验设置值是自己电脑/服务器的CPU核心数,如果CPU很强、RAM也很充足,就可以设置得更大些。
如果num_worker设为0,意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。缺点当然是速度更慢。