1. 程式人生 > 實用技巧 >pytorch訓練常見問題

pytorch訓練常見問題

Cuda out of memory

1.在訓練迴圈除非必要,不要形成積累歷史記錄的變數

total_loss = 0
for i in range(10000):
    optimizer.zero_grad()
    output = model(input)
    loss = criterion(output)
    loss.backward()
    optimizer.step()
    total_loss += loss #pytorch中任何一個變數加上一個required_grad變數都會變成required_grad變數,這樣每次反向傳播都會增加記憶體佔用
#應該直接訪問變數的底層資料
#total_loss += float(loss)
return accuracy
# return accuracy.data[0] 

2.不要保持一個不必要的張量或變數

for i in range(5):
    intermediate = f(input[i])
    result += g(intermediate)
    # del intermediate  解決方法
output = h(result)#這裡計算時,intermediate依然存在,因為intermediate的作用域超出了迴圈部分。
#對於分配給區域性變數的變數或張量,除非超出了變數作用域,否則python不會主動回收這些記憶體
return output

3.RNN的BPTT問題---Backpropagation through time
RNN中反向傳播記憶體佔用和RNN輸入序列的長度成正比。因此如果餵給RNN一個太長的輸入序列,記憶體會很快耗盡。

4.不要用太大的線性層---線性層佔用記憶體巨大。