目标检测pytorch报错:RuntimeError: CUDA error: device-side assert triggered

  • 我的任务:目标检测,主干网络采用各类经典轻量化网络如mobilenet、shufflenet、ghostnet,neck部分采用修改后的yolox neck,在训练前面几个epoch时会突然报如下错误:
# 报错如下
RuntimeError: CUDA error: device-side assert triggered
block: [0,0,0], thread: [11,0,0] Assertion `input_val >= zero && input_val <= one` failed
  • 首先,得到更准确的错误信息:
    在代码入口添加如下,报错时可以更加精准找到错误位置
import os
os.environ['CUDA_LAUNCH_BLOCKING'] = '1'
  • 根据错误信息,定位到代码片段发现出现nan,回溯往上发现,从某一轮训练开始,网络的输出即包含有nan值,由于我采用的是冻结训练,因此问题定位到neck位置(neck部分出现nan也是由于错误的损失修正带来的问题)。
  • 这时候只能猜了,由于冻结主干网络,主干网络的参数可能不适配该数据集。又由于有一些bad sample或者outlier sample的出现,加之采用了simOTA导致回归的xywh损失可能会变化剧烈,从而导致学习器学习波动较大?由于主干网络又不肯改变,导致neck部分极端变化,从而出现问题,因此我直接进行解冻训练,让主干网络参与训练,然而依旧出现nan问题。
  • 看到网上有人说batch_size太大爆显存,但是监控的显存一直处于安全范围,尝试降低为原先的1/2,1/4也还是会有nan问题。
  • 猜测是学习率太大?但是训练集和验证集的损失是实实在在降低并且未出现过拟合现象。但还是将学习率降低为原来的1/10重新测试,然而依旧出现nan问题。
  • 猜测是学习器不合适,我输出了主干网络和neck部分每轮的最大值,发现一直在增大,到100多的时候开始nan,因此我替换adam为sgd(adam收敛极度快速,但是有时候可能不太适合比如现在),测试后发现问题解决了,之后换了几个其他主干网络也没出现该问题了。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值