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 Ensemble 或 Business 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 延迟,方便选最佳 --concurrency 和 dynamic_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/对应模型版本号1、2;想用最新版本,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 要带
datatype、shape、data;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