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 控制语句
Nov 03 Python
python操作gmail实例
Jan 14 Python
python中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
bpython 功能强大的Python shell
Feb 16 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
python GUI图形化编程wxpython的使用
Jul 19 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
python函数定义和调用过程详解
Feb 09 Python
python读取hdfs上的parquet文件方式
Jun 06 Python
浅谈Python数学建模之固定费用问题
Jun 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中substr()函数参数说明及用法实例
2014/11/15 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
DHTML Slide Show script图片轮换
2008/03/03 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
详解js中==与===的区别
2017/01/08 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
JavaScript实现换肤功能
2017/09/15 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
Django之路由层的实现
2019/09/09 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
如何解决安装python3.6.1失败
2020/07/01 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
保时捷设计:Porsche Design
2019/03/30 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
《风娃娃》教学反思
2014/04/19 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android