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