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快速查找算法应用实例
Sep 26 Python
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
django admin组件使用方法详解
Jul 19 Python
PyTorch实现AlexNet示例
Jan 14 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
如何在Python 游戏中模拟引力
Mar 27 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
python 实现有道翻译功能
Feb 26 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 array_filter除去数组中的空字符元素
2020/06/21 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python中字符串的处理技巧分享
2016/09/17 Python
python批量识别图片指定区域文字内容
2019/04/30 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
python数据类型强制转换实例详解
2020/06/22 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
2014年创卫实施方案
2014/02/18 职场文书
结对共建协议书
2014/08/20 职场文书
法人身份证明书
2014/10/08 职场文书
民事申诉状范本
2015/05/20 职场文书
离婚上诉状范文
2015/05/23 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书