训练自定义数据集YOLOv5报错:无有效cuDNN卷积运行算法
报错触发原因
- 显存不足:当前命令设置输入分辨率640、batch size为16,若显卡显存≤6G,剩余显存无法支撑cuDNN完成卷积算法预校验与运算,就会抛出该错误,是该报错最高发的诱因。
- 版本适配错位:PyTorch 1.11官方预编译版本最高适配CUDA 11.3,本地安装的CUDA 11.7与当前PyTorch版本不匹配,会导致cuDNN接口调用异常。
- 数据/配置冲突:YOLOv5默认开启
cudnn.benchmark模式,启动时会遍历所有可用卷积算法筛选最优执行方案,若自定义数据集中存在损坏、长宽比极端异常的图片,或自动锚框计算环节出错,会导致算法遍历流程中断触发报错。
解决方法(按优先级从高到低尝试)
- 第一步:排查显存问题
将训练命令中的--batch 16下调为--batch 4甚至--batch 2,优先跑通训练流程验证是否为显存导致。如果调低batch后可以正常启动,后续可根据显卡显存余量逐步上调batch数值,也可追加--cache ram参数将数据缓存到内存,降低显存占用。
调整后的参考命令:python train.py --img 640 --batch 4 --epochs 3 --data D:\custom\data.yaml --weights yolov5s.pt - 第二步:修复版本适配问题
二选一调整环境即可:- 将PyTorch升级到1.13及以上版本,匹配本地CUDA 11.7版本
- 将本地CUDA版本降级到11.3,匹配当前安装的PyTorch 1.11版本
保证PyTorch编译时依赖的CUDA版本和本地系统安装的CUDA大版本一致,即可解决接口不匹配问题。
- 第三步:排查数据集与配置问题
打开YOLOv5代码目录下的utils/torch_utils.py文件,找到cudnn.benchmark = True配置项,修改为cudnn.benchmark = False,同时在训练命令中追加--noautoanchor参数先跑1个epoch。如果可以正常启动,说明自定义数据集中存在损坏、格式异常的图片,逐张排查剔除异常文件后再恢复默认配置训练即可。 - 兜底临时方案
如果以上操作都无法解决,可以在训练脚本train.py的最开头添加两行代码临时禁用cuDNN:
注意:该方案会导致训练速度下降30%左右,仅适合临时验证流程使用,不建议正式长时间训练时开启。import torch torch.backends.cudnn.enabled = False
内容的提问来源于stack exchange,提问作者Ainoi
相关产品推荐
相关产品推荐

