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分割TXT文件成4K的TXT文件
May 23 Python
Python psutil模块简单使用实例
Apr 28 Python
Python实现ssh批量登录并执行命令
Oct 25 Python
深入理解Python单元测试unittest的使用示例
Nov 18 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
Python多线程原理与用法实例剖析
Jan 22 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
python语言中有算法吗
Jun 16 Python
Python爬虫与反爬虫大战
Jul 30 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 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大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
php实现webservice实例
2014/11/06 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
js选项卡的实现方法
2015/02/09 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
js字符串倒序的实例代码
2018/11/30 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
Python编程pygal绘图实例之XY线
2017/12/09 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
Python内置函数locals和globals对比
2020/04/28 Python
python openssl模块安装及用法
2020/12/06 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
学生自我鉴定范文
2013/10/04 职场文书
校长创先争优承诺书
2014/08/30 职场文书
走进科学观后感
2015/06/18 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS