基于CUDA out of memory的一種神奇解決方式
CUDA out of memory的解決
我的輸入樣本維度是(1000,12,24,72),一開(kāi)始我是這么輸入數(shù)據(jù)的:
trainer.train(x_train, t_train, x_val, t_val)
發(fā)現(xiàn)必溢出,后來(lái)我取出其中400個(gè)樣本輸入:
trainer.train(x_train[:400], t_train[:400], x_val, t_val)
發(fā)現(xiàn)不溢出了,訓(xùn)練正常,然后我把400刪掉,但沒(méi)刪冒號(hào):
trainer.train(x_train[:], t_train[:], x_val, t_val)
竟然也沒(méi)有溢出?。?!雖然訓(xùn)練速度降了,但是也能正常訓(xùn)練,我不是很懂原理是啥,好神奇!
但是樣本量一大起來(lái),即使用冒號(hào)法還是可能會(huì)溢出。比方說(shuō)我后來(lái)把4000個(gè)樣本作為x/t_train:
>>>x_train.shape (4000,12,24,72) >>>t_train.shape (4000,24) >>>trainer.train(x_train[:], t_train[:], x_val, t_val) RuntimeError:CUDA out of memory...
之所以說(shuō)“可能”會(huì)溢出,是因?yàn)榇_實(shí)是有小概率能正常訓(xùn)練的,但是大部分情況還是會(huì)out of memory…
不過(guò)這真的是一個(gè)“神奇”的方法,能從一定程度上解決CUDA out of memory 的問(wèn)題。希望大佬能解釋一下這其中的原理~謝謝!
-------------------------------------------------------------------
再附上兩個(gè)我昨天看到的兩種不同的解決方案。
一個(gè)是減少帶梯度的中間變量(即非葉子節(jié)點(diǎn))。簡(jiǎn)言之,能一行代碼搞定的,盡量不要寫(xiě)成多行,即使寫(xiě)成多行,也要盡可能減少新變量的建立。
另一個(gè)是在eval的時(shí)候,讓所有的變量都不帶梯度。只需要添加一行代碼:
with torch.no_grad(): ?? ?outputs = Net_(inputs)
在with語(yǔ)句里的所有變量requires_grad都是False。
CUDA error: out of memory問(wèn)題
本人遇到的問(wèn)題是在訓(xùn)練是正常,一到驗(yàn)證時(shí)就會(huì)出現(xiàn)cuda error: out of memory的問(wèn)題
解決思路溯尋
1.首先就是考慮減少batch_size和num_worker,對(duì)于我的情況不奏效
2.然后找到pin_memory發(fā)現(xiàn)是設(shè)置的True,改為false,仍舊不管用
3.包括把
?# Empty GPU cache ? ? ? ? if torch.cuda.is_available(): ? ? ? ? ? ? torch.cuda.empty_cache()
放到報(bào)錯(cuò)位置的前后,不奏效
4.后來(lái)再聚焦問(wèn)題關(guān)鍵,是一到驗(yàn)證就會(huì)出問(wèn)題,所以專門(mén)查攻略,我初步懷疑是因?yàn)轵?yàn)證沒(méi)有參與反向傳播,梯度累積,內(nèi)存爆了,但當(dāng)時(shí)代碼中有with torch.no_grad(): ,所以并沒(méi)有發(fā)現(xiàn)關(guān)鍵,知道看到別人里面 forword是放在with torch.no_grad()后面的,所以最后
with torch.no_grad(): ? ? ? ? ? ? ? ? # Forward pass ? ? ? ? ? ? ? ? loss, np_probs, hv_logits = self.forward(images, targets)
問(wèn)題解決!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)直方圖均衡基本原理解析
這篇文章主要介紹了Python實(shí)現(xiàn)直方圖均衡基本原理,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08
python?魔法方法之?__?slots?__的實(shí)現(xiàn)
本文主要介紹了python?魔法方法之?__?slots?__的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Python實(shí)現(xiàn)讀取txt文件并畫(huà)三維圖簡(jiǎn)單代碼示例
這篇文章主要介紹了Python實(shí)現(xiàn)讀取txt文件并畫(huà)三維圖簡(jiǎn)單代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
卡爾曼濾波數(shù)據(jù)處理技巧通俗理解及python實(shí)現(xiàn)
這篇文章主要為大家介紹了卡爾曼濾波數(shù)據(jù)處理技巧的通俗理解及python實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
PyTorch的深度學(xué)習(xí)入門(mén)教程之構(gòu)建神經(jīng)網(wǎng)絡(luò)
這篇文章主要介紹了PyTorch的深度學(xué)習(xí)入門(mén)教程之構(gòu)建神經(jīng)網(wǎng)絡(luò),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Python實(shí)現(xiàn)購(gòu)物評(píng)論文本情感分析操作【基于中文文本挖掘庫(kù)snownlp】
這篇文章主要介紹了Python實(shí)現(xiàn)購(gòu)物評(píng)論文本情感分析操作,結(jié)合實(shí)例形式分析了Python使用中文文本挖掘庫(kù)snownlp操作中文文本進(jìn)行感情分析的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2018-08-08
Python+Pygame實(shí)戰(zhàn)之吃豆豆游戲的實(shí)現(xiàn)
這篇文章主要為大家介紹了如何利用Python中的Pygame模塊實(shí)現(xiàn)仿吃豆豆游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python游戲開(kāi)發(fā)有一定幫助,需要的可以參考一下2022-06-06
這篇文章主要為大家介紹了python中selenium模塊的安裝和配置環(huán)境變量教程、提取數(shù)據(jù)操作、無(wú)頭模式,有需要的朋友可以借鑒參考下,希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2022-10-10
Python生成任意范圍任意精度的隨機(jī)數(shù)方法
下面小編就為大家分享一篇Python生成任意范圍任意精度的隨機(jī)數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04最新評(píng)論

