ChatGPT解决这个技术问题 Extra ChatGPT

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

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

可能感兴趣:discuss.pytorch.org/t/…

S
Shihab Shahriar Khan

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

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

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


只是对最后一句的注释 - 在 Dataset 对象中调用 .cuda() 可能不是一个好主意,因为它必须将每个样本(而不是批处理)单独移动到 GPU,从而产生大量开销.
我还想补充一点,在 Windows 上设置高于 0 的工作人员数量可能会导致错误(参见 discuss.pytorch.org/t/…)。