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