首页 > 解决方案 > PyTorch 数据加载器中的“工人数量”参数实际上是如何工作的?

问题描述

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

标签: pythonmemory-managementdeep-learningpytorchram

解决方案


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

最后澄清一下DataLoader,将任何内容直接发送到 GPU 不是您的工作,您明确要求cuda()这样做。

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


推荐阅读