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实现数据分析
Jan 11 Python
使用Python绘制图表大全总结
Feb 11 Python
详谈Python基础之内置函数和递归
Jun 21 Python
利用Python如何生成hash值示例详解
Dec 20 Python
pycharm创建一个python包方法图解
Apr 10 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
Python实现图片识别加翻译功能
Dec 26 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 Python
Python利器openpyxl之操作excel表格
Apr 17 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
数据库相关问题
2006/10/09 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
python递归实现快速排序
2018/08/18 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
python如何快速生成时间戳
2020/07/21 Python
python里glob模块知识点总结
2021/01/05 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
岗位廉政承诺书
2014/03/27 职场文书
2014年英语工作总结
2014/12/20 职场文书
摩登时代观后感
2015/06/03 职场文书
2016党员三严三实心得体会
2016/01/15 职场文书
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL