triton要求模型为tensorrt、onnx、pytorch(torchscript)、tensorflow savedmodel或openvino格式,不支持h5或冻结pb;tensorflow serving对格式更宽容但需自定义扩展。

模型格式支持决定你能不能用 Triton
Triton 要求模型必须是 TensorRT、ONNX、PyTorch (TorchScript)、TensorFlow SavedModel 或 OpenVINO 格式。如果你的模型是 tf.keras.Model.save() 生成的 h5 文件,或纯 .pb 冻结图(非 SavedModel),Triton 直接拒收——它不解析旧式 GraphDef。
TensorFlow Serving 对格式更宽容:原生支持 SavedModel,也能通过自定义 servable 加载其他格式(比如自己写个 loader 读 .h5),但得自己编译、维护。
- 已有大量
tf.estimator.export_saved_model()流程?→ TensorFlow Serving 开箱即用 - 模型已转成
ONNX,且要跨框架部署(PyTorch / MXNet 模型也走同一流程)?→ Triton 更省事 - 用
tf.keras.models.load_model("xxx.h5")训练完直接想上线?→ 先转SavedModel,否则两个都卡住
并发吞吐和 GPU 利用率差异明显
Triton 的核心优势是多模型、多实例、动态批处理(dynamic_batching)全由服务层统一调度。同一个 GPU 上可以同时跑 A 模型的 3 个实例 + B 模型的 2 个实例,并自动把小请求攒成大 batch 推给 CUDA kernel——这对低延迟高吞吐场景(如推荐、语音实时 ASR)很关键。
TensorFlow Serving 默认每个模型一个 Session,batch 是客户端拼的;开多个 session_config 实例虽能提并发,但显存占用线性增长,GPU 利用率容易上不去。
- 单卡部署 5 个不同模型,且请求量波动大?→ Triton 的
model_repository+config.pbtxt编排更可控 - 只跑一个大模型,QPS 稳定在 200 左右,CPU 预处理占大头?→ TensorFlow Serving 足够,别为 Triton 多引入 gRPC/HTTP 2 层抽象
- 开了
dynamic_batching但延迟飙升?→ 检查max_queue_delay_microseconds是否设得太松,实际攒太久才发
客户端协议和运维复杂度真实存在
Triton 只暴露 gRPC 和 HTTP/REST 两种接口,所有请求必须带 model_name、model_version、输入 tensor 的 name 和 shape,连最简单的 curl 测试都要拼 JSON 结构体。TensorFlow Serving 的 REST API 更“直觉”些:POST /v1/models/{name}[:predict],body 里塞个 {"instances": [...]} 就行。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
但 Triton 的 model_repository 目录结构强制清晰(每个模型一个子目录,配置文件叫 config.pbtxt),热更新模型只要 touch 一下配置或替换文件夹,服务自动 reload;TF Serving 要么重启进程,要么调 ModelServer::ReloadConfig() RPC,生产环境容易出错。
- CI/CD 流水线要自动上线新模型版本?→ Triton 的文件系统驱动更新机制更可靠
- 团队里前端/算法同学要自己写 Python client 测推理?→ TensorFlow Serving 的 JSON schema 更易读,少踩
datatype(如FP32vsINT8)匹配错误 - 用
tritonclient.http.InferenceServerClient却报Request failed with status code 400: b'invalid argument'?→ 八成是inputs[0].set_data_from_numpy()前没调.reshape()对齐 config.pbtxt 里声明的 shape
C++ 客户端集成时的链接与 ABI 陷阱
两个服务都提供 C++ client SDK,但 Triton 的 libtritonserver.so 是运行时加载的,C++ client 实际依赖的是 libgrpc++.so、libprotobuf.so 这类第三方库;TF Serving 的 tensorflow_serving/apis/prediction_service.grpc.pb.h 是编译期生成的,你项目里用的 protobuf 版本必须和 Serving 构建时一致,否则 ParseFromString() 崩溃。
Triton client 库本身不带模型解析逻辑,所有预处理(归一化、resize)得你代码里写死;TF Serving 至少支持在 config.conf 里配简单的 preprocess(虽然功能弱)。真要零拷贝共享内存推理,Triton 的 shared_memory API 支持更成熟,但要求 client 和 server 在同一台机器,且显存/内存地址空间可互通。
- 你的 C++ 工程已用
absl+protobuf 3.21?→ TF Serving 很可能要降级 protobuf 或自己重编译 serving binary - 推理前需做 OpenCV 图像 decode + crop + normalize?→ 别指望服务端帮你做,两个引擎都要求输入已是 float32 tensor
- 用
tritonclient.utils.shared_memory传大 tensor 却收不到响应?→ 检查shm_region_handle是否被提前munmap(),Triton 不负责生命周期管理
模型不是扔进服务就完事的。从格式转换、batch 策略到 client 内存管理,每层都有隐含契约——漏掉任意一环,表面跑通,压测时才露馅。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










