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

PyTorch训练GPU报错但CPU正常问题排查求助

YOLOv5 CUDA训练触发device-side assert但CPU正常的排查方案

核心原因解释

CPU与CUDA的执行逻辑存在差异:CPU训练时会对非法数据做隐式容错(比如截断超出范围的坐标、忽略无效标签),而CUDA Kernel为了性能没有这类容错机制,一旦遇到非法数据(比如标签越界、格式错误)就会直接触发断言错误。图像增强会放大原始标签的问题,所以会更快触发报错。

具体排查步骤

1. 检查标签合法性

  • 确认YOLO格式标签(class_id, x_center, y_center, width, height)的每个字段都符合要求:
    • class_id必须是整数,且取值范围在0到nc-1之间(nc是数据集yaml文件里的类别数)
    • x_center/y_center/width/height必须是0到1之间的浮点数,不能出现负数、大于1的值,也不能为0
  • 排查是否存在空标签文件(仅含换行无内容),或者标签行数与图片中实际目标数量不匹配的情况
  • 检查是否有目标的宽高为0的异常标签

2. 开启CUDA同步调试获取准确堆栈

设置环境变量强制CUDA同步执行,这样能得到精准的报错位置:

  • Linux/macOS:执行 export CUDA_LAUNCH_BLOCKING=1 后再启动训练
  • Windows:执行 set CUDA_LAUNCH_BLOCKING=1 后再启动训练
    同步后报错会指向具体的代码行,帮助定位是哪个环节出了问题

3. 定位异常样本

  • 在YOLOv5的dataset.py中添加临时打印代码,输出每个batch的图片路径和对应标签内容,触发报错时即可锁定异常样本
  • 运行 python utils/autoanchor.py --data your_dataset.yaml 检查锚框与新数据的适配性,锚框严重不匹配也可能导致损失计算时触发CUDA错误

4. 验证图像增强的影响

暂时关闭所有图像增强选项重新训练,如果不再报错,说明原始标签存在边界值问题,增强后被放大导致CUDA断言触发;此时需要修正原始标签后再启用增强。

内容的提问来源于stack exchange,提问作者William Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:52:48