python - PyTorch 数据加载器中的“工人数量”参数实际上是如何工作的?
问题描述
- 如果
num_workers
是 2,这是否意味着它将在 RAM 中放入 2 个批次并将其中 1 个批次发送到 GPU,或者是否将 3 个批次放入 RAM 中然后将其中 1 个批次发送到 GPU? - 当工作人员的数量高于 CPU 内核的数量时,实际上会发生什么?我试过了,它工作得很好,但它是如何工作的?(我认为我可以选择的最大工人数是核心数)。
- 如果我设置
num_workers
为 3 并且在训练期间内存中没有用于 GPU 的批次,主进程是等待其工作人员读取批次还是读取单个批次(不等待工作人员)?
解决方案
- 当 时
num_workers>0
,只有这些工作人员会检索数据,主进程不会。因此,当num_workers=2
您最多有 2 个工作人员同时将数据放入 RAM 时,而不是 3 个。 - 好吧,我们的 CPU 通常可以毫无问题地运行 100 个进程,而且这些工作进程并不特殊,因此拥有比 cpu 内核更多的工作进程是可以的。但它有效率吗?这取决于您的 cpu 核心对其他任务的繁忙程度、cpu 的速度、硬盘的速度等。简而言之,它很复杂,因此将工作人员设置为核心数量是一个很好的经验法则,仅此而已。
- 没有。请记住
DataLoader
,它不只是从 RAM 中的可用内容中随机返回,它还用于batch_sampler
决定下一个要返回的批次。每个批次都分配给一个工人,主进程将等待,直到分配的工人检索到所需的批次。
最后澄清一下DataLoader
,将任何内容直接发送到 GPU 不是您的工作,您明确要求cuda()
这样做。
编辑:不要调用cuda()
insideDataset
的__getitem__()
方法,请查看@psarka 的评论以了解原因
推荐阅读
- vba - 尝试通过 VBA 脚本将重复的附件保存到我的 PC 导致 Outlook 崩溃
- c++ - std::locale 取得所有权
- php - phorum 中基于 PHP cookie 的会话交换
- javascript - 如何从 node.js 中的该函数调用结构内的函数?
- android - 为什么 Firebase 模型不填充布局?
- matplotlib - 使用子图时matplotlib图很小
- java - 如何在一段时间内禁用拓扑,然后在一段时间结束时自动启动它
- c++ - 捕捉窗口的 ALT+TAB
- javascript - 使用 javascript 解析“application/x-www-form-urlencoded”响应
- java - LWJGL GLWF glfwInit() 函数卡住