Docker 和 NVIDIA 官方文档里,关于 GPU 的写法不一样:
一个用 deploy.resources.reservations.devices(Docker 官方),
一个用 runtime: nvidia + 环境变量(NVIDIA 官方)。
它们都能跑,但机制不同、不能混用。 以下用同一个 Whisper GPU 服务作为示例,清楚对比这两种方式。
首先别忘记安装container toolkits
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
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
🟢 Docker 官方写法(Compose 规范版)
📖 参考:Docker Docs – GPU support in Compose
services:
whisper_simple_api_gpu:
image: nvidia/cuda:12.6.3-cudnn-devel-ubuntu22.04
environment:
- WHISPER_MODEL_NAME=large
- WHISPER_API_PORT=7870
ports:
- "7870:7870"
volumes:
- .:/app
command: python -u whisper_server.py
restart: unless-stopped
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ["4"]
capabilities: ["gpu"]
核心部分,单卡示例
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
核心部分,多卡指定示例
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0', '3']
capabilities: [gpu]
✅ 特点
- Compose 官方字段,与 CLI
--gpus参数一致。 - 可在
device_ids中精确指定 GPU(如["4"]),或用count表示数量。 - 推荐用于现代 Docker/Compose 环境。
🔵 NVIDIA 官方写法(runtime + 环境变量版)
📖 参考:NVIDIA Container Toolkit – Docker specialized configurations
services:
whisper_simple_api_gpu:
image: nvidia/cuda:12.6.3-cudnn-devel-ubuntu22.04
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=4
- NVIDIA_DRIVER_CAPABILITIES=compute,utility
- WHISPER_MODEL_NAME=large
- WHISPER_API_PORT=7870
ports:
- "7870:7870"
volumes:
- .:/app
command: python -u whisper_server.py
restart: unless-stopped
核心部分(指定smi中id为4的gpu)
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=4
- NVIDIA_DRIVER_CAPABILITIES=compute,utility
✅ 特点
- 使用
nvidia-container-runtime进行 GPU 挂载。 - 通过环境变量
NVIDIA_VISIBLE_DEVICES=4控制可见 GPU。 - 仍在 Jetson 或旧版 Docker 环境中常用。
- 不属于 Compose 规范字段,不要与 Docker 官方写法混用。
⚖️ 差异对比表
| 项目 | Docker 官方方式 | NVIDIA 官方方式 |
|---|---|---|
| 核心字段 | deploy.resources.reservations.devices |
runtime: nvidia + NVIDIA_VISIBLE_DEVICES |
| 控制主体 | Docker Compose | NVIDIA Runtime |
| GPU 选择 | device_ids 或 count |
环境变量 |
| Compose 标准支持 | ✅ 是 | ❌ 否 |
| CLI 等价命令 | docker run --gpus '"device=1,2"' |
docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=4 |
| 能否混用 | 🚫 否 | 🚫 否 |
🧠 结语: Docker 官方和 NVIDIA 官方的写法都能用, 但来源不同、逻辑不同。 只选其一使用,不要混用。