triton-inference-server/server · 上手攻略

  • 仓库:triton-inference-server/server
  • 链接:https://github.com/triton-inference-server/server
  • 分类:ai(NVIDIA Triton 推理服务器,模型部署/服务化基础设施)
  • 作者:spark
  • 更新:2026-07-14

是什么

NVIDIA Triton Inference Server 是 NVIDIA 开源的"模型推理服务化"系统。和 TensorRT 关注"单模型怎么跑得最快"不同,Triton 关注的是"一堆模型怎么稳定高效地对外提供服务"——它把 TensorRT、PyTorch、ONNX Runtime、OpenVINO、Python、RAPIDS FIL 等多个推理后端统一成一个 HTTP/REST + gRPC 服务,对外暴露 KServe v2 推理协议,背后做动态批处理、并发模型调度、模型流水线、可观测指标、模型仓库管理、热加载卸载等"运维向"能力。

GitHub triton-inference-server/server 仓库是 Triton 的核心实现,但实际 Triton 是一个 GitHub 组织(triton-inference-server)下的多仓库项目:

  • server:本次的主角,推理服务器核心;
  • backend:各种 backend(tensorrt_backend、pytorch_backend、onnxruntime_backend、python_backend、openvino_backend、fil_backend 等);
  • client:Python/C++/Java 客户端 SDK;
  • perf_analyzer / model_analyzer:压测和调参工具;
  • tutorials:上手教程;
  • contrib:社区贡献的 backends 和 examples。

当前主分支对应即将发布的下一版本,最新 GA 是 2.70.0,对应 26.06 NGC 容器(即 2026 年 6 月发版)。

解决什么问题

  • 多框架模型统一部署:CV 模型用 ONNX Runtime、LLM 用 TensorRT-LLM、传统 ML 用 FIL backend——全都可以挂到同一个 Triton 实例下,对外只暴露一个 REST/gRPC endpoint。
  • 高吞吐低延迟:动态批处理(dynamic batcher)+ 序列批处理(sequence batcher)能在不增加延迟的前提下自动合并请求,把 GPU 利用率打到接近 100%。
  • 多模型并发:同时跑 ResNet + BERT + 自定义 Python 模型,每个模型独立调度、独立扩缩容。
  • 流水线 / 集成人编排:用 Model EnsembleBusiness Logic Scripting (BLS) 把"预处理 → 主模型 → 后处理"串成一个图,对外只看到一个模型。
  • 可观测性:内置 Prometheus 指标(GPU 利用率、队列长度、batch 大小分布、P99 延迟),天然适合接入监控。
  • 边缘 / 嵌入式:C API / Java API 允许 Triton 直接 link 进应用进程,Jetson 上也能跑。

快速安装

方式一:NGC 容器跑(最常用,强烈推荐)

# 拉镜像(确认你装了 NVIDIA Container Toolkit)
docker pull nvcr.io/nvidia/tritonserver:26.06-py3

# 准备模型仓库(demo 用 densenet_onnx)
git clone -b r26.06 https://github.com/triton-inference-server/server.git
cd server/docs/examples
./fetch_models.sh

# 启动 Triton
docker run --gpus=1 --rm --net=host \
  -v ${PWD}/model_repository:/models \
  nvcr.io/nvidia/tritonserver:26.06-py3 \
  tritonserver --model-repository=/models \
               --model-control-mode=explicit \
               --load-model=densenet_onnx

# 服务启动后默认监听:
#   HTTP:    localhost:8000
#   gRPC:    localhost:8001
#   Metrics: localhost:8002

另一终端用 SDK 容器里的 image_client 发请求:

docker run -it --rm --net=host \
  nvcr.io/nvidia/tritonserver:26.06-py3-sdk \
  /workspace/install/bin/image_client \
    -m densenet_onnx -c 3 -s INCEPTION \
    /workspace/images/mug.jpg

预期输出:

Image '/workspace/images/mug.jpg':
 15.346230 (504) = COFFEE MUG
 13.224326 (968) = CUP
 10.422965 (505) = COFFEEPOT

CPU-only 启动也是同样的命令,把 --gpus=1 去掉即可(注意 CPU 上能跑的 backend 有限,参考 Backend-Platform Support Matrix)。

方式二:从源码构建

仓库根目录有完整的 build 流程:

git clone -b r26.06 https://github.com/triton-inference-server/server.git
cd server
# 跟随 docs/customization_guide/build.md

源码构建一般只在以下情况才需要:要在新平台支持、集成自有 backend、修复 Triton 内部 bug。

方式三:Kubernetes / Helm

仓库提供 deploy/ 目录里的官方 Helm chart,覆盖 GCP / AWS / NVIDIA FleetCommand 三种部署模板。

