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的线程来解决生产者消费问题的示例
Apr 02 Python
Python中的字符串替换操作示例
Jun 27 Python
Python操作Excel之xlsx文件
Mar 24 Python
图解Python变量与赋值
Apr 03 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
python三引号输出方法
Feb 27 Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 Python
Pytorch Tensor的索引与切片例子
Aug 18 Python
python实现字符串和数字拼接
Mar 02 Python
python代数式括号有效性检验示例代码
Oct 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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
nodejs基础应用
2017/02/03 NodeJs
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
python模块导入的细节详解
2018/12/10 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
python3去掉string中的标点符号方法
2019/01/22 Python
简单了解django文件下载方式
2020/02/10 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
DataReader和DataSet的异同
2014/12/31 面试题
运动会铅球比赛加油稿
2014/09/26 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
优秀党员个人总结
2015/02/14 职场文书
培训讲师开场白
2015/06/01 职场文书
农村婚庆主持词
2015/06/29 职场文书
企业团队精神心得体会
2016/01/19 职场文书