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.pswp.cn/web/75082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75082.shtml
英文地址,請注明出處:http://en.pswp.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內核…