【总结】RuntimeError: CUDA out of memory 问题解决

当PyTorch训练中遇到显存不足的问题,可以通过调整数据加载器的num_workers参数,减小batch_size,指定使用特定GPU,改变输入shape,使用更小的网络结构,启用多卡训练或开启FP16优化来缓解。此外,检查和处理显存泄露问题也是重要措施。
摘要由CSDN通过智能技术生成

第一种情况

报错后面跟了想要占用多少显存但是不够这样的字眼
在这里插入图片描述
解决办法:

  • 修改数据加载函数(根据代码有所不同)中的num_workers 参数后解决。num_workers参数是加载数据的线程数目,有可能电脑的线程数不满足所配置的参数。
    train_loader = DataLoader(train, batch_size=batch_size, shuffle=True, 	num_workers=8, pin_memory=True)
    # 比如,电脑是8线程,参数调为8就不合适,可相应降低。
    # 但num_worker越小,训练越慢,可权衡后调整。
    # 因此,可以将num_workers改为1或者小于8的数值
    
  • 改小batchsize,batchsize砍半可以差不多省掉一半的显存
  • 推理阶段加上with torch.no_grad(),这个可以将修饰的代码段不要梯度,可以省掉很多显存在这里插入图片描述
  • 更改显卡,这里大多指在服务器上运行,没有制定显卡,都默认使用第一张,或者多人使用,产生的不足。
    • 状态描述
      在操作系统输入如下,查一下memory现在的状态。

      nvidia-smi
      

      发现GPU-0有一个进程正在执行导致1GB剩余都不够。因此可以选择使用GPU-1执行。

    • 解决办法

      import os  
      os.environ["CUDA_VISIBLE_DEVICES"] = '1' #使用第二张显卡 
      
  • 改小input的shape,例如(224,224)->(112,112)这样可以省掉一半的显存
  • 换小的网络结构
  • 用多卡训练,torch可以用model = nn.DataParallel(model)启用多卡训练,终端用CUDA_VISIBLE_DEVICES=0,1 python3 train.py启动即可,这样会将batchsize等份的分给n张卡,这里的示例是2张卡,这样相当于减小了单卡的batchsize,就不会OOM了。
    开启FP16,就是浮点数截断,可以省一大部分显存

第二种情况

直接报错OOM没有说申请多少显存而不够的字眼。请添加图片描述
这个情况比较特殊,有多种原因:

原因一:linux下某个用户存在了显存泄露,如果是自己的账号有显存泄露,执行fuser -v /dev/nvidia*然后将提示的进程kill掉即可,如果是其他用户显存泄露,需要管理员权限,执行以下命令,执行前最好跟所有用户通知下,不然再跑的任务会被杀了。但是出现这样显存泄露的情况,所有的用户都会用不了显卡,所以应该不会有任务在跑(猜测):

sudo fuser -v /dev/nvidia* |awk '{for(i=1;i<=NF;i++)print "kill -9 " $i;}' | sudo sh

原因二:网上看到的,据说模型加载的参数和自己pytorch的版本不匹配就会报错这个,例如你的pretrain使用torch1.1.0训的,你用torch1.2.0的代码加载这个参数就有可能报错。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模型推理中出现"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上正常运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值