您好,登錄后才能下訂單哦!
今天小編給大家分享一下基于CUDA out of memory的解決方法是什么的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
我的輸入樣本維度是(1000,12,24,72),一開始我是這么輸入數(shù)據(jù)的:
trainer.train(x_train, t_train, x_val, t_val)
發(fā)現(xiàn)必溢出,后來我取出其中400個樣本輸入:
trainer.train(x_train[:400], t_train[:400], x_val, t_val)
發(fā)現(xiàn)不溢出了,訓(xùn)練正常,然后我把400刪掉,但沒刪冒號:
trainer.train(x_train[:], t_train[:], x_val, t_val)
竟然也沒有溢出?。?!雖然訓(xùn)練速度降了,但是也能正常訓(xùn)練,我不是很懂原理是啥,好神奇!
但是樣本量一大起來,即使用冒號法還是可能會溢出。比方說我后來把4000個樣本作為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...
之所以說“可能”會溢出,是因為確實是有小概率能正常訓(xùn)練的,但是大部分情況還是會out of memory…
再附上兩個我昨天看到的兩種不同的解決方案。
一個是減少帶梯度的中間變量(即非葉子節(jié)點)。簡言之,能一行代碼搞定的,盡量不要寫成多行,即使寫成多行,也要盡可能減少新變量的建立。
另一個是在eval的時候,讓所有的變量都不帶梯度。只需要添加一行代碼:
with torch.no_grad(): outputs = Net_(inputs)
在with語句里的所有變量requires_grad都是False。
本人遇到的問題是在訓(xùn)練是正常,一到驗證時就會出現(xiàn)cuda error: out of memory的問題
1.首先就是考慮減少batch_size和num_worker,對于我的情況不奏效
2.然后找到pin_memory發(fā)現(xiàn)是設(shè)置的True,改為false,仍舊不管用
3.包括把
# Empty GPU cache if torch.cuda.is_available(): torch.cuda.empty_cache()
放到報錯位置的前后,不奏效
4.后來再聚焦問題關(guān)鍵,是一到驗證就會出問題,所以專門查攻略,我初步懷疑是因為驗證沒有參與反向傳播,梯度累積,內(nèi)存爆了,但當(dāng)時代碼中有with torch.no_grad(): ,所以并沒有發(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)
以上就是“基于CUDA out of memory的解決方法是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。