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中针对函数处理的特殊方法
Mar 06 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 Python
matplotlib中legend位置调整解析
Dec 19 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
python print出共轭复数的方法详解
Jun 25 Python
Django的用户模块与权限系统的示例代码
Jul 24 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
python实现ftp文件传输功能
Mar 20 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
python 统计list中各个元素出现的次数的几种方法
Feb 20 Python
Python Django获取URL中的数据详解
Nov 01 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面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
图片自动更新(说明)
2006/10/02 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
详解Python中的__new__()方法的使用
2015/04/09 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
python简单获取数组元素个数的方法
2015/07/13 Python
django模板语法学习之include示例详解
2017/12/17 Python
用python实现对比两张图片的不同
2018/02/05 Python
Python中的函数作用域
2018/05/07 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
会计系毕业求职信
2014/08/07 职场文书
解放思想演讲稿
2014/09/11 职场文书
走群众路线学习笔记
2014/11/06 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
2015年幼师工作总结
2015/04/28 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis