pytorch DataLoader的num_workers参数与设置大小详解


Posted in Python onMay 28, 2021

Q:在给Dataloader设置worker数量(num_worker)时,到底设置多少合适?这个worker到底怎么工作的?

train_loader = torch.utils.data.DataLoader(train_dataset,
                                               batch_size=batch_size, shuffle=True,
                                               num_workers=4)

参数详解:

1、每次dataloader加载数据时: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、Dataloader的num_worker设置多少才合适,这个问题是很难有一个推荐的值。有以下几个建议:

2、num_workers=0表示只有主进程去加载batch数据,这个可能会是一个瓶颈。

3、num_workers = 1表示只有一个worker进程用来加载batch数据,而主进程是不参与数据加载的。这样速度也会很慢。

num_workers>0 表示只有指定数量的worker进程去加载数据,主进程不参与。增加num_works也同时会增加cpu内存的消耗。所以num_workers的值依赖于 batch size和机器性能。

4、一般开始是将num_workers设置为等于计算机上的CPU数量

5、最好的办法是缓慢增加num_workers,直到训练速度不再提高,就停止增加num_workers的值。

补充:pytorch中Dataloader()中的num_workers设置问题

如果num_workers的值大于0,要在运行的部分放进__main__()函数里,才不会有错:

import numpy as np
import torch
from torch.autograd import Variable
import torch.nn.functional
import matplotlib.pyplot as plt
import torch.utils.data as Data 
 
BATCH_SIZE=5
 
x=torch.linspace(1,10,10)
y=torch.linspace(10,1,10)
torch_dataset=Data.TensorDataset(x,y)
loader=Data.DataLoader(
    dataset=torch_dataset,
    batch_size=BATCH_SIZE,
    shuffle=True,
    num_workers=2,
) 
 
def main():
    for epoch in range(3):
        for step,(batch_x,batch_y) in enumerate(loader):
            # training....
            print('Epoch:',epoch,'| step:',step,'| batch x:',batch_x.numpy(),
                  '| batch y:',batch_y.numpy()) 
 
if __name__=="__main__":
    main() 
 
'''
# 下面这样直接运行会报错:
 for epoch in range(3):
     for step,(batch_x,batch_y) in enumerate(loader):
         # training....
          print('Epoch:',epoch,'| step:',step,'| batch x:',batch_x.numpy(),
                  '| batch y:',batch_y.numpy()
'''

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
flask中使用SQLAlchemy进行辅助开发的代码
Feb 10 Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 Python
Python使用剪切板的方法
Jun 06 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
python实现逐个读取txt字符并修改
Dec 24 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
Python-接口开发入门解析
Aug 01 Python
pywinauto自动化操作记事本
Aug 26 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
小 200 行 Python 代码制作一个换脸程序
May 12 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
pytorch 权重weight 与 梯度grad 可视化操作
Jun 05 Python
Flask搭建一个API服务器的步骤
May 28 #Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 #Python
解决Python中的modf()函数取小数部分不准确问题
May 28 #Python
利用Python+OpenCV三步去除水印
python实现自定义日志的具体方法
May 28 #Python
python 爬取京东指定商品评论并进行情感分析
python b站视频下载的五种版本
May 27 #Python
You might like
MYSQL环境变量设置方法
2007/01/15 PHP
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
JS中的多态实例详解
2017/10/15 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
vue将data恢复到初始状态 && 重新渲染组件实例
2020/09/04 Javascript
Python中__call__用法实例
2014/08/29 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
采购员岗位职责
2013/11/15 职场文书
校园门卫岗位职责
2013/12/09 职场文书
会计专业的自荐信
2013/12/12 职场文书
银行求职信怎么写
2014/05/26 职场文书
主题党日活动总结
2014/07/08 职场文书
商务经理岗位职责
2014/08/03 职场文书
人事专员岗位职责
2015/02/03 职场文书
2015年质检工作总结
2015/05/04 职场文书
理想国读书笔记
2015/06/25 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
在Django中使用MQTT的方法
2021/05/10 Python