PyTorch模型需转为TorchScript(torch.jit.trace/script)并保存为model.pt,置于models/name/1/下;配套config.pbtxt须声明backend:"pytorch"、输入输出shape/dtype;启动Triton需挂载模型目录、设TRITON_MODEL_REPO环境变量,并用tritonclient调用,注意设备与dtype一致。

直接用 Python 脚本把 PyTorch 模型“扔进”Triton 是行不通的——Triton 不接受 torch.nn.Module 实例或 .pth 权重文件,它只认特定格式的序列化模型(如 model.pt 或 model.onnx)+ 严格结构的配置文件。
PyTorch 模型必须先转成 TorchScript 并保存为 model.pt
Triton 的 pytorch backend 只加载 TorchScript 格式(torch.jit.ScriptModule),不是普通 state_dict 或 nn.Module。常见错误是直接保存 torch.save(model, "model.pt"),结果 Triton 启动时报错:Failed to load model 'xxx': unable to load model。
- 必须用
torch.jit.trace或torch.jit.script导出,且输入需是真实张量(不能是 dummy placeholder) - 导出前确保模型已调用
.eval()和.to("cuda")(若用 GPU 推理) - 保存路径必须是模型版本子目录下的
model.pt,例如:models/resnet50/1/model.pt - 若模型含自定义算子或动态控制流,优先用
torch.jit.script;否则trace更稳定
示例:
import torch
import torchvision
<p>model = torchvision.models.resnet18(pretrained=True).eval().to("cuda")
example_input = torch.randn(1, 3, 224, 224).to("cuda")
traced_model = torch.jit.trace(model, example_input)
torch.jit.save(traced_model, "models/resnet50/1/model.pt")
config.pbtxt 里 backend 和 input/output 必须与 TorchScript 一致
Triton 启动时会校验 config.pbtxt 中声明的输入 shape、dtype 和实际 model.pt 的签名是否匹配。不一致会导致服务启动失败或推理返回乱码。
立即学习“Python免费学习笔记(深入)”;
-
backend: "pytorch"是固定写法,不能写成"torch"或留空 -
input.name必须和 traced model 的 forward 参数名一致(默认是"x"或"input",可用traced_model.code查看) -
dims是不含 batch 维的 shape,比如输入是[B,3,224,224],则写[3,224,224] -
data_type要匹配模型实际输入类型:图像常用TYPE_FP32,NLP embedding 常用TYPE_INT32
最小可用 config.pbtxt 示例:
name: "resnet50"
backend: "pytorch"
max_batch_size: 32
input [
{
name: "x"
data_type: TYPE_FP32
dims: [3, 224, 224]
}
]
output [
{
name: "output0"
data_type: TYPE_FP32
dims: [1000]
}
]
启动 Triton 容器时必须挂载模型目录并设置环境变量
很多人运行 docker run --gpus all nvcr.io/nvidia/tritonserver:24.07-py3 后发现模型没加载,根本原因是没告诉 Triton 模型在哪。
-
-v $(pwd)/models:/models是必须的,且宿主机models/目录结构要合法(含子目录+config.pbtxt+1/model.pt) -
-e TRITON_MODEL_REPO=/models必须显式设置,不能依赖默认值 - 端口映射至少保留
-p 8000:8000(HTTP)和-p 8001:8001(gRPC),否则客户端连不上 - 若模型用了
torch.compile或torch_tensorrt,需换用对应 CUDA/TensorRT 兼容镜像,比如24.07-py3-tensorrt
正确启动命令:
docker run -d \ --name triton-server \ --gpus=all \ -p 8000:8000 -p 8001:8001 \ -v $(pwd)/models:/models \ -e TRITON_MODEL_REPO=/models \ nvcr.io/nvidia/tritonserver:24.07-py3
Python 客户端调用时要注意输入张量的 shape 和 dtype 对齐
Triton 返回的 tensor 默认是 numpy.ndarray,但输入必须按 config.pbtxt 声明的格式构造。常见坑是维度顺序错(NHWC vs NCHW)、dtype 不匹配(float32 写成 float64)、或 batch 维缺失。
- 用官方
tritonclient库,别手写 HTTP 请求(容易漏 header 或 body 结构) - 输入数据必须是
np.array,且dtype与config.pbtxt一致(np.float32对应TYPE_FP32) - batch 维由 Triton 自动处理:传单样本就用
[1,3,224,224],别省略1 - 首次请求可能慢——Triton 需 JIT 编译 kernel,后续请求才稳定
简短调用示例:
import numpy as np
import tritonclient.http as httpclient
<p>client = httpclient.InferenceServerClient(url="localhost:8000")
inputs = httpclient.InferInput("x", [1,3,224,224], "FP32")
inputs.set_data_from_numpy(np.random.randn(1,3,224,224).astype(np.float32))
outputs = httpclient.InferRequestedOutput("output0")
result = client.infer("resnet50", [inputs], outputs=[outputs])
print(result.as_numpy("output0").shape) # 应输出 (1, 1000)
最易被忽略的是模型导出时的设备一致性:trace 用 CPU 张量,但 Triton 在 GPU 上加载,会静默失败;trace 用 GPU 张量,但没加 .to("cuda") 到模型本身,也会报错。务必在 trace 前执行 model.to("cuda") 且 example_input 也在 CUDA 上。


















