如何修复这个奇怪的错误: “ RuntimeError: CUDA error: out of memory”

我成功地训练了网络,但在验证过程中得到了这个错误:

运行时错误: CUDA 错误: 内存不足

258677 次浏览

发生错误是因为 GPU 内存不足。

解决这个问题的一种方法是减小批量大小,直到代码运行时没有出现此错误。

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

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

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

1.. When you only perform validation not training,
你不需要计算向前和向后阶段的梯度。
在这种情况下,您的代码可以位于

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

以上代码不使用 GPU 内存

如果在代码中使用 + = 运算符,
它可以在您的梯度图中不断累积梯度。
在这种情况下,需要像下面的站点那样使用 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()

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

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

最好的办法是找到启用 gpu 内存的进程,然后关闭它:

查找 python 进程的 PID:

nvidia-smi

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

sudo kill -9 pid

如果有人因为 fast.ai 到达这里,那么像 ImageDataLoaders这样的装载机的批量大小可以通过 bs=N来控制,其中 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)

我的电脑也遇到了同样的问题。您所需要做的就是定制适合您的计算机的 cfg 文件。原来我的计算机采取的图像大小低于600 X 600,当我调整相同的配置文件,程序运行顺利

我也有同样的问题,这个代码对我很有用:

import gc


gc.collect()


torch.cuda.empty_cache()

我是个火炬使用者。在我的案例中,这个错误信息的原因实际上不是由于 GPU 内存,而是由于 Pytorch 和 CUDA 之间的版本不匹配。

检查原因是否真的是由于你的 GPU 内存,通过以下代码。

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

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

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

下面的代码解决了这个问题:

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

如果你在 Google Colab 中得到这个错误,请使用以下代码:

import torch
torch.cuda.empty_cache()

在根文件夹的 Terminal 中键入 sudo reboot,等待5分钟,然后再次运行它。

不知道这个对你有没有帮助,但是这个解决了我的问题:

export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128

这个帖子里的其他东西都没用。

对我来说,我删除了一些文件在 c 驱动器,以获得更多的自由空间,它解决了这个问题。

根据我的经验,这不是一个典型的 CUDA OOM 错误,因为 PyTorch 试图在 GPU 上分配比目前更多的内存。

泄露的信息是错误消息中明显缺少以下文本。

尝试分配 XXX GiB (GPU Y; XXX GiB 总容量; yyy MiB 已经分配; zzz GiB free; PyTorch 保留的 aaa MiB 总容量)

根据我的经验,这是 Nvidia 驱动程序的问题。对我来说,重新启动总是解决了这个问题,但有时候重新启动是不可能的。

重新启动的一个替代方案是关闭所有 Nvidia 进程并手动重新加载驱动程序。我总是参考 Comzyh写的 这个问题的 不被接受的 答案时,执行的驱动程序周期。希望这能帮助陷入困境的人。