核心用法

1. 模型仓库(Model Repository)布局

Triton 从一个文件系统目录里读模型,每个模型一个子目录,标准结构:

model_repository/
├── densenet_onnx/
│   ├── 1/
│   │   └── model.onnx        # 版本 1,必须放在 `1/` 子目录里
│   └── config.pbtxt          # 模型配置(可选,没写 Triton 会自动推断)
├── my_ensemble/
│   ├── 1/
│   └── config.pbtxt          # 用 ensemble 字段把多个模型串成流水线
└── my_python_model/
    ├── 1/
    │   └── model.py          # Python backend 的执行文件
    └── config.pbtxt

最简 config.pbtxt

name: "densenet_onnx"
platform: "onnxruntime_onnx"
input [
  {
    name: "input__0"
    data_type: TYPE_FP32
    format: FORMAT_NCHW
    dims: [ 3, 224, 224 ]
  }
]
output [
  {
    name: "fc6_1"
    data_type: TYPE_FP32
    dims: [ 1000 ]
  }
]
instance_group [
  {
    count: 1
    kind: KIND_GPU
  }
]

2. 动态批处理(核心性能特性)

config.pbtxt 里加一段:

dynamic_batching {
  preferred_batch_size: [ 8, 16 ]
  max_queue_delay_microseconds: 100
}

含义:Triton 会把 100μs 窗口内的请求合并成 batch 8/16 一起推给 backend。这是免费提升吞吐的关键开关,几乎所有高 QPS 场景都要开。

3. 序列批处理(有状态模型)

sequence_batching {
  max_sequence_idle_microseconds: 5000000
}

用于有状态的 RNN/LLM 推理,确保同一 sequence id 的多个请求被路由到同一个 model instance 上,避免状态被覆盖。

4. 模型 Ensemble(流水线)

name: "preprocess_resnet"
platform: "ensemble"
input [
  { name: "RAW_IMAGE" data_type: TYPE_UINT8 dims: [ -1 ] }
]
output [
  { name: "OUTPUT" data_type: TYPE_FP32 dims: [ 1000 ] }
]
ensemble_scheduling {
  step [
    { model_name: "image_preprocess",  model_version: -1,
      input_map: { key: "RAW_IMAGE" }, output_map: { key: "PREPROCESSED_IMAGE" } },
    { model_name: "densenet_onnx",     model_version: -1,
      input_map: { key: "input__0" },    output_map: { key: "fc6_1" } }
  ]
}

对外只看到一个 preprocess_resnet 模型,内部自动串起两个子模型。

5. Python 客户端发送请求

import tritonclient.http as httpclient
import numpy as np

triton = httpclient.InferenceServerClient(url="localhost:8000")

image = np.fromfile("mug.jpg", dtype=np.uint8)
inputs  = [httpclient.InferInput("input__0", [len(image)], "UINT8")]
inputs[0].set_data_from_numpy(image)
outputs = [httpclient.InferRequestedOutput("fc6_1")]

result = triton.infer(model_name="densenet_onnx", inputs=inputs, outputs=outputs)
preds = result.as_numpy("fc6_1")
print(np.argmax(preds))

gRPC 客户端用 tritonclient.grpc,API 几乎对称。

6. HTTP/REST 直接打(最快验证)

curl -X POST localhost:8000/v2/models/densenet_onnx/infer \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": [{
      "name": "input__0",
      "shape": [1, 3, 224, 224],
      "datatype": "FP32",
      "data": [/* 150528 floats */]
    }],
    "outputs": [{"name": "fc6_1"}]
  }'

二进制数据可以直接 POST 原始 binary 给扩展协议,绕过 JSON 序列化开销。

7. 性能压测:perf_analyzer

docker run -it --rm --net=host \
  nvcr.io/nvidia/tritonserver:26.06-py3-sdk \
  perf_analyzer -m densenet_onnx \
    --shape=input__0:3,224,224 \
    --concurrency-range=1:32 \
    --measurement-mode=count_windows \
    --measurement-request-count=2000

输出 throughput / p50 / p99 延迟,方便选最佳 --concurrencydynamic_batching 参数。

8. C API / Java API(in-process 集成)

不想开 HTTP/gRPC、想把 Triton 嵌进自家 C++/Java 应用:

#include "triton/core/tritonserver.h"
TRITONSERVER_Server* server = nullptr;
TRITONSERVER_ServerNew(&server, /* options */);
// ... 加载 model repository、起 worker thread
TRITONSERVER_ServerDelete(server);

Java 类似。详细在 docs/customization_guide/inprocess_c_api.md / inprocess_java_api.md

9. 拉取 Prometheus 指标

curl localhost:8002/metrics

