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。

二、环境准备:安装前的检查清单

在开始之前,确认你的宿主机满足以下条件:

  1. NVIDIA GPU硬件已安装:运行lspci | grep -i nvidia确认系统识别到显卡。
  2. NVIDIA驱动已安装:运行nvidia-smi查看驱动版本和GPU状态。如果未安装,需先从NVIDIA官网下载对应驱动。
  3. Docker已安装:运行docker --version确认Docker版本在19.03以上(该版本开始原生支持--gpus参数)。
  4. 操作系统要求: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容器的使用路径:

  1. 注册并充值:确认账户余额足够覆盖首个计费周期。
  2. 选择镜像:平台提供系统镜像、容器镜像和社区镜像,涵盖CUDA、Python、PyTorch/TensorFlow等主流环境。
  3. 创建实例:选择GPU卡型(如RTX 5090)、数量、计费周期(按小时/周/月),设置SSH密码。
  4. 连接使用:通过SSH或Jupyter进入容器,运行nvidia-smi验证GPU,将代码和数据放入/workspace
  5. 释放资源:确认不再使用后删除容器,避免持续计费。

如果你有自定义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