常规环境可访问GPU但Docker容器无法识别的问题求助
我基于以下Dockerfile构建镜像:
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt update --fix-missing && \ apt install python3-pip -y && \ ln -sf /usr/bin/python3 /usr/bin/python && \ ln -sf /usr/bin/pip3 /usr/bin/pip RUN python -m pip install --upgrade pip RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 WORKDIR /test COPY ./docker_entry_point.sh . # entry_point just launching bash ENTRYPOINT ["./docker_entry_point.sh"]
尝试用两种命令启动容器:
docker run -it --rm --privileged img_name:latest docker run -it --rm --gpus all img_name:latest
但两种方式下执行torch.cuda.device_count()都返回0,无法检测到GPU。容器内执行nvidia-smi提示:
bash: nvidia-smi: command not found
nvcc --version可正常返回:
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Wed_Sep_21_10:33:58_PDT_2022 Cuda compilation tools, release 11.8, V11.8.89 Build cuda_11.8.r11.8/compiler.31833905_0
执行ls -l /dev/nvidia*提示:
ls: cannot access '/dev/nvidia*': No such file or directory
同一台机器的conda环境中安装了:
torch 2.0.0+cu118 torchaudio 2.0.1+cu118 torchvision 0.15.1+cu118
该环境可正常访问GPU,请问哪里操作出错了?
核心原因
你使用的nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04是CUDA开发镜像,仅包含CUDA编译器(nvcc)等开发工具,未预装NVIDIA驱动的用户态组件(如nvidia-smi);同时容器启动时GPU设备未正确映射到容器内部,导致/dev/nvidia*设备文件不存在,PyTorch无法检测到GPU。
解决步骤
更换基础镜像
改用包含NVIDIA驱动运行时的镜像,比如nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04。runtime镜像预装了nvidia-smi等驱动组件,能配合NVIDIA Docker工具链正确加载GPU设备。确认NVIDIA Docker工具链正常
先在宿主机执行nvidia-smi验证驱动正常,再检查nvidia-container-toolkit是否安装正确:nvidia-container-cli info若toolkit未安装,需按官方指引完成对应版本的安装。
正确启动容器
必须使用--gpus all参数启动容器,--privileged无法替代GPU设备映射,正确命令:docker run -it --rm --gpus all img_name:latest验证GPU状态
容器启动后先执行nvidia-smi确认GPU可被识别,再运行torch.cuda.device_count()验证PyTorch的GPU检测功能。
额外优化建议
如果需要保留开发环境(如nvcc),可以继续使用devel镜像,但需手动安装与宿主机版本匹配的NVIDIA驱动运行时组件:
RUN apt-get install -y nvidia-driver-525 # 版本需与宿主机nvidia-smi显示的驱动版本一致
不过更推荐直接使用runtime镜像,能避免驱动版本冲突问题。
内容的提问来源于stack exchange,提问作者Carlo

