解決pytorch GPU 計(jì)算過(guò)程中出現(xiàn)內(nèi)存耗盡的問(wèn)題
Pytorch GPU運(yùn)算過(guò)程中會(huì)出現(xiàn):“cuda runtime error(2): out of memory”這樣的錯(cuò)誤。通常,這種錯(cuò)誤是由于在循環(huán)中使用全局變量當(dāng)做累加器,且累加梯度信息的緣故,用官方的說(shuō)法就是:"accumulate history across your training loop"。在默認(rèn)情況下,開啟梯度計(jì)算的Tensor變量是會(huì)在GPU保持他的歷史數(shù)據(jù)的,所以在編程或者調(diào)試過(guò)程中應(yīng)該盡力避免在循環(huán)中累加梯度信息。
下面舉個(gè)栗子:
上代碼:
total_loss=0 for i in range(10000): optimizer.zero_grad() output=model(input) loss=criterion(output) loss.backward() optimizer.step() total_loss+=loss #這里total_loss是跨越循環(huán)的變量,起著累加的作用, #loss變量是帶有梯度的tensor,會(huì)保持歷史梯度信息,在循環(huán)過(guò)程中會(huì)不斷積累梯度信息到tota_loss,占用內(nèi)存
以上例子的修正方法是在循環(huán)中的最后一句修改為:total_loss+=float(loss),利用類型變換解除梯度信息,這樣,多次累加不會(huì)累加梯度信息。
局部變量逗留導(dǎo)致內(nèi)存泄露
局部變量通常在變量作用域之外會(huì)被Python自動(dòng)銷毀,在作用域之內(nèi),不需要的臨時(shí)變量可以使用del x來(lái)銷毀。
在設(shè)計(jì)Linear Layers 的時(shí)候,盡量讓其規(guī)模小點(diǎn)
對(duì)于nn.Linear(m,n)這樣規(guī)模的線性函數(shù),他的空間規(guī)模為O(mn),除此規(guī)模的空間來(lái)容納參數(shù)意外,還需要同樣規(guī)模的空間來(lái)存儲(chǔ)梯度,由此很容易造成GPU空間溢出。
相關(guān)的進(jìn)程管理bash cmd
nvidia-smi監(jiān)控GPU,
watch -n 1 nvidia-smi實(shí)時(shí)監(jiān)控GPU,
watch -n 1 lscpu實(shí)時(shí)監(jiān)控CPU,
ps -elf進(jìn)程查看,
ps -elf | grep python查看Python子進(jìn)程,
kill -9 [PID]殺死進(jìn)程PID。
Referance:
以上這篇解決pytorch GPU 計(jì)算過(guò)程中出現(xiàn)內(nèi)存耗盡的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python+gensim實(shí)現(xiàn)文本相似度分析詳解
這篇文章主要介紹了Python+gensim實(shí)現(xiàn)文本相似度分析詳解,在開發(fā)中我們會(huì)遇到進(jìn)行文本相似度分析的需求,計(jì)算文本相似度,用于鑒別文章是否存在抄襲,需要的朋友可以參考下2023-07-07
Python OpenCV實(shí)現(xiàn)按照像素點(diǎn)圖片切割
本文將詳細(xì)介紹如何使用Python和OpenCV進(jìn)行基于像素點(diǎn)的圖像分割,包括閾值分割,自適應(yīng)閾值分割等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
Python實(shí)現(xiàn)將16進(jìn)制字符串轉(zhuǎn)化為ascii字符的方法分析
解決tf.keras.models.load_model加載模型報(bào)錯(cuò)問(wèn)題
python使用selenium打開chrome瀏覽器時(shí)帶用戶登錄信息實(shí)現(xiàn)過(guò)程詳解
對(duì)pycharm 修改程序運(yùn)行所需內(nèi)存詳解

