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