4. 环境搭建:Docker安装、Triton镜像获取、GPU驱动与CUDA配置
在正式部署ONNX模型之前,必须先搭建一套可复现、可移植的运行时环境。Triton Inference Server官方推荐以Docker容器方式运行,这既隔离了宿主机环境差异,也简化了依赖管理。本章将按照“GPU驱动验证 → CUDA与容器运行时 → Docker安装 → Triton镜像获取 → 容器启动验证”的顺序,逐步完成环境搭建。
4.1 核心原理:容器、GPU驱动与CUDA的分层关系
很多初学者混淆“GPU驱动”“CUDA版本”“CUDA容器镜像”三者的概念。实际上,它们处于不同层级:
- GPU驱动(NVIDIA Driver):运行在宿主机内核态,直接与GPU硬件通信。驱动版本决定GPU能否被系统识别。
- CUDA Toolkit(宿主机):通常不需要完整安装。Triton镜像内部自带CUDA运行时库,宿主机只需提供驱动。
- CUDA容器镜像:Triton镜像内封装了CUDA库、TensorRT、ONNX Runtime等推理后端,与宿主机CUDA版本无关。
- NVIDIA Container Toolkit:作为Docker与GPU驱动之间的桥梁,将宿主机的GPU设备及驱动库挂载进容器。
下图展示了宿主机、Docker引擎、Triton容器与GPU硬件之间的调用关系:
从上图可以看出,宿主机驱动是唯一必须手动安装的GPU组件,CUDA库随Triton镜像自动带入。这种设计使得同一套Triton镜像可以运行在不同驱动版本的机器上(只要驱动满足最低要求)。
4.2 方法流程:GPU驱动验证与Docker安装
4.2.1 第一步:确认GPU驱动已正确安装
在安装任何软件之前,先执行以下命令验证GPU是否被系统识别:
# 检查GPU硬件是否可见
lspci | grep -i nvidia
# 检查驱动是否加载
nvidia-smi
如果 nvidia-smi 正常输出GPU型号、驱动版本、显存使用率等信息,说明驱动已就绪。若提示 command not found,则需要先安装驱动。对于Ubuntu 22.04系统,推荐使用以下方式安装:
# 添加NVIDIA官方驱动源
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
# 安装推荐版本驱动(如535)
sudo apt install -y nvidia-driver-535
# 重启后验证
sudo reboot
nvidia-smi
4.2.2 第二步:安装Docker引擎
使用官方脚本安装Docker(适用于Ubuntu/Debian/CentOS):
# 安装Docker官方脚本
curl -fsSL https://get.docker.com | sudo sh
# 将当前用户加入docker组(避免每次sudo)
sudo usermod -aG docker $USER
newgrp docker
# 验证Docker安装
docker --version
docker run hello-world
安装完成后,需要额外安装NVIDIA Container Toolkit,使Docker能够访问GPU:
# 添加NVIDIA容器运行时源
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update
sudo apt install -y nvidia-container-toolkit
# 重启Docker服务
sudo systemctl restart docker
# 验证GPU容器运行
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
如果最后一条命令能输出GPU信息,说明Docker已具备GPU透传能力。
4.3 案例:获取Triton镜像并启动ONNX推理服务
以Triton 23.10版本为例(该版本内置CUDA 12.0和TensorRT 8.6,支持ONNX Runtime 1.16),拉取镜像并启动服务:
# 拉取Triton镜像(约3GB,需耐心等待)
docker pull nvcr.io/nvidia/tritonserver:23.10-py3
# 准备模型仓库目录
mkdir -p ~/triton_models/resnet50_onnx/1
# 将ONNX模型文件放入对应目录
cp resnet50.onnx ~/triton_models/resnet50_onnx/1/model.onnx
# 编写模型配置文件
cat > ~/triton_models/resnet50_onnx/config.pbtxt <<EOF
name: "resnet50_onnx"
platform: "onnxruntime_onnx"
max_batch_size: 8
input [
{
name: "input"
data_type: TYPE_FP32
dims: [3, 224, 224]
}
]
output [
{
name: "output"
data_type: TYPE_FP32
dims: [1000]
}
]
EOF
# 启动Triton容器
docker run --gpus all -it --rm \
-p 8000:8000 -p 8001:8001 -p 8002:8002 \
-v ~/triton_models:/models \
nvcr.io/nvidia/tritonserver:23.10-py3 \
tritonserver --model-repository=/models
启动成功后,日志中会出现 Started HTTPService at 0.0.0.0:8000 和 Started GRPCInferenceService at 0.0.0.0:8001 等关键信息。此时可以用 curl 验证服务健康状态:
# 检查服务状态
curl -v http://localhost:8000/v2/health/ready
# 查看已加载模型列表
curl http://localhost:8000/v2/models
如果返回 {"models":["resnet50_onnx"]},说明ONNX模型已成功加载并处于可推理状态。
4.4 常见误区与复盘
| 误区 | 现象 | 正确做法 |
|---|---|---|
| 在宿主机安装完整CUDA Toolkit | 浪费磁盘空间,且版本与容器内CUDA冲突 | 宿主机只需驱动,CUDA库由镜像提供 |
| 忘记安装NVIDIA Container Toolkit | 容器启动报错 could not select device driver "" with capabilities: [[gpu]] |
必须安装nvidia-container-toolkit并重启Docker |
| 驱动版本过低 | 容器内CUDA初始化失败,日志提示 CUDA driver version is insufficient |
升级驱动至Triton镜像要求的最低版本以上 |
| 模型仓库路径挂载错误 | Triton启动后找不到模型,日志显示 no model repository found |
确认 -v 挂载路径正确,且模型目录结构符合规范 |
| 端口被占用 | 启动失败,提示 address already in use |
使用 docker ps 检查占用,或修改映射端口 |
--rm 标志启动容器,否则容器退出后日志和模型状态会全部丢失。建议使用 docker run -d --name triton-server 方式后台运行,并通过 docker logs triton-server 查看日志。
4.4.1 复盘:一次典型的启动失败排查
假设执行 docker run --gpus all ... 后出现以下错误:
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
排查步骤:
- 执行
nvidia-smi确认宿主机驱动正常; - 执行
dpkg -l | grep nvidia-container-toolkit检查Toolkit是否安装; - 若未安装,按4.2.2节步骤安装并重启Docker;
- 若已安装,检查
/etc/docker/daemon.json是否包含"runtimes": {"nvidia": ...}配置; - 执行
sudo systemctl restart docker后重试。
通过以上步骤,90%以上的GPU容器启动问题都能解决。环境搭建完成后,下一阶段将进入模型仓库的详细配置与ONNX模型的具体部署调优。