Pytorch使用匯總

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纔行,具體方法描述如下:

  1. 先關閉ssh(或者shell)窗口,退出重新登錄
  2. 查看運行在gpu上的所有程序:
fuser -v /dev/nvidia*
  1. kill掉所有(連號的)殭屍進程

4. RuntimeError: CUDA out of memory.

在做模型預測的時候,需要添加下列代碼:

with torch.no_grad():
      output = model(input)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章