- 如果
num_workers
是2,那么它会将2批次放入RAM并发送其中1个到GPU,还是会将3批次放入RAM然后发送其中1个到GPU? - 当工作进程数大于CPU核心数时,实际上会发生什么?我尝试过,一切正常,但它是如何工作的?(我认为我可以选择的最大工作进程数就是核心数)。
- 如果我将
num_workers
设置为3,并且在训练期间GPU内存中没有批次数据,则主进程会等待其工作进程读取批次数据,还是会读取单个批次(而不等待工作进程)?
num_workers
是2,那么它会将2批次放入RAM并发送其中1个到GPU,还是会将3批次放入RAM然后发送其中1个到GPU?num_workers
设置为3,并且在训练期间GPU内存中没有批次数据,则主进程会等待其工作进程读取批次数据,还是会读取单个批次(而不等待工作进程)?num_workers>0
时,只有这些工作进程将检索数据,主进程不会。 所以当 num_workers=2
时,最多有2个工作进程同时将数据放入RAM中,而不是3个。DataLoader
不只是从当前可用的RAM中随机返回,它使用 batch_sampler
来决定下一批要返回的内容。每个批次都分配给一个工作进程,主进程将等待分配的工作进程检索到所需的批次。最后澄清一下,DataLoader
的工作不是直接发送任何内容到GPU,您必须显式调用 cuda()
进行操作。
编辑:请勿在 Dataset
的 __getitem__()
方法中调用 cuda()
,请查看 @psarka 的评论以了解原因。
Dataset
对象中调用.cuda()
可能不是一个好主意,因为它将不得不单独将每个样本(而不是批次)移动到GPU上,从而产生大量开销。 - psarka