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列表list数组array用法实例解析
Oct 28 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 Python
Python上下文管理器和with块详解
Sep 09 Python
python实现批量按比例缩放图片效果
Mar 30 Python
使用numba对Python运算加速的方法
Oct 15 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
Win10下python 2.7与python 3.7双环境安装教程图解
Oct 12 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
Python pandas对excel的操作实现示例
Jul 21 Python
python3操作redis实现List列表实例
Aug 04 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中显示格式化的用户输入
2006/10/09 PHP
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
聊天室php&mysql(五)
2006/10/09 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
JavaScript使用Prototype实现面向对象的方法
2015/04/14 Javascript
js获取页面description的方法
2015/05/21 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
《陈涉世家》教学反思
2014/04/12 职场文书
环保建议书300字
2014/05/14 职场文书
横幅标语大全
2014/06/17 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
报到证办理个人委托书
2014/10/06 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
2019公司管理制度
2019/04/19 职场文书
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
bat批处理之字符串操作的实现
2022/03/16 Python