Triton Inference Server 使用详解与常见问题汇总

发布于:2025-07-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

本文结合实际开发经验,详细介绍 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 部署、模型配置、推理调用等问题,欢迎留言交流!


网站公告

今日签到

点亮在社区的每一天
去签到