Pytorch GPU內(nèi)存占用很高,但是利用率很低如何解決
1.GPU 占用率,利用率
輸入nvidia-smi來觀察顯卡的GPU內(nèi)存占用率(Memory-Usage),顯卡的GPU利用率(GPU-util)
GPU內(nèi)存占用率(Memory-Usage) 往往是由于模型的大小以及batch size的大小,來影響這個指標(biāo) 顯卡的GPU利用率(GPU-util) 往往跟代碼有關(guān),有更多的io運算,cpu運算就會導(dǎo)致利用率變低。
比如打印loss, 輸出圖像,等等

這個時候發(fā)現(xiàn),有一塊卡的利用率經(jīng)常跳到1%,而其他三塊卡經(jīng)常維持在70%以上
2.原因分析
當(dāng)沒有設(shè)置好CPU的線程數(shù)時,Volatile GPU-Util參數(shù)是在反復(fù)的跳動的,0%,20%,70%,95%,0%。
這樣停息1-2 秒然后又重復(fù)起來。其實是GPU在等待數(shù)據(jù)從CPU傳輸過來,當(dāng)從總線傳輸?shù)紾PU之后,GPU逐漸起計算來,利用率會突然升高,但是GPU的算力很強大,0.5秒就基本能處理完數(shù)據(jù),所以利用率接下來又會降下去,等待下一個batch的傳入。
因此,這個GPU利用率瓶頸在內(nèi)存帶寬和內(nèi)存介質(zhì)上以及CPU的性能上面。
最好當(dāng)然就是換更好的四代或者更強大的內(nèi)存條,配合更好的CPU。
3.解決方法:
(1)為了提高利用率,首先要將num_workers(線程數(shù))設(shè)置得體,4,8,16是幾個常選的幾個參數(shù)。本人測試過,將num_workers設(shè)置的非常大,例如,24,32,等,其效率反而降低,因為模型需要將數(shù)據(jù)平均分配到幾個子線程去進行預(yù)處理,分發(fā)等數(shù)據(jù)操作,設(shè)高了反而影響效率。當(dāng)然,線程數(shù)設(shè)置為1,是單個CPU來進行數(shù)據(jù)的預(yù)處理和傳輸給GPU,效率也會低。其次,當(dāng)你的服務(wù)器或者電腦的內(nèi)存較大,性能較好的時候,建議打開pin_memory打開,就省掉了將數(shù)據(jù)從CPU傳入到緩存RAM里面,再給傳輸?shù)紾PU上;為True時是直接映射到GPU的相關(guān)內(nèi)存塊上,省掉了一點數(shù)據(jù)傳輸時間。
(2) 另外的一個方法是,在PyTorch這個框架里面,數(shù)據(jù)加載Dataloader上做更改和優(yōu)化,包括num_workers(線程數(shù)),pin_memory,會提升速度。解決好數(shù)據(jù)傳輸?shù)膸捚款i和GPU的運算效率低的問題。在TensorFlow下面,也有這個加載數(shù)據(jù)的設(shè)置。
(3) 修改代碼(我遇到的問題)
每個iteration 都寫文件了,這個就會導(dǎo)致cpu 一直運算,GPU 等待

造成GPU利用率低還有其他原因
1. CPU數(shù)據(jù)讀取更不上:讀到內(nèi)存+多線程+二進制文件(比如tf record)
2. GPU溫度過高,使用功率太大:每次少用幾個GPU,降低功耗(但是多卡的作用何在?)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python import與from import使用及區(qū)別介紹
Python程序可以調(diào)用一組基本的函數(shù)(即內(nèi)建函數(shù)),比如print()、input()和len()等函數(shù)。接下來通過本文給大家介紹Python import與from import使用及區(qū)別介紹,感興趣的朋友一起看看吧2018-09-09
Pytorch矩陣乘法(torch.mul() 、 torch.mm() 和torch.m
在深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的世界里,矩陣乘法是一項至關(guān)重要的操作,本文主要介紹了Pytorch矩陣乘法,包含了torch.mul() 、 torch.mm() 和torch.matmul()的區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-03-03
python_matplotlib改變橫坐標(biāo)和縱坐標(biāo)上的刻度(ticks)方式
這篇文章主要介紹了python_matplotlib改變橫坐標(biāo)和縱坐標(biāo)上的刻度(ticks)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
使用httplib模塊來制作Python下HTTP客戶端的方法
這篇文章主要介紹了使用httplib模塊來制作Python下HTTP客戶端的方法,文中列舉了一些httplib下常用的HTTP方法,需要的朋友可以參考下2015-06-06
python groupby函數(shù)實現(xiàn)分組后選取最值
這篇文章主要介紹了python groupby函數(shù)實現(xiàn)分組后選取最值,文章圍繞主題相關(guān)資料展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06
Python機器學(xué)習(xí)之使用Pyecharts制作可視化大屏
pyecharts是一個用于生成Echarts圖表的Python庫,Echarts是百度開源的一個數(shù)據(jù)可視化 JS 庫,可以生成一些非??犰诺膱D表,這篇文章主要給大家介紹了關(guān)于Python機器學(xué)習(xí)之Pyecharts制作可視化大屏的相關(guān)資料,需要的朋友可以參考下2021-10-10

