PyTorch 数据加载程序中的“ number of worker”参数实际上是如何工作的?

  1. 如果 num_workers是2,这是否意味着它将在内存中放入2批并将其中的1批发送到 GPU,或者它在内存中放入3批然后将其中的1批发送到 GPU?
  2. 当工作者的数量高于 CPU 核心的数量时,实际会发生什么?我试过了,效果不错,但它是怎么工作的?(我认为我可以选择的工作器的最大数量是核心的数量)。
  3. 如果我将 num_workers设置为3,并且在培训期间 GPU 的内存中没有批处理,那么主进程是等待其工人读取批处理,还是只读取一个批处理(而不等待工人) ?
71591 次浏览
  1. num_workers>0时,只有这些工人会检索数据,主进程不会。因此,当 num_workers=2最多有2个工作人员同时将数据放入 RAM,而不是3个。
  2. 我们的 CPU 通常可以毫无问题地运行100个进程,而且这些工作进程并不特殊,所以拥有比 CPU 核更多的工作进程是可以的。但它有效吗?这取决于你的 CPU 内核处理其他任务的忙碌程度,CPU 的速度,硬盘的速度等等。简而言之,它很复杂,因此将 worker 设置为核的数量是一个很好的经验法则,仅此而已。
  3. 没有。请记住,DataLoader不仅仅是随机地从现在 RAM 中可用的内容返回,它还使用 batch_sampler来决定下一个返回的批处理。每个批处理都被分配给一个工作者,主进程将等待,直到被分配的工作者检索到所需的批处理。

最后要说明的是,DataLoader的工作不是直接将任何东西发送到 GPU,您可以明确地调用 cuda()

编辑: 不要在 Dataset__getitem__()方法中调用 cuda(),请查看@psarka 的评论