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 25 Python
使用Python进行稳定可靠的文件操作详解
Dec 31 Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
Python实现抓取页面上链接的简单爬虫分享
Jan 21 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
Python无损音乐搜索引擎实现代码
Feb 02 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
简单分析python的类变量、实例变量
Aug 23 Python
Django ModelForm操作及验证方式
Mar 30 Python
Python实现仿射密码的思路详解
Apr 23 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 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
Django ORM filter() 的运用详解
2020/05/14 Python
Python新手学习raise用法
2020/06/03 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
京东国际站:JOYBUY
2017/11/23 全球购物
大学生自荐书范文
2013/12/10 职场文书
销售团队激励口号
2014/06/06 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
2014年商场工作总结
2014/11/22 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
音乐教师个人总结
2015/02/06 职场文书