pytorch訓練常見問題
阿新 • • 發佈:2020-06-28
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.不要用太大的線性層---線性層佔用記憶體巨大。