YOLOv7训练时CUDA unknown error问题求助(WSL环境)
解决WSL Ubuntu中YOLOv7训练时的CUDA unknown error问题
问题概述
在Windows 10 WSL的Ubuntu系统中,按NVIDIA WSL CUDA指南配置环境后,训练YOLOv7自定义模型时出现RuntimeError: CUDA error: unknown error。
环境信息
- 硬件:16GB内存、RTX 3070
- Python版本:3.8.10
- 驱动版本:517.48
- PyTorch版本:1.10.0a0+3fd9dcf,torchvision版本:0.11.0a0
- CUDA版本:11.4
- Docker启动命令:
sudo docker run --name yolov7 --gpus all -it -v "/mnt/c/coco/":"/coco/" -v "/mnt/c/yolov7/":"/yolov7/" --shm-size=16gb nvcr.io/nvidia/pytorch:21.08-py3
已尝试方案
- 重启电脑
- 安装nvidia-modprobe
检测情况
Torch检测CUDA正常:
>>> import torch >>> print(torch.cuda.current_device()) 0 >>> torch.rand(1) tensor([0.3052])
nvidia-smi显示GPU状态正常,但执行以下训练命令时报错:
python train.py --workers 1 --device 0 --batch-size 2 --data data/coco.yaml --img-size 1920 --cfg cfg/training/yolov7.yaml --weights 'yolov7_training.pt' --name yolov7 --hyp data/hyp.scratch.custom.yaml
报错堆栈
Traceback (most recent call last): File "train.py", line 616, in <module> train(hyp, opt, device, tb_writer) File "train.py", line 361, in train pred = model(imgs) # forward File "/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1056, in _call_impl return forward_call(*input, **kwargs) File "/yolov7/models/yolo.py", line 599, in forward return self.forward_once(x, profile) # single-scale inference, train File "/yolov7/models/yolo.py", line 625, in forward_once x = m(x) # run File "/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1056, in _call_impl return forward_call(*input, **kwargs) File "/yolov7/models/common.py", line 108, in forward return self.act(self.bn(self.conv(x))) File "/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1056, in _call_impl return forward_call(*input, **kwargs) File "/opt/conda/lib/python3.8/site-packages/torch/nn/modules/activation.py", line 395, in forward return F.silu(input, inplace=self.inplace) File "/opt/conda/lib/python3.8/site-packages/torch/nn/functional.py", line 1901, in silu return torch._C._nn.silu(input) RuntimeError: CUDA error: unknown error CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
解决方案
1. 启用CUDA同步调试定位真实错误
添加环境变量强制CUDA同步执行,获取精准错误堆栈:
CUDA_LAUNCH_BLOCKING=1 python train.py --workers 1 --device 0 --batch-size 2 --data data/coco.yaml --img-size 1920 --cfg cfg/training/yolov7.yaml --weights 'yolov7_training.pt' --name yolov7 --hyp data/hyp.scratch.custom.yaml
执行后会输出更准确的错误位置,便于排查核心问题。
2. 降低图像尺寸与批次大小
当前img-size=1920和batch-size=2可能导致显存/内存溢出(WSL环境下显存分配存在限制),先调整参数测试:
python train.py --workers 1 --device 0 --batch-size 1 --data data/coco.yaml --img-size 1280 --cfg cfg/training/yolov7.yaml --weights 'yolov7_training.pt' --name yolov7 --hyp data/hyp.scratch.custom.yaml
若能正常运行,再逐步调回合适的尺寸和批次。
3. 更新PyTorch至稳定版
当前使用的PyTorch预览版可能存在WSL兼容性问题,更换为与CUDA 11.4兼容的稳定版:
pip uninstall torch torchvision -y pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
(注:CUDA 11.4可兼容CUDA 11.3的PyTorch包,若需严格匹配CUDA11.4,可选择对应版本)
4. 配置WSL2显存分配
在Windows用户目录下创建或编辑.wslconfig文件,限制WSL显存占用:
[wsl2] memory=12GB gpuMemory=6GB
保存后重启WSL:wsl --shutdown,再重新启动Ubuntu。
5. 验证容器内CUDA兼容性
执行以下命令检查容器内CUDA与驱动的匹配情况:
nvidia-smi nvcc --version
确保驱动版本(517.48)支持当前CUDA版本(11.4)。
内容的提问来源于stack exchange,提问作者Austin Ulfers
相关产品推荐
相关产品推荐

