欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pytorch 運行一段時間后出現GPU OOM的問題

 更新時間:2021年06月01日 17:18:54   作者:ASR_THU  
這篇文章主要介紹了pytorch 運行一段時間后出現GPU OOM的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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

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

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

但是上述方式不是一個根本的解決方案,因為他受到峰值的影響很大。比如某個batch的數據量明顯大于其他batch,可能模型處理該batch時顯存會不夠用,這也會導致OOM,雖然其他的batch都能順利執(zhí)行。

顯存的占用跟這幾個因素相關:

模型參數量

batch size

一個batch的數據 size

通常我們不希望改變模型參數量,所以只能通過動態(tài)調整batch-size,使得一個batch的數據 size不會導致顯存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
# 太長的句子會被動態(tài)改變bsz,單獨成一個batch,否則padding的部分就太多了,數據量太大,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

此外,如何選擇一個合適的batchsize也是個很重要的問題,我們可以先對所有數據按照大?。ㄩL短)排好序(降序),不進行shuffle,按照64,32,16依次嘗試bsz,如果模型在執(zhí)行第一個batch的時候沒出現OOM,那么以后一定也不會出現OOM(因為降序排列了數據,所以前面的batch的數據size最大)。

還有以下問題

pytorch increasing cuda memory OOM 問題

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

參考

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

Understanding graphs and state

說是會生成多個計算圖:

loss = SomeLossFunction(out) + SomeLossFunction(out)

準備用 sum來避免多次生成計算圖的問題:

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

然而,調著調著就好了,和報錯前的 code 沒太大差別。估計的原因是在pycharm 遠程連接服務器的時候 code 的保存版本差異問題,這個也需要解決一下。

還有個多次迭代再計算梯度的問題,類似于 caffe中的iter_size,這個再仔細看看。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Django使用詳解:ORM 的反向查找(related_name)

    Django使用詳解:ORM 的反向查找(related_name)

    今天小編就為大家分享一篇Django使用詳解:ORM 的反向查找(related_name),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python自動化測試之DDT數據驅動的實現代碼

    python自動化測試之DDT數據驅動的實現代碼

    這篇文章主要介紹了python自動化測試之DDT數據驅動的實現代碼,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • Python模塊、包和發(fā)布模塊示例代碼

    Python模塊、包和發(fā)布模塊示例代碼

    模塊是python程序架構的一個核心概念,模塊名同樣也是一個標識符,需要符合標識符的命名規(guī)則,接下來通過本文給大家講解Python模塊、包和發(fā)布模塊,需要的朋友可以參考下
    2023-01-01
  • 刪除python pandas.DataFrame 的多重index實例

    刪除python pandas.DataFrame 的多重index實例

    今天小編就為大家分享一篇刪除python pandas.DataFrame 的多重index實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python 生成不重復的隨機數的代碼

    python 生成不重復的隨機數的代碼

    用的是篩選法,網上有解釋,簡單的說 就是先隨機生成一串數字,之后用下標來判斷這些數字有沒有重復,重復的就篩去
    2011-05-05
  • Python實現的HMacMD5加密算法示例

    Python實現的HMacMD5加密算法示例

    這篇文章主要介紹了Python實現的HMacMD5加密算法,簡單說明了HMAC-MD5加密算法的概念、原理并結合實例形式分析了Python實現HMAC-MD5加密算法的相關操作技巧,,末尾還附帶了Java實現HMAC-MD5加密算法的示例,需要的朋友可以參考下
    2018-04-04
  • Python使用watchfiles實現監(jiān)控目錄變更

    Python使用watchfiles實現監(jiān)控目錄變更

    在工作中難免會碰到這樣的需求,監(jiān)控指定目錄,下面小編就來和大家介紹一下如何利用watchfiles 模塊實現監(jiān)控目錄的變更,感興趣的可以了解下
    2023-09-09
  • 在Django的URLconf中使用命名組的方法

    在Django的URLconf中使用命名組的方法

    這篇文章主要介紹了在Django的URLconf中使用命名組的方法,Django是Pyhton各色高人氣開發(fā)框架中最為著名的一個,需要的朋友可以參考下
    2015-07-07
  • pyramid配置session的方法教程

    pyramid配置session的方法教程

    這篇文章主要介紹了pyramid如何配置session,大家可以參考使用
    2013-11-11
  • Python如何利用Har文件進行遍歷指定字典替換提交的數據詳解

    Python如何利用Har文件進行遍歷指定字典替換提交的數據詳解

    這篇文章主要給大家介紹了關于Python如何利用Har文件進行遍歷指定字典替換提交的數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11

最新評論