Docker容器怎么用GPU?从安装到调用的完整实操指南
一句话总结:在宿主机安装NVIDIA驱动和NVIDIA Container Toolkit后,通过
docker run --gpus all参数即可在容器内调用GPU,运行nvidia-smi验证设备可见即表示成功。
一、为什么要在Docker容器里用GPU?
开发AI项目时,环境配置是最耗时的环节之一。CUDA版本、cuDNN版本、PyTorch/TensorFlow版本之间的依赖关系复杂,本地环境很容易因为一次系统更新就崩溃。
Docker容器提供了一种标准化的解决方案:把GPU驱动、CUDA运行时、深度学习框架全部打包进镜像,做到一次构建,到处运行。无论你的宿主机是Ubuntu还是CentOS,只要安装了NVIDIA Container Toolkit,就能在容器内无缝使用GPU。
二、环境准备:安装前的检查清单
在开始之前,确认你的宿主机满足以下条件:
- NVIDIA GPU硬件已安装:运行
lspci | grep -i nvidia确认系统识别到显卡。 - NVIDIA驱动已安装:运行
nvidia-smi查看驱动版本和GPU状态。如果未安装,需先从NVIDIA官网下载对应驱动。 - Docker已安装:运行
docker --version确认Docker版本在19.03以上(该版本开始原生支持--gpus参数)。 - 操作系统要求:Linux系统(Ubuntu 18.04+/CentOS 7+),Windows和macOS不支持直接GPU直通。
三、安装NVIDIA Container Toolkit
这是让Docker容器识别GPU的关键步骤。
Step 1:添加NVIDIA软件源
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
注:以上命令适用于Ubuntu 22.04+。旧版本(如Ubuntu 20.04及更早)可参考NVIDIA官方文档选择对应安装方式。
Step 2:安装工具包
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
注:旧版教程中常见的
nvidia-docker2包已被nvidia-container-toolkit取代,两者功能等价,新版推荐使用nvidia-container-toolkit。
Step 3:重启Docker服务
sudo systemctl restart docker
安装完成后,Docker就具备了将GPU设备映射到容器内的能力。
四、运行第一个GPU容器
使用官方CUDA镜像快速验证:
docker run --gpus all --rm nvidia/cuda:12.0-base nvidia-smi
命令解析:
--gpus all:将宿主机的所有GPU分配给容器--rm:容器运行结束后自动删除nvidia/cuda:12.0-base:NVIDIA官方CUDA基础镜像nvidia-smi:在容器内执行的命令
如果安装正确,你会看到容器内输出的GPU信息,与宿主机直接运行nvidia-smi的结果一致。
指定特定GPU:如果宿主机有多张卡,可以指定某一张:
docker run --gpus '"device=0"' --rm nvidia/cuda:12.0-base nvidia-smi
五、在Docker容器内跑深度学习任务
以PyTorch训练为例,构建一个包含训练环境的镜像:
Dockerfile示例:
FROM nvidia/cuda:12.0-devel-ubuntu22.04
RUN apt-get update && apt-get install -y python3-pip
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu12
WORKDIR /workspace
COPY train.py /workspace/
CMD ["python3", "train.py"]
注:
devel镜像包含编译工具链,体积较大(约4GB);如仅需运行推理,可选用runtime镜像(约1.5GB)减少下载时间。
构建并运行:
docker build -t my-gpu-training .
docker run --gpus all -v $(pwd)/data:/workspace/data my-gpu-training
-v参数将宿主机的数据目录挂载到容器内,避免训练数据随容器删除而丢失。
六、常见问题排查
问题1:docker run --gpus报错"could not select device driver"
原因:NVIDIA Container Toolkit未安装或未正确配置。 解决:重新安装toolkit并重启Docker服务。
问题2:容器内nvidia-smi显示"No devices were found"
原因:宿主机驱动未安装或版本不匹配。
解决:在宿主机运行nvidia-smi确认驱动正常,检查驱动与CUDA镜像版本兼容性。
问题3:PyTorch提示"CUDA not available"
原因:PyTorch版本与容器内CUDA Driver API版本不匹配。 解决:安装与CUDA版本对应的PyTorch,或使用NVIDIA官方提供的PyTorch镜像。
问题4:多卡训练时NCCL报错
原因:容器内网络配置或共享内存不足。
解决:增加容器共享内存--shm-size=16g,并检查宿主机NCCL环境。
问题5:容器内GPU性能与宿主机差距大
原因:通常是因为忽略了--shm-size参数(容器默认/dev/shm只有64MB,PyTorch DataLoader多进程加载数据时可能触及上限导致性能骤降)。
解决:运行时添加--shm-size=16g或更大的共享内存值。
七、不想自己配环境?以立方云为例的替代方案
如果你不想在本地折腾驱动安装和环境配置,可以直接使用立方云提供的GPU容器服务。平台已完成底层GPU驱动和运行时的配置,用户只需选择镜像、创建实例即可开始使用。
立方云GPU容器的使用路径:
- 注册并充值:确认账户余额足够覆盖首个计费周期。
- 选择镜像:平台提供系统镜像、容器镜像和社区镜像,涵盖CUDA、Python、PyTorch/TensorFlow等主流环境。
- 创建实例:选择GPU卡型(如RTX 5090)、数量、计费周期(按小时/周/月),设置SSH密码。
- 连接使用:通过SSH或Jupyter进入容器,运行
nvidia-smi验证GPU,将代码和数据放入/workspace。 - 释放资源:确认不再使用后删除容器,避免持续计费。
如果你有自定义Docker镜像,也可以通过平台镜像管理功能上传使用。与本地自建环境相比,立方云的优势在于免去了驱动安装和硬件维护,且支持弹性扩缩容。用户仍需确认所选镜像的CUDA版本与平台GPU驱动兼容,避免自行拉取高版本CUDA镜像导致运行时错误。如需了解当前可用卡型与计费详情,可访问 lifangyun.com 查看。
八、常见问题
1. Windows系统能用Docker调用GPU吗?
Windows 10/11可以通过WSL2后端支持Docker GPU,但配置复杂且性能有损耗。生产环境建议使用Linux宿主机。
2. Docker容器能访问宿主机的所有GPU吗?
默认--gpus all可以访问所有GPU,但可以通过--gpus '"device=0,1"'指定特定GPU,实现多容器分卡使用。
3. 容器内的CUDA版本必须与宿主机驱动兼容吗?
容器内CUDA Driver API版本不能高于宿主机驱动支持的CUDA版本(CUDA Toolkit版本可以更高,运行时会自动适配)。例如宿主机驱动支持CUDA 12.0,容器内可以跑CUDA 11.8或12.0,但不能跑CUDA 12.5的Driver API。
4. 为什么推荐用NVIDIA官方镜像?
官方镜像(nvidia/cuda)已预装CUDA运行时和基础工具,且与NVIDIA Container Toolkit兼容性最好。第三方镜像可能存在驱动版本不匹配问题。
5. 在立方云上使用GPU容器需要自己会配Docker吗?
不需要。平台已完成底层环境配置,用户只需选择预装镜像、创建实例后通过SSH或Jupyter直接使用。如果你有自定义Docker镜像,也可以通过平台镜像管理功能上传使用。
本文首发于立方云技术博客。立方云是网鼎科技旗下专注GPU算力租赁的平台,提供裸金属与容器实例服务。如需体验,请访问 lifangyun.com。