zoukankan      html  css  js  c++  java
  • 【Q&A】pytorch中的worker如何工作的


    博客地址:https://www.cnblogs.com/hesse-summer/,欢迎转载,转载请说明出处。

    Question

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

    worker的使用场景:

    from 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
  • 相关阅读:
    Java WebSocket生命周期
    软件网络总结
    js模态弹窗
    spring boot
    spring aop
    lvs分布式
    如何在大牛面前装逼
    Java学习的思考
    javase知识点
    <nginx+PHP>nginx环境下配置支持php7
  • 原文地址:https://www.cnblogs.com/hesse-summer/p/11343870.html
Copyright © 2011-2022 走看看