PyTorch 数据加载器中的 "number of workers" 参数实际上是如何工作的?

How does the "number of workers" parameter in PyTorch dataloader actually work?

  1. 如果 num_workers 为 2,这是否意味着它会将 2 个批次放入 RAM 并将其中的 1 个发送到 GPU,或者它是否将 3 个批次放入 RAM 然后将其中的 1 个发送到显卡?
  2. 当 worker 数量高于 CPU 核心数量时,实际会发生什么?我试过了,效果很好,但它是如何工作的? (我以为我最多可以选择的worker数量是核心数)。
  3. 如果我将 num_workers 设置为 3,并且在训练期间 GPU 的内存中没有批次,主进程是等待其工作人员读取批次还是读取单个批次 (不用等工人)?
  1. num_workers>0时,只有这些工作进程会检索数据,主进程不会。因此,当 num_workers=2 你最多有 2 个工作人员同时将数据放入 RAM,而不是 3 个。
  2. 好吧,我们的 CPU 通常可以 运行 100 个进程而不会出现问题,而且这些工作进程无论如何都不是特别的,所以拥有比 cpu 内核更多的工作进程是可以的。但它有效率吗?这取决于您的 cpu 核心用于其他任务的繁忙程度、cpu 的速度、硬盘的速度等。简而言之,它很复杂,因此将 worker 设置为核心数是一个很好的规则大拇指,仅此而已。
  3. 没有。请记住 DataLoader 不只是随机 return 现在 RAM 中可用的内容,它使用 batch_sampler 来决定下一个要 return 的批次。每个批次都分配给一个工作人员,主进程将等待,直到指定的工作人员检索到所需的批次。

最后澄清一下,DataLoader 的工作不是将任何内容直接发送到 GPU,您为此明确调用 cuda()

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