網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
CUDA out of memory的解決
我的輸入樣本維度是(1000,12,24,72),一開始我是這么輸入數(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)言之,能一行代碼搞定的,盡量不要寫成多行,即使寫成多行,也要盡可能減少新變量的建立。
另一個(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)題,所以專門查攻略,我初步懷疑是因?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é)
原文鏈接:https://blog.csdn.net/jasminefeng/article/details/114017463
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-10-10 C++私有繼承與EBO深入分析講解_C 語(yǔ)言
- 2022-03-30 Android實(shí)現(xiàn)定時(shí)任務(wù)功能_Android
- 2022-04-27 VSCode?IDE?配置環(huán)境過(guò)程解析_C 語(yǔ)言
- 2022-06-27 精簡(jiǎn)高效的C#網(wǎng)站優(yōu)化經(jīng)驗(yàn)技巧總結(jié)_C#教程
- 2022-03-23 詳解C#異步多線程使用中的常見(jiàn)問(wèn)題_C#教程
- 2022-01-17 url傳參 中文出現(xiàn)亂碼問(wèn)題 解決方案
- 2022-05-24 Python?6種基本變量操作技巧總結(jié)_python
- 2022-06-04 Android自定義scrollview實(shí)現(xiàn)回彈效果_Android
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支