DataLoader中num_workers的作用

参考链接
https://www.cnblogs.com/hesse-summer/p/11343870.html
https://stackoverflow.com/questions/53998282/how-does-the-number-of-workers-parameter-in-pytorch-dataloader-actually-work
注:将数据转移到GPU上并不是DataLoader的job;
最好不要在Dataset类中将数据放到GPU上(Dataset的__getitem__()方法),因为此时处理的数据不是batch,batch数据是通过DataLoader加载进来的;若提前将数据放到GPU上,会加大开销-incurring a lot of overhead

第一部分

train_loader  = DataLoader(dataset=train_data, batch_size=train_bs, shuffle=True, num_worker=4)
  1. dataloader一次性创建num_worker个worker,(也可以说dataloader一次性创建num_worker个工作进程,worker也是普通的工作进程),并用batch_sampler将指定batch分配给指定worker,worker将它负责的batch加载进RAM。
  2. 然后,dataloader从RAM中找本轮迭代要用的batch,如果找到了,就使用。如果没找到,就要num_worker个worker继续加载batch到内存,直到dataloader在RAM中找到目标batch。一般情况下都是能找到的,因为batch_sampler指定batch时当然优先指定本轮要用的batch。
  3. 如果num_worker设为0,意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。缺点当然是速度更慢。

综上,我对num_worker的理解为:创建多线程,提前加载未来会用到的batch数据

第二部分

参考链接–https://tianws.github.io/skill/2019/08/27/gpu-volatile/
参考代码–pytorch的dataloader.py的第830行

self._shutdown_workers()

此外,使用data_prefetcher的方法可以预先读取下一个batch的数据。
DataLoader的num_workerdata_prefetcher的区别:

  1. PyTorch 默认的 DataLoader 会创建一些 worker 线程来预读取新的数据,但是只有等到这些线程的数据全部都被清空(即预读取的batch数据全部被主进程使用),这些线程才会读下一批数据。
  2. 使用 data_prefetcher,可以保证线程不会等待,每个线程都总有至少一个数据在加载(模型的forward和预读取下一个batch同时进行)
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值