如何正确使用 docker run --gpus all 调用所有 GPU
在使用 Docker 容器运行 GPU 加速应用时,--gpus all 是一个常用参数,用于启用宿主机上的所有 GPU。然而,实际部署过程中可能会遇到容器无法识别 GPU、启动失败或仅使用部分 GPU 的问题。以下内容将从基础配置、环境验证、运行时控制等多个维度,深入解析如何确保 docker run --gpus all 正确生效。
1. 确保 NVIDIA Container Toolkit 已正确安装
要使用 GPU,首先需要在宿主机上安装 NVIDIA Container Toolkit。以下是安装步骤:
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
安装完成后,可通过以下命令验证是否安装成功:
nvidia-smi -q -d CUDA
输出中应包含多个 GPU 信息若提示 nvidia-smi: command not found,说明驱动或 Toolkit 未正确安装
2. 验证 Docker 是否支持 GPU
执行以下命令测试 Docker 是否可以访问 GPU:
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
输出内容预期结果显示多个 GPU 的详细信息表示 Docker 已正确识别所有 GPU提示 unknown flag: --gpus说明 Docker 未启用 GPU 支持,需检查是否安装了 NVIDIA Container Toolkit
3. 容器内是否具备 CUDA 环境支持
即使 Docker 可以识别 GPU,如果容器内没有安装 CUDA 运行时库或相关驱动,GPU 也无法被应用程序使用。推荐使用 NVIDIA 官方提供的 CUDA 镜像作为基础镜像,例如:
FROM nvidia/cuda:12.0.0-base
或者构建自定义镜像时,确保以下组件存在:
CUDA Toolkit(如 cuda-toolkit-12-0)cuDNN(如深度学习应用需要)驱动兼容性检查(如 nvidia-smi --query-gpu=name,driver_version --format=csv)
4. 应用程序是否显式指定使用 GPU
某些应用程序(如 PyTorch、TensorFlow)默认可能只使用一块 GPU。为了启用多 GPU,需在代码中显式指定:
import torch
device = torch.device("cuda")
if torch.cuda.device_count() > 1:
model = torch.nn.DataParallel(model)
或在启动脚本中指定使用所有 GPU:
CUDA_VISIBLE_DEVICES=0,1,2,3 python train.py
若未设置 CUDA_VISIBLE_DEVICES,即使容器内有多个 GPU,程序也可能只使用默认的 device 0。
5. 验证容器是否真正调用所有 GPU
运行容器后,可通过以下命令实时查看 GPU 使用情况:
nvidia-smi -q -d POWER,TEMPERATURE,UTILIZATION
或在容器内执行:
nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu --format=csv
graph TD
A[启动容器] --> B[进入容器]
B --> C[运行 nvidia-smi]
C --> D{是否有多个 GPU 被占用?}
D -- 是 --> E[确认调用所有 GPU]
D -- 否 --> F[检查 CUDA_VISIBLE_DEVICES 设置]