目标检测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收敛极度快速,但是有时候可能不太适合比如现在),测试后发现问题解决了,之后换了几个其他主干网络也没出现该问题了。

你可能感兴趣的:(深度学习,#,目标检测,目标检测,pytorch,深度学习)