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中itertools模块用法详解
Sep 25 Python
Python检测QQ在线状态的方法
May 09 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
python读取文件名并改名字的实例
Jan 07 Python
Python零基础入门学习之输入与输出
Apr 03 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
Django REST Framework之频率限制的使用
Sep 29 Python
Python中__repr__和__str__区别详解
Nov 07 Python
Python hmac模块使用实例解析
Dec 24 Python
Python导入数值型Excel数据并生成矩阵操作
Jun 09 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 Python
Python编程编写完善的命令行工具
Sep 15 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巧获服务器端信息
2006/12/06 PHP
dedecms模板标签代码官方参考
2007/03/17 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
php实现递归的三种基本方式
2020/07/04 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中的True,False条件判断实例分析
2015/01/12 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
django实现类似触发器的功能
2019/11/15 Python
python装饰器原理与用法深入详解
2019/12/19 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
园林施工员岗位职责
2013/12/11 职场文书
一年级数学教学反思
2014/02/01 职场文书
文明餐桌活动方案
2014/02/11 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
市场营销工作计划书
2014/05/06 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
法制主题班会教案
2015/08/13 职场文书