如何修复这个奇怪的错误:“运行时错误:CUDA 错误:内存不足”

xia*_*hen 32 python pycharm pytorch

我运行了一个关于深度学习网络的代码,首先我训练了网络,它运行良好,但是运行到验证网络时出现此错误。

我有五个 epoch,每个 epoch 都有一个训练和验证的过程。我在第一个纪元验证时遇到了错误。所以我没有运行验证代码,我发现代码可以运行到第二个纪元并且没有错误。

我的代码:

for epoch in range(10,15): # epoch: 10~15
    if(options["training"]["train"]):
        trainer.epoch(model, epoch)

    if(options["validation"]["validate"]):
    #if(epoch == 14):
        validator.epoch(model)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 在此处输入图片说明

我觉得验证代码可能有一些错误。但我找不到那个。

K. *_*nda 28

显示了您提供的错误,因为您的 GPU 内存不足。解决此问题的一种方法是减少批处理大小,直到您的代码运行时不会出现此错误。

  • 训练集中的数据量远大于验证集。为什么训练没有错误,还有时间验证? (4认同)
  • 我尝试了一下,我将批量大小减少到8,但也有同样的错误。 (2认同)

You*_*ark 21

1..当你只执行验证而不是训练时,
你不需要计算前向和后向阶段的梯度。
在这种情况下,您的代码可以位于

with torch.no_grad():
    ...
    net=Net()
    pred_for_validation=net(input)
    ...
Run Code Online (Sandbox Code Playgroud)

上面的代码不使用 GPU 内存

2.. 如果你在代码中使用 += 操作符,
它可以在你的梯度图中连续累积梯度。
在这种情况下,您需要像以下站点一样使用 float()
https://pytorch.org/docs/stable/notes/faq.html#my-model-reports-cuda-runtime-error-2-out-of-记忆

即使文档使用 float() 进行指南,在我的情况下,item() 也像

entire_loss=0.0
for i in range(100):
    one_loss=loss_function(prediction,label)
    entire_loss+=one_loss.item()
Run Code Online (Sandbox Code Playgroud)

3..如果在训练代码中使用for循环,
数据可以持续到整个for循环结束。
因此,在这种情况下,您可以在执行 optimizer.step() 后显式删除变量

for one_epoch in range(100):
    ...
    optimizer.step()
    del intermediate_variable1,intermediate_variable2,...
Run Code Online (Sandbox Code Playgroud)


小智 12

最好的方法是找到占用 gpu 内存的进程并杀死它:

从以下位置找到python进程的PID:

nvidia-smi
Run Code Online (Sandbox Code Playgroud)

复制PID并通过以下方式杀死它:

sudo kill -9 pid
Run Code Online (Sandbox Code Playgroud)

  • 除了游戏等明显的程序之外,还有哪些程序可能会占用大量 GPU 内存? (2认同)

小智 11

我有同样的问题,这段代码对我有用:

import gc

gc.collect()

torch.cuda.empty_cache()
Run Code Online (Sandbox Code Playgroud)

  • 如果在协作上运行并且需要重置 GPU 内存,则很好 (3认同)
  • 有趣的是,您会将这段代码放在程序中的什么位置?一开始? (3认同)
  • 感谢“Jupyter Lab”为我工作 (2认同)

Tor*_*chi 9

我是 Pytorch 用户。就我而言,这个错误消息的原因实际上不是由于 GPU 内存,而是由于 Pytorch 和 CUDA 之间的版本不匹配。

通过以下代码检查原因是否确实是由您的 GPU 内存引起的。

import torch
foo = torch.tensor([1,2,3])
foo = foo.to('cuda')
Run Code Online (Sandbox Code Playgroud)

如果上述代码仍然出现错误,最好根据您的 CUDA 版本重新安装您的 Pytorch。(就我而言,这解决了问题。) Pytorch 安装链接

Tensorflow/Keras 也会发生类似的情况。

  • “根据您的 CUDA 版本重新安装 Pytorch”是什么意思?cuda和pytorch的版本如何对应?假设我正在安装夜间版本,哪个 cuda 版本适合您的定义? (2认同)

Ale*_*lia 7

可能出于多种原因,我尝试在以下列表中报告:

  1. 模块参数:检查模块的维数。将大输入张量(例如,大小为 1000)转换为另一个大输出张量(例如,大小为 1000)的线性层将需要大小为 (1000, 1000) 的矩阵。
  2. RNN 解码器最大步数:如果您在架构中使用 RNN 解码器,请避免循环大量步骤。通常,您会修复给定数量的对您的数据集合理的解码步骤。
  3. 张量使用:最小化您创建的张量数量。垃圾收集器在它们超出范围之前不会释放它们。
  4. 批量大小:逐步增加批量大小,直到内存不足。这是一个甚至著名的库都实现的常见技巧(参见AllenNLP中 BucketIterator的biggest_batch_first描述。

此外,我建议您查看 PyTorch 官方文档:https ://pytorch.org/docs/stable/notes/faq.html

  • 相同的网络用于训练和验证。为什么训练时没有错误,验证时出现错误? (2认同)