WSL2+Win10+Ubuntu环境下CUDA Docker容器无法识别GPU求助
问题描述
- 环境:WSL2 + Windows10 + Ubuntu20.04
- 核心现象:所有带CUDA的Docker容器无法识别GPU,执行测试命令:
报错内容:docker run --gpus=all --rm nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmarkError: only 0 Devices available, 1 requested. Exiting. - 已确认的排除项:
- 主机端
nvcc --version和nvidia-smi均能正常运行,GPU硬件本身无问题 - 启动普通Ubuntu容器后,执行
nvidia-smi -L可正常识别GPU,说明容器与主机的GPU通信链路正常,问题仅局限于CUDA相关容器 - 已多次尝试重装NVIDIA驱动、CUDA Toolkit、NVIDIA Container Toolkit的不同版本组合,问题未解决
- 主机端
排查与解决方案
1. 严格匹配CUDA版本兼容性
WSL2中,容器内的CUDA版本必须与主机Windows端的CUDA Runtime版本(nvidia-smi右上角标注的版本)兼容,且不能高于该版本:
- 先在主机WSL2终端执行
nvidia-smi,记录右上角的CUDA Version(比如11.8) - 更换测试镜像为与主机版本匹配的CUDA样本镜像,例如主机CUDA版本为11.7时,使用:
docker run --gpus=all --rm nvcr.io/nvidia/k8s/cuda-sample:nbody-cuda11.7 nbody -gpu -benchmark - 避免使用未指定CUDA版本的镜像,这类镜像默认可能使用最新版CUDA,容易出现版本不匹配
2. 检查WSL2内核NVIDIA模块状态
WSL2内核需正确加载NVIDIA相关模块:
- 在WSL2终端执行以下命令,确认模块存在且版本与主机驱动匹配:
modinfo nvidia | grep version - 若无输出,手动加载模块:
sudo modprobe nvidia sudo modprobe nvidia-uvm - 若加载失败,更新WSL2内核:打开Windows终端执行
wsl --update,完成后重启WSL2
3. 验证NVIDIA Container Toolkit配置
确保Docker daemon正确配置NVIDIA runtime:
- 检查
/etc/docker/daemon.json文件内容,需包含:{ "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } }, "default-runtime": "nvidia" } - 若配置错误或缺失,重新生成配置并重启Docker:
sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker - 验证Docker是否识别NVIDIA runtime:
输出需包含docker info | grep -i nvidiaRuntimes: nvidia runc字样
4. 检查环境变量干扰
确保主机和容器的CUDA环境变量未被错误设置:
- 先在WSL2主机终端执行
echo $CUDA_VISIBLE_DEVICES,若输出非空且不是0或all,执行unset CUDA_VISIBLE_DEVICES清除变量 - 手动指定容器环境变量测试:
docker run --gpus=all --rm -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
5. 测试基础CUDA容器
用最简CUDA镜像排查是否为样本镜像问题:
- 运行基础CUDA容器并执行核心测试:
若# 验证nvidia-smi docker run --gpus=all --rm nvidia/cuda:11.8-base-ubuntu20.04 nvidia-smi # 验证nvcc版本 docker run --gpus=all --rm nvidia/cuda:11.8-base-ubuntu20.04 nvcc --version # 执行CUDA设备查询 docker run --gpus=all --rm nvidia/cuda:11.8-base-ubuntu20.04 /usr/local/cuda/extras/demo_suite/deviceQuerydeviceQuery输出显示GPU信息(包含Result = PASS),说明基础CUDA环境正常,问题出在nbody样本镜像,尝试更换其他版本的nbody镜像或自行编译测试
内容的提问来源于stack exchange,提问作者P_Novotny
相关产品推荐
相关产品推荐

