PyTorch数据加载器中的“工人数”参数实际上如何工作?

flo*_*oyd 7 python ram memory-management deep-learning pytorch

1-如果num_workers为2,是否意味着将2批放入RAM中并将其中1批发送到GPU或将3批放入RAM中然后将其中1批发送到GPU?
2-当工作程序的数量大于CPU内核的数量时,实际上会发生什么?我尝试了一下,但效果很好,但是它如何工作?(我认为我可以选择的最大工人数是核心数)
3-如果我设置num_workers为3,并且在训练过程中内存中没有批次用于GPU,主进程是在等待其工作人员读取批次还是在读取单个批次(不等待工作人员)?

Shi*_*han 10

  1. 当为时num_workers>0,仅这些工作人员将检索数据,而主过程则不会。因此,当 num_workers=2您最多有2个工作人员同时将数据放入RAM时,而不是3个。
  2. 好吧,我们的CPU通常可以像100个进程一样正常运行,而这些工作进程也不是什么特别的,因此拥有比cpu核心更多的工作进程是可以的。但这有效吗?这取决于您的CPU核心完成其他任务的繁忙程度,CPU的速度,硬盘的速度等。总之,这很复杂,因此,将工作人员的核心数量设置为良好的经验法则,仅此而已。
  3. 不。请记住DataLoader,不仅从当前RAM中的可用内存随机返回,还用于batch_sampler确定下一个要返回的批次。每个批次都分配给一个工作人员,主流程将等待,直到分配的工作人员检索到所需的批次为止。

最后要澄清的是,DataLoader直接将任何内容发送到GPU 并不是您的工作,您明确地要求cuda()它或修改Dataset__getitem__()方法。

  • 只是对最后一句话做一记-在Dataset对象中调用`.cuda()`可能不是一个好主意,因为它将必须将每个样本(而不是批处理)分别移至GPU,从而导致很多开销。 (2认同)