主頁 > 知識(shí)庫 > pytorch 運(yùn)行一段時(shí)間后出現(xiàn)GPU OOM的問題

pytorch 運(yùn)行一段時(shí)間后出現(xiàn)GPU OOM的問題

熱門標(biāo)簽:朝陽手機(jī)外呼系統(tǒng) 北京電銷外呼系統(tǒng)加盟 地圖標(biāo)注面積 所得系統(tǒng)電梯怎樣主板設(shè)置外呼 市場(chǎng)上的電銷機(jī)器人 北瀚ai電銷機(jī)器人官網(wǎng)手機(jī)版 小蘇云呼電話機(jī)器人 儋州電話機(jī)器人 佛山400電話辦理

pytorch的dataloader會(huì)將數(shù)據(jù)傳到GPU上,這個(gè)過程GPU的mem占用會(huì)逐漸增加,為了避免GPUmen被無用的數(shù)據(jù)占用,可以在每個(gè)step后用del刪除一些變量,也可以使用torch.cuda.empty_cache()釋放顯存:

del targets, input_k, input_mask
torch.cuda.empty_cache()

這時(shí)能觀察到GPU的顯存一直在動(dòng)態(tài)變化。

但是上述方式不是一個(gè)根本的解決方案,因?yàn)樗艿椒逯档挠绊懞艽?。比如某個(gè)batch的數(shù)據(jù)量明顯大于其他batch,可能模型處理該batch時(shí)顯存會(huì)不夠用,這也會(huì)導(dǎo)致OOM,雖然其他的batch都能順利執(zhí)行。

顯存的占用跟這幾個(gè)因素相關(guān):

模型參數(shù)量

batch size

一個(gè)batch的數(shù)據(jù) size

通常我們不希望改變模型參數(shù)量,所以只能通過動(dòng)態(tài)調(diào)整batch-size,使得一個(gè)batch的數(shù)據(jù) size不會(huì)導(dǎo)致顯存OOM:

ilen = int(sorted_data[start][1]['input'][0]['shape'][0])
olen = int(sorted_data[start][1]['output'][0]['shape'][0])
# if ilen = 1000 and max_length_in = 800
# then b = batchsize / 2
# and max(1, .) avoids batchsize = 0
# 太長(zhǎng)的句子會(huì)被動(dòng)態(tài)改變bsz,單獨(dú)成一個(gè)batch,否則padding的部分就太多了,數(shù)據(jù)量太大,OOM
factor = max(int(ilen / max_length_in), int(olen / max_length_out))
b = max(1, int(batch_size / (1 + factor)))
#b = batch_size
end = min(len(sorted_data), start + b)
minibatch.append(sorted_data[start:end])
if end == len(sorted_data):
    break
start = end

此外,如何選擇一個(gè)合適的batchsize也是個(gè)很重要的問題,我們可以先對(duì)所有數(shù)據(jù)按照大?。ㄩL(zhǎng)短)排好序(降序),不進(jìn)行shuffle,按照64,32,16依次嘗試bsz,如果模型在執(zhí)行第一個(gè)batch的時(shí)候沒出現(xiàn)OOM,那么以后一定也不會(huì)出現(xiàn)OOM(因?yàn)榻敌蚺帕辛藬?shù)據(jù),所以前面的batch的數(shù)據(jù)size最大)。

還有以下問題

pytorch increasing cuda memory OOM 問題

改了點(diǎn)model 的計(jì)算方式,然后就 OOM 了,調(diào)小了 batch_size,然后發(fā)現(xiàn)發(fā)現(xiàn)是模型每次迭代都會(huì)動(dòng)態(tài)增長(zhǎng) CUDA MEMORY, 在排除了 python code 中的潛在內(nèi)存溢出問題之后,基本可以把問題定在 pytorch 的圖計(jì)算問題上了,說明每次迭代都重新生成了一張計(jì)算圖,然后都保存著在,就 OOM 了。

參考

CUDA memory continuously increases when net(images) called in every iteration

Understanding graphs and state

說是會(huì)生成多個(gè)計(jì)算圖:

loss = SomeLossFunction(out) + SomeLossFunction(out)

準(zhǔn)備用 sum來避免多次生成計(jì)算圖的問題:

loss = Variable(torch.sum(torch.cat([loss1, loss2], 0)))

然而,調(diào)著調(diào)著就好了,和報(bào)錯(cuò)前的 code 沒太大差別。估計(jì)的原因是在pycharm 遠(yuǎn)程連接服務(wù)器的時(shí)候 code 的保存版本差異問題,這個(gè)也需要解決一下。

還有個(gè)多次迭代再計(jì)算梯度的問題,類似于 caffe中的iter_size,這個(gè)再仔細(xì)看看。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 解決pytorch GPU 計(jì)算過程中出現(xiàn)內(nèi)存耗盡的問題
  • Pytorch GPU顯存充足卻顯示out of memory的解決方式
  • 解決Pytorch 訓(xùn)練與測(cè)試時(shí)爆顯存(out of memory)的問題

標(biāo)簽:云南 商丘 酒泉 定西 龍巖 江蘇 金融催收 寧夏

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《pytorch 運(yùn)行一段時(shí)間后出現(xiàn)GPU OOM的問題》,本文關(guān)鍵詞  pytorch,運(yùn)行,一段時(shí)間,后,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《pytorch 運(yùn)行一段時(shí)間后出現(xiàn)GPU OOM的問題》相關(guān)的同類信息!
  • 本頁收集關(guān)于pytorch 運(yùn)行一段時(shí)間后出現(xiàn)GPU OOM的問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章