能拿到 GPU 利用率、请求数、错误率、batch size 分布等几十个指标。

典型适用场景

  • 多模型统一部署:一个推理集群对外服务几十个 CV/NLP 模型,全部跑在同一个 Triton 上,运维一套 K8s+监控。
  • 高 QPS 在线推理:动态批处理能把单卡 QPS 翻倍,省机器。
  • LLM 推理:配合 TensorRT-LLM backend(独立仓库 triton-inference-server/tensorrtllm_backend),Triton 是当前 LLM 服务的最常见底座。
  • 多模态流水线:图片预处理 + 检测 + 分类 + 后渲染串成一个 ensemble。
  • 视频流 / 直播:decoupled backend + sequence batching 支持长视频的逐帧状态保持。
  • 边缘推理:Jetson + Triton,部署到工厂 / 零售终端。
  • AWS Inferentia:通过 Python backend 把 Inferentia 芯片也纳入 Triton 服务栈。

坑与注意

  • config.pbtxt 一定要写对 dims:默认 dims: [ -1 ] 表示动态 shape,但具体在哪个维度可变、batch 维度在哪,要明确指定;搞错了会触发一次隐式重编译,延迟 spike。
  • 模型仓库 layout 的版本号是目录名1/2/ 对应模型版本号 12;想用最新版本,client 不指定 version 即可。
  • --model-control-mode 三种none(启动时全部加载,仓库变更不响应)/ poll(轮询仓库变更)/ explicit(只能通过 API 加载卸载)。生产推荐 explicit
  • dynamic batching 默认关闭:很多新手没开就发现 QPS 上不去;记得按上面语法加上。
  • backend 不是全平台通用:ONNX/TensorRT/PyTorch backend 在 x86 + CUDA 上完整,OpenVINO backend 只在 Intel CPU 上,FIL backend 只在 x86 CPU 上;具体看 Backend-Platform Support Matrix。
  • Python backend 启动慢:每个 model instance 都要启动 Python 解释器,冷启动明显的场景考虑用 C++ backend 或预热。
  • schema 检查是 KServe v2:HTTP/JSON body 要带 datatypeshapedata;OpenAPI schema 见 docs/protocol/
  • --strict-model-config=true 是双刃剑:开了之后 config 写错直接拒启动;建议 CI 里开,开发期关。
  • Jetson 上内存紧:Triton + 多 backend + 多个模型容易 OOM,要在 config 里限定 instance group count
  • BLS / Ensemble 调试困难:模型流水线一旦编排复杂,看不出是哪一步失败;建议先用单独的 backend 各跑一遍再编排。
  • Prometheus 指标很多:默认 metrics 几百项,记得用 label filter 收敛。

与同类对比

工具 厂商 多 backend 动态批处理 HTTP/gRPC K8s 原生 LLM 支持
Triton Inference Server NVIDIA ✅(TensorRT/PyTorch/ONNX/OPENVINO/Python/FIL) ✅ 内置 ✅ KServe v2 ✅ Helm ✅(via TensorRT-LLM backend)
TorchServe AWS + Meta PyTorch 为主 弱(自家 handler 模式)
BentoML 社区 ✅(多框架) 手动配
KServe 社区 通过 Seldon Core ✅ KServe v1/v2 ✅(CRD) ✅(vLLM/Triton 集成)
vLLM UC Berkeley 仅自家 ✅ continuous batching ✅ OpenAI API ✅(专攻 LLM)
Ray Serve Anyscale

定位差异:Triton 是 NVIDIA 生态的"基础设施级"选手,能力最全、对 NVIDIA GPU 优化最深;做 LLM 单独部署可以选 vLLM(更简单),做多框架统一服务化 Triton 仍然是首选。

一句话推荐结论

只要你的服务跑在 NVIDIA GPU 上、且模型不止一个或框架不止一种,闭眼选 Triton——它把"动态批处理 + 多 backend + K8s + Prometheus"打包成了一个生产可用的推理平台,且生态里几乎所有 LLM 推理项目都拿它做底座。

参考链接

  • 仓库主页:https://github.com/triton-inference-server/server
  • Quick Start:https://github.com/triton-inference-server/server/blob/main/docs/getting_started/quickstart.md
  • Architecture:https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md
  • Model Repository:https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_repository.md
  • perf_analyzer:https://github.com/triton-inference-server/perf_analyzer
  • model_analyzer:https://github.com/triton-inference-server/model_analyzer
  • Tutorials:https://github.com/triton-inference-server/tutorials
  • Release Notes:https://docs.nvidia.com/deeplearning/triton-inference-server/release-notes/index.html
  • NVIDIA Developer Zone:https://developer.nvidia.com/nvidia-triton-inference-server