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中操作字符串之startswith()方法的使用
May 20 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
Atom的python插件和常用插件说明
Jul 08 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
对Django中内置的User模型实例详解
Aug 16 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
Python类如何定义私有变量
Feb 03 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 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
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
php实现点击可刷新验证码
2015/11/07 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP框架性能测试报告
2016/05/08 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
ArrayList类(增强版)
2007/04/04 Javascript
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
JavaScript中eval函数的问题
2016/01/31 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
angular多语言配置详解
2019/05/16 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
python中pass语句用法实例分析
2015/04/30 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
python tornado修改log输出方式
2019/11/18 Python
Python requests获取网页常用方法解析
2020/02/20 Python
浅谈Python协程
2020/06/17 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
2019年.net常见面试问题
2012/02/12 面试题
报关专员求职信范文
2014/02/22 职场文书
简单租房协议书
2014/04/09 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
李强感恩观后感
2015/06/17 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python