【问题标题】:How to fix this strange error: "RuntimeError: CUDA error: out of memory"如何解决这个奇怪的错误:“RuntimeError: CUDA error: out of memory”
【发布时间】:2019-06-19 20:36:16
【问题描述】:

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

我有五个 epoch,每个 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)

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

【问题讨论】:

  • 那么你最终如何修复这个错误呢?你会减少批量大小吗?
  • @xiaoding,你能告诉我们,解决办法是什么?
  • @Lauraishere,他们在下面评论说他们减少了批量大小并且它不起作用。我也一样。你的问题解决了吗,如果解决了,可以分享一下吗?
  • 如果模型用于验证,可以尝试使用'torch.no_grad()'。

标签: python pycharm pytorch


【解决方案1】:

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

【讨论】:

  • 我试过了,我把batch size减到8了,还是一样的错误。
  • 训练集的数据量远大于验证集。为什么训练没有错误,还有时间验证?
  • 另一种对我有帮助的方法是:我在终端 sudo rm -rf ~/.nv 中运行了这个命令,然后重新启动了我的笔记本电脑。
  • 也可能在训练期间使用的张量仍然处于活动状态,然后您在验证期间创建更多。
  • 你可以在这里查看这个问题github.com/tensorflow/tensorflow/issues/19731
【解决方案2】:

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

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

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

【讨论】:

  • 同一个网络用于训练和验证。为什么训练没有错误,验证时却出现?
【解决方案3】:

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

with torch.no_grad():
    ...
    net=Net()
    pred_for_validation=net(input)
    ...

以上代码不使用 GPU 内存

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

即使 docs 使用 float() 引导,对我来说,item() 也可以像

entire_loss=0.0
for i in range(100):
    one_loss=loss_function(prediction,label)
    entire_loss+=one_loss.item()

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

for one_epoch in range(100):
    ...
    optimizer.step()
    del intermediate_variable1,intermediate_variable2,...

【讨论】:

  • 关于第1点,我使用预训练的bert模型对文本数据进行转换(仅推理,不训练)。仍然得到 cuda out of memory 错误。
  • @LeiHao:尝试减少批量大小。
【解决方案4】:

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

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

nvidia-smi

复制 PID 并通过以下方式终止它:

sudo kill -9 pid

【讨论】:

  • 除了游戏等明显的东西之外,还有哪些程序会占用大量 GPU 内存?
【解决方案5】:

如果有人因为 fast.ai 而到达这里,则可以通过 bs=N 控制诸如 ImageDataLoaders 之类的加载程序的批量大小,其中 N 是批量大小。

我的专用 GPU 被限制为 2GB 内存,在以下示例中使用 bs=8 在我的情况下工作:

from fastai.vision.all import *
path = untar_data(URLs.PETS)/'images'

def is_cat(x): return x[0].isupper()
dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=Resize(244), num_workers=0, bs=)

learn = cnn_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)

【讨论】:

  • 这正是我遇到此错误的地方 - 尝试为“使用 fastai 和 pytorch 的编码人员深度学习”一书执行上述 jupyter 单元格。然而,起初,它并没有奏效。即使使用 num_workers=0 和 bs=8,它也会耗尽内存。我尝试使用 bs=4,尝试关闭所有其他正在运行的应用程序,但内存仍然不足。但是后来,我决定重新启动(对 Windows 来说总是一个好主意),在那之后,它花了一段时间,但运行成功。事实上,考虑一下,我可能会建议先重新启动,然后只使用 num_workers=0(在 Windows 下这是必需的)。
【解决方案6】:

我的电脑也遇到了同样的问题。您所要做的就是自定义适合您计算机的 cfg 文件。原来我的计算机将图像大小低于 600 X 600,当我在配置文件中进行相同的调整时,程序运行顺利。Picture Describing my cfg file

【讨论】:

    【解决方案7】:

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

    import gc
    
    gc.collect()
    
    torch.cuda.empty_cache()
    

    【讨论】:

    • 如果在 collab 上运行并且需要重置 GPU 内存则很好
    • 有趣,你会把这段代码放在你的程序中的什么地方?一开始?
    • 感谢Jupyter Lab为我工作
    【解决方案8】:

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

    通过下面的代码检查原因是否真的是由于您的 GPU 内存。

    import torch
    foo = torch.tensor([1,2,3])
    foo = foo.to('cuda')
    

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

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

    【讨论】:

    • “根据您的 CUDA 版本重新安装 Pytorch”是什么意思?你如何对应cuda和pytorch的版本?假设我正在安装每晚版本,您的定义中适合的 cuda 版本是什么?
    • @Blade,您的问题的答案不会是静态的。但是this page 建议当前的夜间构建是针对 CUDA 10.2 构建的(但可以安装 CUDA 11.3 版本等)。此外,previous versions 页面也有安装特定版本 CUDA 的说明。
    【解决方案9】:

    以下代码解决的问题:

    import os
    os.environ['CUDA_VISIBLE_DEVICES']='2, 3'
    

    【讨论】:

      【解决方案10】:

      如果您在 Google Colab 中遇到此错误,请使用以下代码:

      import torch
      torch.cuda.empty_cache()
      

      【讨论】:

      • 我们也可以在本地机器上使用此代码吗?我也不断收到这个错误,非常详细:RuntimeError: CUDA out of memory。尝试分配 20.00 MiB(GPU 0;3.95 GiB 总容量;2.80 GiB 已分配;39.31 MiB 空闲;PyTorch 总共保留 2.89 GiB)@ThembaTman
      • 是的,你可以。empty_cache() 不会增加可用于 PyTorch 的 GPU 内存量。但是,在某些情况下,它可以帮助减少 GPU 内存碎片。
      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 2022-09-28
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多