4. 模型序列化与格式选择:ONNX、TorchScript、TensorRT、PMML 的对比与选型原则
在低延迟风控在线 Serving 中,模型序列化格式直接决定了推理引擎的兼容性、执行效率与部署复杂度。本章深入对比四种主流格式——ONNX、TorchScript、TensorRT、PMML,并给出面向风控场景的选型原则。
4.1 四种格式的核心定位
| 格式 | 核心定位 | 典型来源框架 | 推理引擎 |
|---|---|---|---|
| ONNX | 开放神经网络交换格式,跨框架互操作 | PyTorch, TensorFlow, Scikit-learn | ONNX Runtime, OpenVINO, TensorRT |
| TorchScript | PyTorch 原生序列化,支持动态图与静态图混合 | PyTorch | LibTorch (C++), PyTorch JIT |
| TensorRT | NVIDIA GPU 专用优化引擎,极致低延迟 | ONNX, TensorFlow, PyTorch | TensorRT (C++/Python) |
| PMML | 预测模型标记语言,跨平台模型描述标准 | Scikit-learn, R, Spark MLlib | JPMML, Openscoring |
选型直觉: 风控模型在线 Serving 中,ONNX 是通用首选,TensorRT 是 GPU 极致优化选项,TorchScript 适合纯 PyTorch 技术栈,PMML 仅推荐用于传统机器学习模型(如 GBDT、LR)的跨平台部署。
4.2 格式对比:序列化能力与推理性能
| 维度 | ONNX | TorchScript | TensorRT | PMML |
|---|---|---|---|---|
| 算子覆盖度 | 高(社区标准算子集) | 高(PyTorch 原生) | 中(仅支持 GPU 常用算子) | 低(仅传统 ML 算子) |
| 动态输入支持 | 部分支持(动态轴) | 完全支持(动态图) | 有限(需显式配置) | 不支持 |
| GPU 推理延迟 | 低(ONNX Runtime CUDA) | 中(LibTorch CUDA) | 极低(算子融合+INT8) | 高(Java 解释执行) |
| CPU 推理延迟 | 低(ONNX Runtime MLAS) | 中(LibTorch CPU) | 不适用 | 中(JPMML 解释) |
| 模型加密/保护 | 弱(标准 protobuf) | 中(可编译为二进制) | 强(引擎序列化) | 弱(XML 明文) |
| 跨平台部署 | 强(多语言 Runtime) | 中(C++/Python) | 弱(仅 NVIDIA GPU) | 强(Java 生态) |
避坑提醒: PMML 在风控场景中已逐渐边缘化。它无法表达深度学习模型中的复杂算子(如 Attention、Embedding),且序列化后的模型文件体积巨大(单棵 GBDT 可达数百 MB),不适合高吞吐在线服务。
4.3 序列化流程对比
4.3.1 ONNX 导出示例(PyTorch → ONNX)
import torch
import torch.onnx
model = MyRiskModel().eval()
dummy_input = torch.randn(1, 128) # batch_size=1, feature_dim=128
torch.onnx.export(
model,
dummy_input,
"risk_model.onnx",
input_names=["features"],
output_names=["score"],
dynamic_axes={"features": {0: "batch_size"}},
opset_version=17
)
4.3.2 TorchScript 导出示例(PyTorch → TorchScript)
import torch
model = MyRiskModel().eval()
example_input = torch.randn(1, 128)
# 方法一:Tracing(推荐静态图)
traced_model = torch.jit.trace(model, example_input)
traced_model.save("risk_model_traced.pt")
# 方法二:Scripting(支持动态控制流)
scripted_model = torch.jit.script(model)
scripted_model.save("risk_model_scripted.pt")
4.3.3 TensorRT 构建示例(ONNX → TensorRT)
import tensorrt as trt
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(TRT_LOGGER)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, TRT_LOGGER)
with open("risk_model.onnx", "rb") as f:
parser.parse(f.read())
config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30) # 1GB
config.set_flag(trt.BuilderFlag.FP16) # 启用 FP16 推理
engine = builder.build_serialized_network(network, config)
with open("risk_model_fp16.engine", "wb") as f:
f.write(engine)
4.3.4 PMML 导出示例(Scikit-learn → PMML)
from sklearn.ensemble import GradientBoostingClassifier
from sklearn2pmml import sklearn2pmml
from sklearn2pmml.pipeline import PMMLPipeline
model = GradientBoostingClassifier(n_estimators=100)
pipeline = PMMLPipeline([("classifier", model)])
pipeline.fit(X_train, y_train)
sklearn2pmml(pipeline, "risk_model_gbdt.pmml", with_repr=True)
4.4 选型原则:风控场景决策树
核心原则: 延迟预算 > 硬件环境 > 模型类型 > 团队技术栈。
- 延迟预算 < 5ms(GPU 在线) → 选择 TensorRT(FP16/INT8 量化),配合 ONNX 作为中间格式。
- 延迟预算 5~20ms(GPU/CPU 混合) → 选择 ONNX Runtime,支持动态 batch 和跨平台。
- 纯 PyTorch 技术栈,无跨框架需求 → 选择 TorchScript,减少序列化转换风险。
- 传统机器学习模型(GBDT/LR/ RF) → 优先 ONNX(通过 ONNX-ML 扩展),其次 PMML(仅当目标平台仅支持 Java)。
- 模型需要加密或防篡改 → 选择 TensorRT(引擎二进制)或 TorchScript(编译后二进制)。
4.5 风控场景实战建议
| 场景 | 推荐格式 | 推理引擎 | 延迟目标 |
|---|---|---|---|
| 实时反欺诈(GPU 集群) | ONNX → TensorRT | TensorRT C++ | < 3ms |
| 实时反欺诈(CPU 集群) | ONNX | ONNX Runtime C++ | < 10ms |
| 信用评分卡(GBDT 模型) | ONNX-ML | ONNX Runtime | < 20ms |
| 多模型集成(PyTorch 生态) | TorchScript | LibTorch C++ | < 15ms |
| 跨平台模型交换(Java 环境) | PMML | JPMML | < 50ms |
工程化最佳实践:
- 始终保留一份 ONNX 格式作为“通用中间表示”,方便后续切换推理引擎。
- TensorRT 引擎文件与 GPU 驱动、CUDA 版本强绑定,建议在 CI/CD 中构建而非手动导出。
- TorchScript 导出时优先使用
torch.jit.trace,仅当模型包含动态控制流时才使用torch.jit.script。 - PMML 仅用于传统 ML 模型,且建议限制单模型文件大小 < 50MB。
4.6 总结:格式选型矩阵
| 需求 | ONNX | TorchScript | TensorRT | PMML |
|---|---|---|---|---|
| 跨框架互操作 | ★★★★★ | ★★☆☆☆ | ★★★☆☆ | ★★★★☆ |
| GPU 极致低延迟 | ★★★★☆ | ★★★☆☆ | ★★★★★ | ★☆☆☆☆ |
| CPU 推理效率 | ★★★★★ | ★★★★☆ | ★☆☆☆☆ | ★★★☆☆ |
| 动态输入支持 | ★★★★☆ | ★★★★★ | ★★☆☆☆ | ★☆☆☆☆ |
| 模型保护能力 | ★★☆☆☆ | ★★★★☆ | ★★★★★ | ★☆☆☆☆ |
| 社区活跃度 | ★★★★★ | ★★★★☆ | ★★★★☆ | ★★☆☆☆ |
在低延迟风控在线 Serving 中,ONNX 是通用首选,TensorRT 是 GPU 极致优化选项,TorchScript 适合纯 PyTorch 技术栈,PMML 仅用于传统 ML 跨平台场景。选型时务必结合延迟预算、硬件环境、模型类型和团队技术栈综合决策。