解決pytorch GPU 計算過程中出現(xiàn)內存耗盡的問題
Pytorch GPU運算過程中會出現(xiàn):“cuda runtime error(2): out of memory”這樣的錯誤。通常,這種錯誤是由于在循環(huán)中使用全局變量當做累加器,且累加梯度信息的緣故,用官方的說法就是:"accumulate history across your training loop"。在默認情況下,開啟梯度計算的Tensor變量是會在GPU保持他的歷史數(shù)據(jù)的,所以在編程或者調試過程中應該盡力避免在循環(huán)中累加梯度信息。
下面舉個栗子:
上代碼:
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án)過程中會不斷積累梯度信息到tota_loss,占用內存
以上例子的修正方法是在循環(huán)中的最后一句修改為:total_loss+=float(loss),利用類型變換解除梯度信息,這樣,多次累加不會累加梯度信息。
局部變量逗留導致內存泄露
局部變量通常在變量作用域之外會被Python自動銷毀,在作用域之內,不需要的臨時變量可以使用del x來銷毀。
在設計Linear Layers 的時候,盡量讓其規(guī)模小點
對于nn.Linear(m,n)這樣規(guī)模的線性函數(shù),他的空間規(guī)模為O(mn),除此規(guī)模的空間來容納參數(shù)意外,還需要同樣規(guī)模的空間來存儲梯度,由此很容易造成GPU空間溢出。
相關的進程管理bash cmd
nvidia-smi監(jiān)控GPU,
watch -n 1 nvidia-smi實時監(jiān)控GPU,
watch -n 1 lscpu實時監(jiān)控CPU,
ps -elf進程查看,
ps -elf | grep python查看Python子進程,
kill -9 [PID]殺死進程PID。
Referance:
以上這篇解決pytorch GPU 計算過程中出現(xiàn)內存耗盡的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python實現(xiàn)抓取網(wǎng)頁生成Excel文件的方法示例
這篇文章主要介紹了Python實現(xiàn)抓取網(wǎng)頁生成Excel文件的方法,涉及PyQuery模塊的使用及Excel文件相關操作技巧,需要的朋友可以參考下2017-08-08pytorch1.0中torch.nn.Conv2d用法詳解
今天小編就為大家分享一篇pytorch1.0中torch.nn.Conv2d用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01springboot整合單機緩存ehcache的實現(xiàn)
本文主要介紹了springboot整合單機緩存ehcache的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02對django 模型 unique together的示例講解
今天小編就為大家分享一篇對django 模型 unique together的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08火遍網(wǎng)絡的python中秋節(jié)賀卡現(xiàn)在學還趕得上
中秋將至,我用python編寫了個火遍網(wǎng)絡的中秋節(jié)賀卡,現(xiàn)在學起來還不晚,文中給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09