RuntimeError: CUDA out of memory

本文详细记录了解决PyTorch中CUDA内存不足的常见方法,包括减小batchsize、清除缓存、避免梯度计算、关闭其他GPU进程、调整CUDA设备使用和考虑硬件升级等。通过具体案例分析了错误信息,并提供了检查内存分配的工具。最终,作者通过结束占用GPU资源的进程成功解决了问题。
摘要由CSDN通过智能技术生成

报错内容:

RuntimeError: CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 2.00 GiB total capacity; 1.34 GiB already allocated; 14.76 MiB free; 1.38 GiB reserved in total by PyTorch)

查资料的过程发现另一种报错:
RuntimeError: CUDA out of memory. Tried to allocate 12.50 MiB (GPU 0; 10.92 GiB total capacity; 8.57 MiB already allocated; 9.28 GiB free; 4.68 MiB cached)

注意到括号内最后一部分的报错是不一样的。

解决

网络上提供的解决方法主要有以下几种:

(1) 减小batch size

最简单有效的办法:重新启动内核并找到最佳batch size之后减少batch size。

(2) 清除缓存

即加上:

torch.cuda.empty_cache()

或者手动清除未使用的变量:

import torch,gc
del variables
gc.collect()
torch.cuda.empty_cache()

但使用该方法错误可能依旧存在,因为Pytorch实际上并不清除内存,而是清除对变量占用的内存的引用。

(3) 不使用梯度

即(在错误代码前)加上:

with torch.no_grad():
      outputs = net(images) #该行为报错代码

在test过程中是要如此处理的,否则会使显存加倍导致out of memory (OOM)错误。但若是在训练过程中采用此策略,可能出现效果差甚至更严重的问题。

(4) 杀死其他占用GPU的进程

(Windows系统)打开cmd,输入命令查看:

nvidia-smi

查看gpu使用1
可以看到gpu被占用情况和占用的进程(以及其进程号PID),接下来杀死最后一个进程:

taskkill /PID 12132 -t -f

其中12132是要杀死的进程号。再次查看可以看到:
查看gpu使用2

(5) 正确使用GPU

可能最开始使用了:

os.environ["CUDA_VISIBLE_DEVICES"] = "0, 2, 3"

但打开任务管理器查看性能却有:
查看使用性能
查看性能,发现NVIDIA的只有GPU1,所以改成如下:

os.environ["CUDA_VISIBLE_DEVICES"] = "0"

若想直接改到CPU上运行,则可以修改如下:

os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
(6) 换显存

即购买或租用高性能显卡。

(7) Gradient accumulation + Automatic Mixed Precision

该方法请参考:RuntimeError:CUDA Error;CUDA out of memory.

(8) 其他

通过以下命令进一步查看使用的gpu的内存分配情况:

torch.cuda.memory_summary(device=None, abbreviated=False)

通过可读的内存分配summary可以查看报错原因。
另外,迭代地传递数据或者改变网络层的大小也是可以尝试的方法。

总结

我报的是第一类错误,最后使用方法(4)解决了。大家可以根据自己的情况用以上的一种或者多种方法尝试解决。

参考:

  1. RuntimeError: CUDA out of memory. Tried to allocate 82.00 MiB
  2. https://zhuanlan.zhihu.com/p/373446225
  3. 【E-02】内存不足RuntimeError: CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 2.00 GiB total capacity; 1.34 GiB already allocated; 14.76 MiB free; 1.38 GiB reserved in total by PyTorch)
  • 47
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
模型推理中出现"RuntimeError: CUDA out of memory"错误是因为在GPU上使用的显存不足。这个错误通常发生在模型的输入数据量过大或模型占用的显存资源过多时。 解决这个问题可以采用以下方法: 1. 减少批处理大小:可以通过减少每次推理时的图像批处理大小来减少内存消耗。较小的批处理大小会减少每个批处理所需的显存量。 2. 减少模型的参数量:如果模型的参数量过大,可以尝试减少参数量来缓解显存不足的问题。可以通过减少模型的深度、宽度或者使用降低维度的技术(如降低卷积核的尺寸)来减少参数量。 3. 使用更高效的模型:可以考虑使用比原始模型更加轻量级和高效的模型结构。例如,可以使用MobileNet、EfficientNet等模型来代替较重的ResNet、VGG等模型。 4. 降低精度:可以尝试将模型的参数精度从32位浮点数降低为16位浮点数,以减少显存的使用量。这通常不会对模型的性能产生显著的影响,但会大幅度减少显存的使用。 5. 使用更大的显存:如果以上方法无法解决问题,可以考虑更换具有更大显存容量的GPU设备来运行模型推理。 总之,修复"RuntimeError: CUDA out of memory"错误的主要思路是通过减少模型参数量、降低精度、优化模型结构或减少输入数据量来减少GPU显存的使用。根据具体问题情况选择适当的解决方法,以确保模型能够在GPU上正常运行。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值