250408_解决加载大量数据集速度过慢,耗时过长的问题

250408_解决加载Cifar10等大量数据集速度过慢,耗时过长的问题(加载数据时多线程的坑)

在做Cifar10图像分类任务时,发现每个step时间过长,且在资源管理器中查看显卡资源调用异常,主要表现为,显卡周期性调用,呈现隔一会儿动一下的情况(间隔时间过大导致不能同时截到两个峰值)。

image-20250408224446220

通过检测每步耗费时间发现,载入数据集的时间远远大于前向处理的时间。

在以下参数情况下

batch_size=16
num_workers=20 # 线程数

载入Cifai10数据集的时间为60s左右,前向计算时间仅为0.002s,浪费了大量的时间用于载入及传输数据。

image-20250408230936264

image-20250408225808623

先说结论,是多线程的问题,线程过多导致多线程冲突,修改num_workers=0即可解决问题

解决过程

修改过程中查阅很多资料和大佬博客,尝试了重新定义自己的dataset方法,将transform定义到初始化方法中,避免每获取一次数据就执行一遍transform,而是改为在把数据载入内存时一次全部处理完(详见解决pytorch中Dataloader读取数据太慢的问题_dataloader数据读取慢-CSDN博客)

然后重新定义自己加载数据的方法,大佬文中没给加载的方法,我这里补充

