pytorch中的worker如何工作的

Question

一直很迷,
在给Dataloader设置worker数量(num_worker)时,到底设置多少合适?这个worker到底怎么工作的?
如果将num_worker设为0(也是默认值),就没有worker了吗?

worker的使用场景:

rom torch.utils.data import DataLoader

train_loader = DataLoader(dataset=train_data, batch_size=train_bs, shuffle=True, num_worker=4)

valid_loader = DataLoader(dataset=valid_data, batch_size=valid_bs, num_worker=4)

Answer

  1. 每每轮到dataloader加载数据时:

    for epoch in range(start_epoch, end_epoch):
        for i, data in enumerate(trainloader):
    

    dataloader一次性创建num_worker个worker,(也可以说dataloader一次性创建num_worker个工作进程,worker也是普通的工作进程),

    并用batch_sampler将指定batch分配给指定worker,worker将它负责的batch加载进RAM。

    然后,dataloader从RAM中找本轮迭代要用的batch,如果找到了,就使用。如果没找到,就要num_worker个worker继续加载batch到内存,直到dataloader在RAM中找到目标batch。一般情况下都是能找到的,因为batch_sampler指定batch时当然优先指定本轮要用的batch。

  2. num_worker设置得大,好处是寻batch速度快,因为下一轮迭代的batch很可能在上一轮/上上一轮...迭代时已经加载好了。坏处是内存开销大,也加重了CPU负担(worker加载数据到RAM的进程是CPU复制的嘛)。num_workers的经验设置值是自己电脑/服务器的CPU核心数,如果CPU很强、RAM也很充足,就可以设置得更大些。

  3. 如果num_worker设为0,意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。缺点当然是速度更慢。

参考资料

  1. https://stackoverflow.com/questions/53998282/how-does-the-number-of-workers-parameter-in-pytorch-dataloader-actually-work
  2. https://discuss.pytorch.org/t/guidelines-for-assigning-num-workers-to-dataloader/813
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Windows上使用PyTorch时,DataLoader的num_workers参数用于指定在数据加载过程使用的子进程数量。它的作用是并行地从磁盘读取数据,以加速数据的加载和预处理过程。 然而,在Windows操作系统上,由于不支持"fork"机制,因此不能像在Linux或Mac上那样使用多个子进程。在WindowsPyTorch在DataLoader的num_workers参数设置为非零值时,会将数据加载和预处理的任务放在主进程执行,而不会使用额外的子进程。 因此,在Windows上使用PyTorch时,无论将num_workers参数设置为多少,都只有一个主进程用于数据加载和预处理。这导致在Windows上的数据加载速度可能会较慢,特别是当数据集比较大时。为了加快数据加载过程,可以考虑使用较小的batch_size或者使用更快的硬盘存储设备。 总之,在Windows上使用PyTorch时,虽然可以设置num_workers参数,但其实际效果与设置为0时相同,即数据加载是在主进程完成的,无法利用多进程来加速数据加载过程。 ### 回答2: Windows上使用PyTorch的dataloader时,可以设置num_worker参数来指定数据加载的多线程工作数。num_worker参数的作用是控制加载数据的并发数,即同时加载多少个样本。 在Windows操作系统上,通常建议将num_worker参数设置为0或1。这是因为Windows的多进程实现与Unix系统上的多进程实现有所不同,其涉及到一些技术方面的限制和差异。 将num_worker设置为0意味着仅使用主进程加载数据,并且不会启动任何额外的工作线程。这是一种简单且可行的方式,当数据集规模较小时,可以减少进程间的冲突问题,并提高代码的可移植性。 将num_worker设置为1意味着在主进程之外使用一个额外的工作线程来加载数据。这样可以在加载数据的同时进行一些前处理操作,但同样不会引入进程间的冲突问题。 需要注意的是,Windows上的多线程工作数设置对于每个人的具体情况可能会有所不同。因此,根据实际需求和硬件配置,可以进行一些尝试和调整来选择最佳的num_worker值,以达到性能的最大化和代码的稳定运行。同时,在使用多线程加载数据时,还需要确保代码的正确性和线程安全性,以避免潜在的错误和异常情况的发生。 ### 回答3: 在使用PyTorch时,可以使用Dataloader类来加载和预处理数据。在Dataloader有一个参数叫做`num_workers`,它用于指定加载数据时使用的线程数。 `num_workers`参数的作用是并行加载数据,它决定了有多少个子进程用于数据的预处理。使用多个子进程可以加快数据加载的速度,特别是当数据的预处理操作比较耗时时,使用多个子进程可以提高数据加载的效率。 在Windows系统,由于GIL(全局解释器锁)的存在,多线程并不会真正发挥出并行加载数据的效果,因此在Windows上使用`num_workers`参数设置多个线程的方法并不能有效提高数据加载的速度。相反,设置的`num_workers`越大,对于Windows系统来说,反而可能导致数据加载的速度变慢。 解决这个问题的一个方法是使用`torch.multiprocessing`模块的`set_start_method`函数将后端设置为`'spawn'`,这样可以阻止使用fork进程来生成子进程,从而在Windows上实现真正的并行加载数据。 总而言之,在Windows系统上,使用`num_workers`参数设置多个线程的方法可能不会真正提高数据加载的速度。为了充分利用多核处理器的计算能力,可以考虑使用`torch.multiprocessing`模块的函数来设置后端并行加载数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值