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硬件之间的调用关系:

宿主机(Host) GPU 硬件 NVIDIA A10 / T4 / V100 PCIe / NVLink NVIDIA 驱动 Driver 535.104+ 内核态 + libcuda.so Docker 引擎 dockerd + containerd 版本 ≥ 20.10 NVIDIA Container Toolkit(nvidia-docker2) Docker 容器(Triton Inference Server) Triton 容器 tritonserver:23.10-py3 HTTP/gRPC 服务 ONNX Runtime 后端 模型仓库管理 CUDA 12.0 运行时 模型仓库 /models resnet50_onnx/ 1/model.onnx config.pbtxt 客户端 HTTP / gRPC 请求: model infer 端口: 8000/8001 curl / tritonclient 容器通过 Toolkit 访问 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
版本匹配提示:Triton 23.10镜像要求宿主机驱动版本 ≥ 525.60.13(CUDA 12.0对应驱动)。建议安装最新稳定版驱动(如535或545系列),避免因驱动过旧导致容器内CUDA初始化失败。

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]].

排查步骤:

  1. 执行 nvidia-smi 确认宿主机驱动正常;
  2. 执行 dpkg -l | grep nvidia-container-toolkit 检查Toolkit是否安装;
  3. 若未安装,按4.2.2节步骤安装并重启Docker;
  4. 若已安装,检查 /etc/docker/daemon.json 是否包含 "runtimes": {"nvidia": ...} 配置;
  5. 执行 sudo systemctl restart docker 后重试。

通过以上步骤,90%以上的GPU容器启动问题都能解决。环境搭建完成后,下一阶段将进入模型仓库的详细配置与ONNX模型的具体部署调优。