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
相关产品推荐
相关产品推荐

