如何修复此奇怪的错误:“ RuntimeError:CUDA错误:内存不足”

时间:2019-01-26 01:39:47

标签: python pycharm pytorch

我运行了有关深度学习网络的代码,首先我对网络进行了训练,并且运行良好,但是在运行到验证网络时会发生此错误。

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

我的代码:

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)

enter image description here enter image description here

我认为验证代码可能存在一些错误。但是我找不到。

9 个答案:

答案 0 :(得分:10)

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

import gc

gc.collect()

torch.cuda.empty_cache()

答案 1 :(得分:9)

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

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

nvidia-smi

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

sudo kill -9 pid

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

import torch
torch.cuda.empty_cache()

答案 4 :(得分:0)

出于以下原因,我尝试在以下列表中进行报告:

  1. 模块参数:检查模块的尺寸数。在另一个大输出张量(例如尺寸1000)中转换一个大输入张量(例如尺寸1000)的线性层将需要一个矩阵,其尺寸为(1000,1000)。
  2. RNN解码器的最大步长:如果您在体系结构中使用RNN解码器,请避免循环执行大量步长。通常,您可以修复适合数据集的给定数量的解码步骤。
  3. 张量用法:最小化您创建的张量的数量。直到它们超出范围时,垃圾收集器才会释放它们。
  4. 批处理大小:逐渐增加批处理大小,直到内存不足。即使是著名的库也实现了这一普遍技巧(请参见AllenNLP中的BucketIteratorbiggest_batch_first说明。

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

答案 5 :(得分:0)

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

即使文档使用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,...

答案 6 :(得分:0)

如果某人由于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)

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

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

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

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