问题描述:
在跑yolov11m-seg代码的时候在第127代报错停止了,错误如下。RuntimeError: CUDA error: unspecified launch failure
问题解答:
你的 yolov11m-seg
在第 128 轮训练时报错崩溃,核心错误是:
RuntimeError: CUDA error: unspecified launch failure
这是 CUDA 中最常见但 最“模糊”的错误之一,它提示 某个 CUDA kernel 执行失败,但并没有说明是哪一行代码、什么原因导致的。下面是可能原因与解决方法:
✅ 主要报错原因总结:
可能原因 | 解释 |
---|---|
1. GPU 显存爆了 | batch 内图像尺寸变化大或数据太大,导致 CUDA kernel launch 失败。通常是在 forward() 或 loss.backward() 阶段 |
2. GPU 过热或驱动不稳定 | 有时长时间运行时 GPU 突然宕掉,CUDA 报 unspecified launch failure |
3. 数据中存在异常样本 | 比如极小目标、尺寸为 0、mask 异常、多边形崩溃等 |
4. 多线程/num_workers 较大 | num_workers 太高也可能导致某一线程的数据异常、GPU访问冲突 |
5. 模型 bug | 某一层参数尺寸不匹配,但 PyTorch 没报清楚。通常修改 depth/width、添加新层可能引起 |
6. NVIDIA 驱动或 CUDA toolkit 不兼容 | 比如 PyTorch 安装的是 CUDA 12,但系统驱动较老 |
🔧 解决方法:
✅ 1. 加一句命令进行调试(推荐)
运行脚本前加入:
CUDA_LAUNCH_BLOCKING=1 python train-seg.py
这样报错会更早暴露出来,并指向具体的代码行(同步执行 CUDA 调用)。
✅ 2. 减小 batch size
哪怕之前能运行到第 127 轮,第 128 轮可能出现:
-
图片尺寸忽然变化大;
-
mask 数量暴涨;
-
数据中某个样本特别占用内存。
可以尝试把 batch size 改小,例如从 16 → 8 或 4:
model.train(batch=4)
✅ 3. 开启 debug 模式(保存异常样本)
修改 ultralytics/engine/trainer.py
中 _do_train()
内,捕获 RuntimeError
并记录 imgs
,例如:
try:
# 训练逻辑
...
except RuntimeError as e:
print("Batch 出错,保存样本。")
torchvision.utils.save_image(imgs, 'error_batch.png') # 保存当前 batch 图像
raise e
✅ 4. 数据集检查
可能你的某一张图有:
-
mask 全是空的;
-
mask 顶点错误;
-
图像尺寸非常小或不标准;
-
标签维度不对。
建议你手动检查 epoch 128 使用的数据样本,或用脚本遍历数据验证 mask 多边形是否合理。
✅ 5. 降低 num_workers
在 train-seg.py
添加:
workers=0
或者命令行加:
--workers 0
✅ 6. 检查 torch + cuda 驱动版本是否匹配
查看当前版本:
nvcc --version
nvidia-smi
确保你的 torch
, torchvision
, cuda toolkit
与显卡驱动匹配,否则建议更新。
✅ 总结建议
操作 | 建议 |
---|---|
调试优先 | 用 CUDA_LAUNCH_BLOCKING=1 运行,定位出错代码行 |
batch size | 改为更小,例如 2 |
workers | 设为 0 |
检查数据 | 是否某张图像 mask 多边形越界、空 label |
GPU状态 | 查看 nvidia-smi 是否有显存爆满 |