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

时间:2019-01-01 19:23:27

标签: python memory-management deep-learning pytorch ram

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

1 个答案:

答案 0 :(得分:5)

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

最后要澄清的是,将任何内容直接发送到GPU并不是DataLoader的工作,为此您明确调用cuda()或修改Dataset的{​​{1} }方法。