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 相关文章推荐
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 Python
Python实现简单过滤文本段的方法
May 24 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
python3爬虫怎样构建请求header
Dec 23 Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 Python
python批量解压zip文件的方法
Aug 20 Python
Pytorch to(device)用法
Jan 08 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
python爬虫泛滥的解决方法详解
Nov 25 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
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
Ext 今日学习总结
2010/09/19 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
Python3中使用PyMongo的方法详解
2017/07/28 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
浅谈Python type的使用
2019/11/19 Python
Python用input输入列表的实例代码
2020/02/07 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
会计主管岗位职责
2014/01/03 职场文书
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
中英文求职信范文
2014/01/27 职场文书
幼师辞职信范文
2015/02/27 职场文书
房产证明范本
2015/06/19 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
编写python程序的90条建议
2021/04/14 Python