Memory pytorch:丢失。第二批的内存不足

Memory pytorch:丢失。第二批的内存不足,memory,pytorch,Memory,Pytorch,我正在学习使用seq2seq模型。我已经成功地运行了原始项目。然后,我想训练我的自译模型 对于我自己的数据,下面的代码是可以的。但对于第二批,内存不足报告为丢失。第二批数据小于第一批数据 src, trg = src.cuda().T, trg.cuda().T optimizer.zero_grad() output = model(src, trg) loss = F.nll_loss(output[1:].view(-1, vocab_size),

我正在学习使用seq2seq模型。我已经成功地运行了原始项目。然后,我想训练我的自译模型

对于我自己的数据,下面的代码是可以的。但对于第二批,
内存不足
报告为丢失。第二批数据小于第一批数据

    src, trg = src.cuda().T, trg.cuda().T
    optimizer.zero_grad()
    output = model(src, trg)
    loss = F.nll_loss(output[1:].view(-1, vocab_size),
                           trg[1:].contiguous().view(-1),
                           ignore_index=pad)
    loss.backward(retain_graph=True)
    torch.nn.utils.clip_grad_norm_(model.parameters(), grad_clip)
    optimizer.step()
    total_loss += loss.data.item()
    torch.cuda.empty_cache()
对于批大小=16,上述代码对于第一批是正常的,并且
内存不足
在丢失时报告。对于第二批是向后的

第一批使用的gpu为:

2233 MB src, trg = src.cuda().T, trg.cuda().T
2331 MB output = model(src, trg)
4772 MB loss.backward(retain_graph=True)
6471 MB optimizer.step()
5312 MB torch.cuda.empty_cache()
对于批量大小=1,第一批的上述代码正常,第二批的
内存不足
报告为丢失


任何建议都将不胜感激

要稍微扩展@akshayk07的答案,您应该将损失行更改为
loss.backward()
保留损失图需要存储关于模型梯度的附加信息,并且只有当您需要通过单个图反向传播多个损失时才真正有用。默认情况下,pytorch会在反向传播单个丢失值以释放内存后自动清除图形。有关
retain_graph
的更多信息,请参阅。根据经验,如果您计划在同一批中进行另一次
backward()
调用而不执行
retain\u graph=False
,则只应使用
retain\u graph=True
进行
backward()
调用


很可能
empty\u cache
操作无法识别丢失图分配的内存不再需要,因此它不会在每次批处理后释放该内存。保留这些图形将很快填满GPU内存。

是否需要
retain\u graph=True
?您似乎没有再次使用计算图(在给定的代码中)。很抱歉,我也尝试了loss.backward(),但第二批数据仍然会报告OOM。我使用retain_graph=True,因为我对第一批数据尝试了两次loss.backward()。第二次,报告了一个错误:第二次尝试向后通过图形。。。因此,我使用loss.backward(retain_图)。但是,即使使用loss.backward(),第二批大小也会报告OOM。这让我发疯。