本文结合实际开发经验,详细介绍 NVIDIA Triton Inference Server 的基本用法,并针对模型热加载、模型版本管理、config.pbtxt 配置、API 版本、推理输出为 None 等常见问题进行解答。
一、Triton Inference Server 简介
Triton Inference Server(简称 Triton)是 NVIDIA 推出的开源高性能推理服务平台,支持多种深度学习框架(ONNX、TensorFlow、PyTorch、TensorRT等),可在云端、边缘和本地高效部署 AI 模型。
二、基本用法
0. 下载docker 镜像
docker pull nvcr.io/nvidia/tritonserver:23.10-py3
1. 准备模型仓库
模型仓库(model repository)目录结构如下:
model_repository/
└── yolo-world/
├── 1/
│ └── model.onnx
├── 2/
│ └── model.onnx
└── config.pbtxt # 可选但推荐
2. 启动 Triton 服务
docker run --gpus all --rm -d \
-p8000:8000 -p8001:8001 -p8002:8002 \
-v /path/to/model_repository:/models \
nvcr.io/nvidia/tritonserver:23.10-py3 \
tritonserver --model-repository=/models
3. 查询模型启动情况
curl localhost:8000/v2/models/yolo-world
结果如下:
{"name":"yolo-world","versions":["1","2"],"platform":"onnxruntime_onnx","inputs":[{"name":"images","datatype":"FP32","shape":[1,3,640,640]}],"outputs":[{"name":"labels","datatype":"INT32","shape":[-1,-1]},{"name":"scores","datatype":"FP32","shape":[-1,-1]},{"name":"boxes","datatype":"FP32","shape":[-1,-1,-1]},{"name":"num_dets","datatype":"INT64","shape":[-1,1]}]}(base) pinefield@edge-gpu-01:/data/joyiot/leo/docker_proj$ curl localhost:8000/v2/models/yolo-world
4. 客户端推理调用
import numpy as np
import tritonclient.http as httpclient
client = httpclient.InferenceServerClient(url="localhost:8000")
inputs = [httpclient.InferInput("images", [1, 3, 640, 640], "FP32")]
inputs[0].set_data_from_numpy(np.random.rand(1, 3, 640, 640).astype(np.float32))
results = client.infer("yolo-world", inputs)
labels = results.as_numpy("labels")
scores = results.as_numpy("scores")
boxes = results.as_numpy("boxes")
num_dets = results.as_numpy("num_dets")
三、常见问题与解答
1. 模型热加载无效/新版本不显示
- Triton 支持模型仓库的热加载(无需重启服务即可加载新模型/新版本)。
- 但在某些文件系统(如NFS、WSL2、网络挂载)下,热加载可能延迟或失效。
- 解决办法:
- 优先在本地磁盘操作模型仓库。
- 如热加载无效,重启 Triton 服务可强制加载所有模型和版本。
- 检查 Triton 日志,确认是否有模型加载相关信息。
2. 只加载了最新版本,未加载所有版本
- 默认情况下,如果没有
config.pbtxt
或未指定version_policy
,Triton 只会加载最新(最大数字)的模型版本。 - 解决办法:
- 在
config.pbtxt
中添加:version_policy: { all: {} }
- 这样 Triton 会加载所有有效版本。
- 在
3. config.pbtxt 是否必须?如何配置?
- ONNX、TensorFlow、PyTorch 等主流模型可以自动推断配置,
config.pbtxt
可选。 - 但如需高级功能(多版本、动态批量、并发等),建议手动配置。
- 最简示例:
name: "yolo-world" platform: "onnxruntime_onnx" version_policy: { all: {} }
4. API 路径中的 v2/v3 是什么?
/v2/models/...
里的v2
是 Triton 的 REST API 版本号,不是模型版本号。- 模型版本号是在 API 路径的
versions/<数字>
部分,例如:/v2/models/yolo-world/versions/2/infer
5. 推理输出为 None
- 常见原因:
- 客户端代码输出名与模型实际输出名不一致(区分大小写)。
- 模型本身推理出错或输出为空。
- config.pbtxt 配置与模型实际不符。
- 解决办法:
- 用
curl localhost:8000/v2/models/<模型名>
查询实际输出名。 - 检查输入 shape、数据类型、模型文件有效性。
- 用
6. 如何查看 Triton 日志?
- 用 Docker 启动时:
docker logs <容器ID或名称>
- 实时查看:
docker logs -f <容器ID或名称>
7. 如何确认模型热加载成功?
- 查看 Triton 日志,有类似
loaded 'yolo-world' version 3
的信息。 - 用 API 查询:
返回的curl localhost:8000/v2/models/yolo-world
versions
字段应包含所有已加载的版本号。
四、实用技巧
- 模型目录、config.pbtxt、客户端请求的模型名三者必须完全一致。
- 模型文件名(如 model.onnx)需符合 Triton 要求,不能随意更改。
- 模型仓库路径变更后,必须重启 Triton 服务。
- 模型仓库内容变更(增删改模型/版本),无需重启,Triton 会自动热加载。
五、参考资料
如有更多 Triton 部署、模型配置、推理调用等问题,欢迎留言交流!