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 选型原则:风控场景决策树

核心原则: 延迟预算 > 硬件环境 > 模型类型 > 团队技术栈。
  1. 延迟预算 < 5ms(GPU 在线) → 选择 TensorRT(FP16/INT8 量化),配合 ONNX 作为中间格式。
  2. 延迟预算 5~20ms(GPU/CPU 混合) → 选择 ONNX Runtime,支持动态 batch 和跨平台。
  3. 纯 PyTorch 技术栈,无跨框架需求 → 选择 TorchScript,减少序列化转换风险。
  4. 传统机器学习模型(GBDT/LR/ RF) → 优先 ONNX(通过 ONNX-ML 扩展),其次 PMML(仅当目标平台仅支持 Java)。
  5. 模型需要加密或防篡改 → 选择 TensorRT(引擎二进制)或 TorchScript(编译后二进制)。
风控模型序列化格式选型决策树 模型序列化格式选型 延迟预算 < 5ms ? 是 否 TensorRT (GPU) 延迟预算 < 20ms ? 是 否 ONNX Runtime 模型类型 ? 传统 ML 深度学习 ONNX-ML / PMML TorchScript 选型优先级:延迟预算 > 硬件环境 > 模型类型 > 团队技术栈 GPU 场景优先 TensorRT/ONNX Runtime;CPU 场景优先 ONNX Runtime;纯 PyTorch 栈可选 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 跨平台场景。选型时务必结合延迟预算、硬件环境、模型类型和团队技术栈综合决策。