Python “怎么说?”;工人人数“;PyTorch数据加载器中的参数是否实际工作? 如果num_workers为2,这是否意味着它将在RAM中放入2个批次,并将其中1个发送到GPU,还是将3个批次放入RAM,然后将其中1个发送到GPU 当工人数量高于CPU内核数量时,实际会发生什么情况?我试过了,效果很好,但它是如何工作的?(我认为我能选择的最大工人数量是核心数量) 如果我将num_workers设置为3,并且在培训期间GPU的内存中没有批次,那么主进程是等待其worker读取批次还是读取单个批次(不等待worker) 当num\u workers>0时,只有这些worker将检索数据,而主进程不会。因此,当num_workers=2时,最多有2个worker同时将数据放入RAM,而不是3个 我们的CPU通常可以像100个进程一样毫无问题地运行,而且这些工作进程在任何情况下都不是特别的,所以有比CPU核更多的工作进程是可以的。但它是否有效?这取决于cpu内核对其他任务的繁忙程度、cpu的速度、硬盘的速度等。简言之,这很复杂,因此将worker设置为内核数是一个很好的经验法则,仅此而已 没有。请记住,DataLoader并不仅仅是从RAM中随机返回,它还使用batch\u sampler来决定下一步返回哪个批次。每个批都分配给一个工人,主进程将等待,直到所分配的工人检索到所需的批

Python “怎么说?”;工人人数“;PyTorch数据加载器中的参数是否实际工作? 如果num_workers为2,这是否意味着它将在RAM中放入2个批次,并将其中1个发送到GPU,还是将3个批次放入RAM,然后将其中1个发送到GPU 当工人数量高于CPU内核数量时,实际会发生什么情况?我试过了,效果很好,但它是如何工作的?(我认为我能选择的最大工人数量是核心数量) 如果我将num_workers设置为3,并且在培训期间GPU的内存中没有批次,那么主进程是等待其worker读取批次还是读取单个批次(不等待worker) 当num\u workers>0时,只有这些worker将检索数据,而主进程不会。因此,当num_workers=2时,最多有2个worker同时将数据放入RAM,而不是3个 我们的CPU通常可以像100个进程一样毫无问题地运行,而且这些工作进程在任何情况下都不是特别的,所以有比CPU核更多的工作进程是可以的。但它是否有效?这取决于cpu内核对其他任务的繁忙程度、cpu的速度、硬盘的速度等。简言之,这很复杂,因此将worker设置为内核数是一个很好的经验法则,仅此而已 没有。请记住,DataLoader并不仅仅是从RAM中随机返回,它还使用batch\u sampler来决定下一步返回哪个批次。每个批都分配给一个工人,主进程将等待,直到所分配的工人检索到所需的批,python,memory-management,deep-learning,pytorch,ram,Python,Memory Management,Deep Learning,Pytorch,Ram,最后要澄清的是,直接向GPU发送任何内容不是数据加载器的工作,为此您可以显式地调用cuda() 编辑:不要在Dataset的中调用cuda()方法,请查看@psarka的注释以了解原因只是最后一句话的注释-在Dataset对象中调用.cuda()可能不是一个好主意,因为它必须移动每个示例(而不是批处理)单独添加到GPU,会产生大量开销。我还想补充一点,在windows上设置大于0的工作进程数可能会导致错误(参见)。可能会引起兴趣:

最后要澄清的是,直接向GPU发送任何内容不是数据加载器的工作,为此您可以显式地调用
cuda()


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

只是最后一句话的注释-在
Dataset
对象中调用
.cuda()
可能不是一个好主意,因为它必须移动每个示例(而不是批处理)单独添加到GPU,会产生大量开销。我还想补充一点,在windows上设置大于0的工作进程数可能会导致错误(参见)。可能会引起兴趣: