【pytorch】mmdetection 做eval / test时弹出OOM(Out of Memory / CUDA out of memory)的解决过程记录

问题描述:

在用cascade RCNN进行训练的过程中,是不会发生OOM的,但是在做eval的时候(数据没有shuffle),每次做到第6批次数据的时候就会出现OOM如下图所示:
请添加图片描述

解决思路总结:

解决思路1: 调低batch_size
解决思路2:每次训练完清空cuda缓存
解决思路3:降低做预测时模型筛选出的预测框的数量
解决思路4:做eval时,把预测框的处理程序放在cpu和内存中


解决思路1:调低batch_size

调低batch_size到1的时候并不能解决这个问题,只会在训练的时候,显存占用稍微低一些。

结果:

还是解决不了问题

做训练的时候会发现一个问题,随着训练过程的进行,训练占用的显存越来越多。

分析:

因此想,会不会在昨晚训练之后清空一下cuda的缓存,做eval就不会超出显存OOM了? 下一个解决该问题的思路是在,清空cuda缓存上。


解决思路2:每次训练完清空cuda的缓存

清空cuda缓存可以用torch.cuda.empty_cache(),但是该代码加在哪里,也是一个问题。

可以看到报错提示红框的部分,中文翻译过来就是“训练完一个epoch之后要做的事情”:
在这里插入图片描述
pytorch有hook机制,并且mmdetection封装了许多API,在调用函数建立模型的时候方便,但是需要寻找对应代码去修改比较麻烦。

找"after_train_epoch"函数比较麻烦,但是要找到调用它的这行代码比较简单。于是在它调用eval函数(after_train_epoch)之前,使用torch.cuda.empty_cache(),如下图。

在这里插入图片描述
epoch_base_runner.py是在前一张图中红框错误提示的位置找到的。

结果:

训练过程中内存增加的问题解决了,但是做eval的时候还是会出现OOM。后面看了一些文章,有文章提到:

如果做eval预测框过多,那么可能会发生OOM


解决思路3:降低做预测时筛选出的预测框数量

于是我在模型配置文件中降低了做eval时,模型把预测框筛选出来的数量。

把max_per_img的数量从1000调低到500
在这里插入图片描述

结果:

问题是解决了,但是在训练更大的模型的时候,内存也是够的,但只是做eval的时候会发生问题。

分析:

在训练更大的模型时,为了获得训练结果数据,每个epoch,都需要做eval,但是再进一步调低max_per_img的数量,可能会导致模型性能下降。


解决思路4:把做eval的预测框处理放在CPU和内存里

相较于前三种解决方法,第四种解决思路是从另外一个方向去入手。把从下图看,内存溢出的位置是在pytorch做数据处理的部分,所以想,如果把该部分数据放到CPU处理,处理完再放回GPU做数据的return,究竟能不能解决问题?

红框中相应路径的文件对应代码运行时OOM。
在这里插入图片描述也有可能是这样的路径,按照实际你显示的错误为准:
在这里插入图片描述
这个路径:“D:\mmdetection-2.20.0\mmdet\models\roi_heads\mask_heads\fcn_mask_head.py”

找到上图红框这个路径的这个文件,打开修改该部分如下图所示,注释的部分是原来文件中的代码:
在这里插入图片描述

结果:

顺利解决了问题,在做eval的过程中GPU显存没有溢出、没有大幅波动。但是处理大分辨率的图片时,速度会很慢。而且要注意内存、虚拟内存占用是否会大幅上升。如果内存不够,可以适当调大系统虚拟内存。


windows10 调大系统虚拟内存的步骤:

在这里插入图片描述
在这里插入图片描述
我硬盘够大,虚拟内存最大值调到了将近100GB
在这里插入图片描述
调完,按设置,按确定就可以了。

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: cuda out of memory pytorch 是指在使用 PyTorch 进行深度学习模型训练时,由于 GPU 显存不足而导致程序崩溃的错误。这通常是因为模型或数据集过大,或者 GPU 显存设置不当所致。解决方法包括减小模型规模、减小 batch size、使用更大的 GPU 显存、使用分布式训练等。 ### 回答2: 在使用PyTorch训练深度神经网络时,可能会遇到内存不足(Out of memory)的问题,特别是在使用CUDA时。这个问题通常是因为创建的模型太大或批处理大小太大而导致的。下面介绍一些解决这个问题的方法。 第一种方法是降低批处理大小。减小批处理大小会减少需要存储在GPU内存中的数据量,从而减少内存使用量。但是,减小批处理大小也可能会影响训练精度,因为小的批处理大小可能会使模型难以收敛。 第二种方法是减小模型的大小。可以通过减小神经网络的深度和宽度来减小模型的大小。可以使用PyTorch的模型压缩工具来减小模型的大小,例如使用剪枝、量化、分层等技术。 第三种方法是使用更大的GPU。如果你的GPU内存不够大,可以考虑购买更大的GPU或使用多个GPU并行训练模型。 第四种方法是使用分布式训练。分布式训练可以将模型和数据分布到多个GPU或机器上进行训练,从而有效降低单个GPU内存的使用量。可以使用PyTorch内置的分布式训练框架或第三方库进行分布式训练。 在使用上述方法解决内存不足问题时,还要注意以下几点: 1. 避免在模型输入和输阶段使用过大的张量,可以通过使用更小的图像分辨率或裁剪图像来减小输入张量的大小。 2. 在训练过程中及时释放无用的张量,及时进行GPU内存清理。 3. 可以使用PyTorch的自动混合精度训练技术来减小内存占用。 总之,在使用PyTorch训练深度神经网络时会遇到内存不足的问题,但是可以通过一些方法来解决这个问题。在解决问题时需要注意避免产生新问题,例如降低批处理大小可能会影响精度等。同时,还需要加强GPU内存管理,及时释放无用的张量,确保更高效的训练。 ### 回答3: 在使用PyTorch进行深度学习模型训练时,我们可能会遇到CUDA out of memory的错误,这表示显存不足,无法完成训练。这种情况通常有以下几种原因和解决方法。 1. 模型过大:越复杂的模型需要的显存越多,如果显存不够,就需要减小模型的复杂度或者采取分批训练的方法。 2. 批次大小过大:每次训练的批次大小也会影响显存的使用情况。减小训练批次的大小可以减少显存的使用量。 3. 数据处理问题:如果数据处理不当,也会增加显存的使用量。可以尝试使用数据增强技术、压缩数据、使用更小的图像分辨率等方式减少数据量。 4. 改变GPU的batch_size:默认情况下PyTorch会将整个batch直接传输到显存中进行计算。可以尝试设置小一点的batch_size(例如32、16),并使用torch.utils.data.Dataloader加载数据。 5. 尝试使用梯度累积:即将多次梯度累加在一起,再一次性进行梯度更新。这样可以减少显存压力,但会增加训练时间。 6. 清理不必要的变量:在训练过程中,可能会产生不必要的中间变量,通过del语句可以手动清理这些变量,从而释放显存。 总之,遇到CUDA out of memory的错误,需要先检查显存使用情况,找具体原因,并采取相应的解决方法。同时,可以考虑使用更高的显存或者更强大的GPU来缓解该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值