溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

解決pytorch GPU 計(jì)算過程中出現(xiàn)內(nèi)存耗盡的問題

發(fā)布時(shí)間:2020-10-18 15:47:00 來源:腳本之家 閱讀:522 作者:bob_chen_csdn 欄目:開發(fā)技術(shù)

Pytorch GPU運(yùn)算過程中會(huì)出現(xiàn):“cuda runtime error(2): out of memory”這樣的錯(cuò)誤。通常,這種錯(cuò)誤是由于在循環(huán)中使用全局變量當(dāng)做累加器,且累加梯度信息的緣故,用官方的說法就是:"accumulate history across your training loop"。在默認(rèn)情況下,開啟梯度計(jì)算的Tensor變量是會(huì)在GPU保持他的歷史數(shù)據(jù)的,所以在編程或者調(diào)試過程中應(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)過程中會(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來銷毀。

在設(shè)計(jì)Linear Layers 的時(shí)候,盡量讓其規(guī)模小點(diǎn)

對(duì)于nn.Linear(m,n)這樣規(guī)模的線性函數(shù),他的空間規(guī)模為O(mn),除此規(guī)模的空間來容納參數(shù)意外,還需要同樣規(guī)模的空間來存儲(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 documentations

以上這篇解決pytorch GPU 計(jì)算過程中出現(xiàn)內(nèi)存耗盡的問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI