1. 不要在循環訓練中直接將loss進行append(cannot allocate memory)
默認情況下,涉及需要求導/梯度gradients變量的計算將保存在內存中。計算中避免使用這些變量,例如在跟蹤統計數據時,這些變量在循環訓練中將超出你內存。相反,您應該分離變量或訪問其基礎數據。
有時,當可微分變量可能發生時,它可能並不明顯。考慮以下循環訓練(從源代碼刪減):
total_loss = []
for i in range(10000):
optimizer.zero_grad()
output = model(input)
loss = criterion(output)
loss.backward()
optimizer.step()
total_loss.append(loss)
在這裏,total_loss你的循環訓練中積累了歷史,因爲它loss是一個具有autograd歷史的可微變量(複雜的數據結構,佔用很大的內存)。你可以通過編寫total_loss.append(loss)來解決這個問題。否則即使你有1T的內存,沒append幾次內存就爆了。
2. 如何實時查看內存或者GPU的使用情況:
內存
top
M
GPU
watch -n 0.1 nvidia-smi
3. GPU顯存未釋放問題
我們在使用tensorflow+pycharm 或者PyTorch寫程序的時候, 有時候會在控制檯終止掉正在運行的程序,但是有時候程序已經結束了,nvidia-smi也看到沒有程序了,但是GPU的內存並沒有釋放,這是怎麼回事呢?
使用PyTorch設置多線程(threads)進行數據讀取(DataLoader),其實是假的多線程,他是開了N個子進程(PID都連着)進行模擬多線程工作,所以你的程序跑完或者中途kill掉主進程的話,子進程的GPU顯存並不會被釋放,需要手動一個一個kill纔行,具體方法描述如下:
- 先關閉ssh(或者shell)窗口,退出重新登錄
- 查看運行在gpu上的所有程序:
fuser -v /dev/nvidia*
- kill掉所有(連號的)殭屍進程
4. RuntimeError: CUDA out of memory.
在做模型預測的時候,需要添加下列代碼:
with torch.no_grad():
output = model(input)