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时间整形转标准格式的示例分享
Feb 14 Python
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
如何用itertools解决无序排列组合的问题
May 18 Python
python使用socket创建tcp服务器和客户端
Apr 12 Python
python实现飞机大战微信小游戏
Mar 21 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
python socket 聊天室实例代码详解
Nov 14 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
python cookie反爬处理的实现
Nov 01 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
python实现ROA算子边缘检测算法
Apr 05 Python
Python必备技巧之字符数据操作详解
Mar 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 生成饼图 三维饼图
2009/09/28 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
python中argparse模块用法实例详解
2015/06/03 Python
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
pandas带有重复索引操作方法
2018/06/08 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
python文件读取失败怎么处理
2020/06/23 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
美国排名第一的葡萄酒俱乐部:Firstleaf Wine Club
2020/01/02 全球购物
工商管理应届生求职信
2013/10/07 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
语文教师求职信范文
2015/03/20 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
vue3获取当前路由地址
2022/02/18 Vue.js
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS