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.不要用太大的线性层---线性层占用内存巨大。

猜你喜欢

转载自www.cnblogs.com/Henry-ZHAO/p/13201501.html