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 XML RPC服务器端和客户端实例
Nov 22 Python
python将图片文件转换成base64编码的方法
Mar 14 Python
python学习数据结构实例代码
May 11 Python
Python字符串处理之count()方法的使用
May 18 Python
python基本语法练习实例
Sep 19 Python
Python生成器以及应用实例解析
Feb 08 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
Python使用贪婪算法解决问题
Oct 22 Python
基于plt.title无法显示中文的快速解决
May 16 Python
python开发前景如何
Jun 11 Python
python中添加模块导入路径的方法
Feb 03 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
flash用php连接数据库的代码
2011/04/21 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
JS实现图片翻书效果示例代码
2013/09/09 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
React Native时间转换格式工具类分享
2017/10/24 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
python 元组和列表的区别
2020/12/30 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
体育教师自荐信范文
2013/12/16 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
俞敏洪励志演讲稿
2014/04/29 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
期中考试后的感想
2015/08/07 职场文书
小学大队委竞选口号
2015/12/25 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
Java spring单点登录系统
2021/09/04 Java/Android
Java异常体系非正常停止和分类
2022/06/14 Java/Android