Last Updated on 2021-07-11 by Clay
今天我想要紀錄一個常見的問題,但是其解決方法其實非常少見。簡單來講,我的報錯顯示如下:
RuntimeError: CUDA out of memory. Tried to allocate 2.0 GiB.
這個報錯其實非常單純,那就是 GPU 的『記憶體』不夠了,導致我們想要在 GPU 內執行的訓練資料不夠存放,導致程式意外中止。
是的,使用 nvidia-smi 看到的記憶體容量是 GPU 的記憶體;而使用 htop 所查看到的記憶體則是一般電腦內正常存放執行程序的記憶體,兩者是不一樣的。
解決方法
通常如果是在訓練階段遇到這個問題,通常都是 Batch Size 過大的問題。試想:一次丟給 GPU 很大很大的資料量,是不是容易讓記憶體爆掉呢?反之,若是一次丟的資料小一點,然後訓練完後就清除掉,換下一批資料進來,是不是就不會讓 GPU 爆掉了呢?
所以如果是訓練階段,調小 Batch Size 是可以考慮的方法。
不過我今天遇到的問題稍微複雜點,我訓練了一個模型,但是我接下來讀取這個模型只希望將其取用第一層的輸出 —— 在我重複這個動作一陣子之後,我 GPU 的記憶體就爆掉了!
這是因為,雖然我將模型調整為 eval() 模式,但是資料的梯度仍然在累積,而且又是累積在 GPU 中。久而久之,GPU 的記憶體就超過上限了。
解決方法是:在我們要使用模型產出的時候,將其放在 with torch.no_grad() 底下,這樣一來,模型就不會累積梯度。
References
Read More
- [已解決][Linux] welcome to emergency mode! after logging in type “journalctl -xb” to view system logs “systemctl reboot” to reboot “systemctl default” to try again to boot into default mode. give root password for maintenance
- [已解決] OSError: stanford-chinese-corenlp-yyyy-MM-dd-models.jar not exists. You should download and place it in the models/stanford-corenlp-4.0.0/ first.
- [已解決] X Error of failed request: GLXBadContext Major opcode of failed request: 155 (GLX) Minor opcode of failed request: 183 (X_GLXIsDirect) Serial number of failed request: 181 Current serial number in output stream: 31
- [已解決] TypeError: ‘str’ object is not callable
- [已解決][PyTorch] IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
不是阿大哥,你的解決方法,有講等於沒講= =
哈哈,請原諒,當初實驗室整體轉到 PyTorch 上後,矇矇懂懂的,遇到問題就是把原因跟當時自己的處理方式寫下來。
現在的話,如果你是在做 inference 時遇到 CUDA 記憶體不夠的問題,我會建議去找找模型量化的機制,把模型調整為半精度、甚至是 INT8 的型態去做 inference。
如果是在訓練階段,則可以考慮最近很紅的 QLoRA,這裡轉貼一篇 HuggingFace Blog 上面的文章:https://huggingface.co/blog/4bit-transformers-bitsandbytes
希望能有一些參考,也非常感謝你的回應。