You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Colab训练YOLOv5触发CUDA device assert triggered错误求助

YOLOv5 训练进入验证阶段触发CUDA device assert错误解决方案

问题根因

该错误由验证集标注文件存在非法值触发,训练阶段的逻辑对异常值容错性更高所以不会报错,进入验证阶段后执行坐标转换、指标计算逻辑时触发了张量索引越界。

具体排查步骤

  • 优先排查验证集标注的类别ID:
    确认所有txt标注文件中的第一个值(类别ID)符合两个要求:1. 为非负整数;2. 最大值不超过数据集yaml配置中nc(类别总数)减1,比如你配置了5个类别,ID的合法范围是0~4,出现5、-1等都会触发越界。
  • 其次排查验证集标注的坐标值:
    YOLO要求的归一化坐标(x_center、y_center、width、height)必须全部落在0~1区间内,标注超出图片边界、标注转换计算错误、标注文件被损坏都会产生小于0或大于1的非法值。
  • 快速定位异常文件的方法:
    在Colab训练代码的最开头添加如下代码开启CUDA同步报错,再次运行即可直接输出触发错误的具体图片/标注文件路径:
    import os
    os.environ['CUDA_LAUNCH_BLOCKING'] = "1"
    
  • 批量清理异常标注的参考代码:
    import os
    # 替换为你的验证集标注文件夹路径
    label_dir = "./datasets/val/labels"
    # 替换为你的数据集类别总数
    num_classes = 5
    
    for label_file in os.listdir(label_dir):
        if not label_file.endswith(".txt"):
            continue
        file_path = os.path.join(label_dir, label_file)
        with open(file_path, "r") as f:
            lines = f.readlines()
        for line_num, line in enumerate(lines):
            line = line.strip()
            if not line:
                continue
            vals = list(map(float, line.split()))
            if len(vals) != 5:
                print(f"异常文件(字段数错误):{file_path} 第{line_num+1}行")
                continue
            cls_id, x, y, w, h = vals
            if cls_id <0 or cls_id >= num_classes or int(cls_id)!=cls_id:
                print(f"异常文件(类别ID非法):{file_path} 第{line_num+1}行,ID值:{cls_id}")
            if x<0 or x>1 or y<0 or y>1 or w<0 or w>1 or h<0 or h>1:
                print(f"异常文件(坐标超出范围):{file_path} 第{line_num+1}行,坐标值:{x} {y} {w} {h}")
    

临时规避方案

如果暂时不需要验证结果,可以在训练命令中添加--val 0参数关闭验证阶段,可正常完成训练流程。

内容的提问来源于stack exchange,提问作者MICHAEL AARON SY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:36:07