triton推理服务器需将pytorch模型转为torchscript或onnx格式,严格配置model_repository目录结构与config.pbtxt,确保输入输出名称、shape及dtype与模型一致,并正确设置客户端请求参数以避免invalid_arg错误。

直接用 Triton 推理服务器跑模型,不是“装上就能飞”——它默认不帮你加载 PyTorch 模型、不自动适配你的预处理逻辑、也不处理 batch 维度错位这种低级但致命的问题。真正高性能的前提是:模型格式对、配置文件准、客户端请求稳。
如何把 PyTorch 模型转成 Triton 支持的格式(torchscript / onnx)
Triton 本身不原生执行 torch.nn.Module,必须先固化为可序列化的格式。PyTorch 模型最常用两种路径:
- 用
torch.jit.trace或torch.jit.script导出.pt(推荐 trace,兼容性更好;注意 trace 时输入 shape 要固定,比如torch.randn(1, 3, 224, 224),否则 runtime 会报Input tensor shape mismatch) - 导出 ONNX 更通用,但需确认 opset 版本(Triton 24.06 推荐用
opset_version=17),且避免使用torch.nonzero这类动态 shape 操作,否则 ONNX Runtime 推理正常、Triton 加载时报Unsupported node kind: NonZero - 导出后务必用
torch.jit.load或onnxruntime.InferenceSession本地验证输出一致,别等部署到 Triton 才发现 logits 差了 1e-3
model_repository 目录结构与 config.pbtxt 的关键字段
Triton 不认模型文件名,只认目录结构和 config.pbtxt。一个常见翻车点是:模型能加载、但 infer 时返回 INVALID_ARG: input 'input__0' is not found —— 其实是 config 里 name 和实际 tensor name 对不上。
- 标准结构必须是:
model_repository/<model_name>/<version>/model.pt</version></model_name>(或model.onnx),<version></version>必须是纯数字目录,如1,不能是v1或latest -
config.pbtxt中platform填"pytorch_libtorch"(.pt)或"onnxruntime_onnx"(.onnx);max_batch_size设为 0 表示禁用 batching,设为 8 表示最大合批 8 条,但 client 端也得发batch_size=8的请求,否则可能被截断 - 输入输出
name必须和模型导出时的 tensor name 严格一致(trace 模型可用model.graph.inputs()[0].debugName()查),shape 写[ -1, 3, 224, 224 ]表示动态 batch,但第一个维度必须是-1,写成[ 1, 3, 224, 224 ]就无法 batch
Python 客户端发送请求时的 dtype 与内存布局陷阱
用 tritonclient.http 发请求,看似简单,但 np.array 类型错一个字节就会触发 INVALID_ARG: unexpected datatype 或静默结果异常。
- 输入数据必须用
np.float32(即使模型是 float16),Triton 默认不自动 cast;如果模型真要 fp16,config 里得加dynamic_batching { max_queue_delay_microseconds: 100 }并在 client 显式指定dtype=np.float16,否则 server 会拒绝 - 图像类模型尤其注意内存顺序:Triton 默认按 C-order 解析 buffer,如果你用 OpenCV 读图(BGR, HWC),又没 transpose 成 CHW,再没 reshape 成
(1, 3, 224, 224),那喂进去的就是错位像素 - 用
tritonclient.utils.serialize_byte_tensor处理 string 输入(如 tokenized text),别直接传 Python list,否则报invalid argument: unable to serialize string tensor
真正卡住性能的往往不是 GPU 利用率,而是 client 侧并发控制太松(连接池打满)、server 侧 instance_group 配太少(默认只起 1 个 model instance),或者 config 里漏写了 dynamic_batching —— 这些细节不调,模型再快也白搭。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