def data_loader(batch_size=4,num_workers=2):""":param batch_size: 批次大小:param num_workers: 线程数:return:train_loader:训练数据加载器test_loader:测试数据加载器class:分类类别"""root_dir="./data"transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),])train_dataset = CUDACIFAR10(root=root_dir,train=True,to_cuda=True,  # 使用XPU(或GPU)half=False,  # 不使用半精度浮点数download=True,  # 如果数据集尚未下载,则下载pre_transform=transform)trainloader = DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True,num_workers=num_workers)test_dataset = CUDACIFAR10(root=root_dir,train=False,to_cuda=True,  # 使用XPU(或GPU)half=False,  # 不使用半精度浮点数download=True,  # 如果数据集尚未下载,则下载pre_transform=transform)testloader = DataLoader(dataset=test_dataset,batch_size=batch_size,shuffle=True,num_workers=num_workers)classes=('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')return trainloader,testloader,classes

然后加载数据集发现报错:

RuntimeError: _share_filename_: only available on CPU

多线程加载仅支持在cpu上进行,我们这样的处理方法已经提前将数据载入到gpu或xpu上,无法使用多线程,遂将num_workers修改为0,发现问题解决了。数据载入速度变得很快。遂准备复现并记录问题,发现把大佬数据类代码注释后,使用官方cifar10数据类代码,加载速度仍较快,核实发现应该是多线程的问题。

尝试多组参数

batch_size=16
num_workers=0

每个step执行时间为11-12s左右

image-20250408231515083

调整参数

batch_size=32
num_workers=1

此时显卡调用情况为长矩形,持续调用,但占用率并不高,在33-34左右波动

image-20250408231417767

此时显卡占用情况呈现连续峰谷,占用波峰为50左右,每个step执行时间缩短为6-8秒

image-20250408231738784

image-20250408231815123

因显卡调用仍有间隙,尝试增大batchsize

batch_size=64
num_workers=1

显卡占用情况仍呈现连续峰谷,占用波峰为30左右,每个step执行时间缩短为6-7秒

image-20250408232021771

image-20250408232055250

batch_size进一步放大到128,显卡占用波峰继续缩小为20左右,但每个step的时间未明显降低

尝试64与2的搭配,仍与32与1的搭配执行时间及显卡占用大致相同,执行时间误差1s,占用误差50%。

尝试128与2的搭配,结果与64,1的搭配情况大致相同,得结论,与比值有关。

batch_sizenum_workers每个step执行时间(秒)显卡占用情况描述显卡占用率波峰(%)性能优化效果(与初始参数对比)
162070显卡周期性调用,间隔时间过长,不能充分利用显卡资源,大部分时间在等待数据加载-数据载入时间过长,显卡资源浪费严重
16011-12显卡调用情况为长矩形,持续调用,但占用率不高,波动在33-34%左右33-34数据载入速度显著提高,显卡资源利用率有所提升,但仍有提升空间
3216-8显卡调用情况呈现连续峰谷,占用波峰约为50%50数据载入速度进一步提高,显卡资源利用率提升,step执行时间缩短
6416-7显卡调用情况仍呈现连续峰谷,占用波峰约为30%30数据载入速度进一步提高,显卡资源利用率提升,step执行时间进一步缩短
1281未明显降低显卡占用波峰继续缩小为20%左右20数据载入速度未明显提升,显卡资源利用率降低,step执行时间未明显缩短
642与32,1搭配大致相同与32,1搭配大致相同-与32,1搭配大致相同,执行时间误差1秒,占用误差5%
1282与64,1搭配大致相同与64,1搭配大致相同-

batch_sizenum_workers 的比值对性能影响较大,需要根据具体情况进行调整。在测试中,batch_size=32, num_workers=1batch_size=64, num_workers=1 的搭配效果较好,能够在数据载入速度和显卡资源利用率之间取得较好的平衡

进一步思考

发现若如所测数据,

image-20250408233454914

仍有大量时间浪费在cpu与gpu的通信及其他步骤上

使用前文所提到的大佬的数据类初始化方法(避免多次transform),在batch_size=16num_workers=0的参数基础上,测得单次step时间可压缩到7-8s,即节省3-4s。其余参数大家自行尝试。

image-20250408233928137

本人初学小白,如有错误劳烦大佬指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible的使用2

#### 一、Ansible变量 ##### facts变量 > facts组件是Ansible用于采集被控节点机器的设备信息,比如IP地址、操作系统、以太网设备、mac 地址、时间/日期相关数据,硬件信息等 - setup模块 - 用于获取所有facts信息 shell ## 常用参数 filter…

多模态大语言模型arxiv论文略读(六)

FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ➡️ 论文标题:FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ➡️ 论文作者:Zhen Wang, Da Li, Yulin Su, Min Yang,…

MySQL深入

体系结构 连接层:主要处理客户端的连接进行授权认证、校验权限等相关操作 服务层:如sql的接口、解析、优化在这里完成,所有跨存储引擎的操作在这里完成 引擎层:索引是在存储引擎层实现的,所以不同的存储引擎他的索引…

智能 SQL 优化工具 PawSQL 月度更新 | 2025年3月

📌 更新速览 本月更新包含 21项功能增强 和 9项问题修复,重点提升SQL解析精度与优化建议覆盖率。 一、SQL解析能力扩展 ✨ 新增SQL语法解析支持 SELECT...INTO TABLE 语法解析(3/26) ALTER INDEX RENAME/VISIBLE 语句解析&#…

数组划分使元素总和最接近

0划分 - 蓝桥云课 将一个数组划分为两个元素总和最接近的两个数组 要使得两组权值的乘积最大,根据数学原理,当两组权值越接近时,它们的乘积就越大。因此,可以将这个问题转化为一个 0 - 1 背包问题,把所有数的总和的一…

多线程代码案例(线程池)- 4

目录 引入 标准库中的线程池 -- ThreadPoolExecutor 研究一下这个方法的几个参数 1. int corePoolSize 2. int maximumPoolSize 3. long keepAliveTime 4. TimeUnit unit 5. BolckingQueue workQueue 6. ThreadFactory threadFactory 7. RejectedExecutionHandler h…

C,C++,C#

C、C 和 C# 是三种不同的编程语言,虽然它们名称相似,但在设计目标、语法特性、运行环境和应用场景上有显著区别。以下是它们的核心区别: 1. 设计目标和历史 语言诞生时间设计目标特点C1972(贝尔实验室)面向过程&#…

nginx 代理 https 接口

代码中需要真实访问的接口是:https://sdk2.028lk.com/application-localizationdev.yml文件中配置: url: http:/111.34.80.138:18100/sdk2.028lk.com/该服务器111.34.80.138上 18100端口监听,配置信息为: location /sdk2.028lk.c…

数据结构实验3.1:顺序栈的基本操作与进制转换

文章目录 一,问题描述二,基本要求三,算法分析四,示例代码五,实验操作六,运行效果 一,问题描述 在数据处理中,常常会遇到需要对链接存储的线性表进行操作的情况。本次任务聚焦于将链…

经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现

目录 经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现一、引言二、经典频域分析方法的基本原理2.1 Bode 图分析2.2 Nyquist 判据三、数学建模与公式推导3.1 一阶系统的频域响应3.2 多极系统的 Bode 图绘制3.3 Nyquist 判据的数学描述四、经典频域分析…

Vue知识点(5)-- 动画

CSS 动画是 Vue3 中实现组件动画效果的高效方式,主要通过 CSS transitions 和 keyframes 动画 CSS Keyframes(关键帧动画) 用来创建复杂的动画序列,可以精确控制动画的各个阶段。 核心语法: keyframes animationNa…

小型园区网实验

划分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

使用LangChain Agents构建Gradio及Gradio Tools(6)——创建自己的GradioTool

使用LangChain Agents构建Gradio及Gradio Tools(6)——创建自己的GradioTool 本篇摘要16. 使用LangChain Agents构建Gradio及Gradio Tool16.6 创建自己的GradioTool16.6.1 创建步骤16.6.2 创建示例StableDiffusionTool参考文献本章目录如下: 《使用LangChain Agents构建Grad…

SDL显示YUV视频

文章目录 1. **宏定义和初始化**2. **全局变量**3. **refresh_video_timer 函数**4. **WinMain 函数**主要功能及工作流程:总结: 1. 宏定义和初始化 #define REFRESH_EVENT (SDL_USEREVENT 1) // 请求画面刷新事件 #define QUIT_EVENT (SDL…

AnimateCC基础教学:随机抽取花名册,不能重复

一.核心代码: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["张三", &quo…

软考 系统架构设计师系列知识点 —— 设计模式之抽象工厂模式

本文内容参考: 软考 系统架构设计师系列知识点之设计模式(2)_系统架构设计师中考设计模式吗-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致谢! Abstract Fac…

P2040 打开所有的灯

题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz。。。 题目描述 这个灯很奇(fan)怪(ren),点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开…

汉得企业级 PaaS 平台 H-ZERO 1.12.0 发布!四大维度升级,构建企业数字化新底座

汉得企业级 PaaS 平台(以下简称"H-ZERO")是一款基于微服务架构的企业级数字化 PaaS 平台,可支持企业各类系统搭建、产品研发,帮助企业快速构架技术中台。 H-ZERO于2025年3月底正式发布 V1.12.0 ,此次发布聚…

ReplicaSet、Deployment功能是怎么实现的?

在Kubernetes中,ReplicaSet 和 Deployment 是用于管理 Pod 副本的关键对象。它们各自的功能和实现机制如下: 1. ReplicaSet 功能 管理 Pod 副本:确保指定数量的 Pod 副本一直在运行。如果有 Pod 副本崩溃或被删除,ReplicaSet 会…

物联网外设管理服务平台

1 开发目标 1.1 架构图 操作系统:基于Linux5.10.10源码和STM32MP157开发板,完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪; 驱动层:为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试,采用linux内核…