当需要在不同AI框架或硬件之间迁移模型,或者追求极致推理性能时,ONNX 就会变成关键桥梁。具体来说,以下场景都会用到它:

  • 跨框架迁移:用 PyTorch 训练,但生产环境是 TensorFlow 或用 TensorRT 加速,导出 ONNX 就能无缝转换。
  • 追求高性能推理:利用 TensorRT、OpenVINO 等专用推理引擎之前,通常会先把模型转为 ONNX,因为这些引擎对 ONNX 支持最好。
  • 跨平台/端侧部署:想一套模型在云端 GPU、手机(ONNX Runtime Mobile)、浏览器(ONNX.js)甚至嵌入式设备上运行,ONNX 是通用中介。
  • 模型交付与工具集成:模型交付给客户时不想暴露源码和训练细节,只给 .onnx 文件,对方就能用 Netron 可视化、直接推理。

一个端到端的 ONNX 部署例子流程

我们继续用“拍照识花”来说,假设你用 PyTorch 训练好了一个模型,现在要部署到云端 NVIDIA GPU 服务器上,并用 Triton Inference Server + TensorRT 获得极致吞吐量。ONNX 就出现在整个流程的枢纽位置。

1. 导出 ONNX 模型

在训练环境里,把训练好的 model.pth 导出为标准格式。

import torch

model = YourFlowerModel()
model.load_state_dict(torch.load("model.pth"))
model.eval()

dummy_input = torch.randn(1, 3, 224, 224)  # 模拟一张图
torch.onnx.export(model, dummy_input, "flower_model.onnx",
                  input_names=["input"], output_names=["output"],
                  opset_version=13)  # 推荐用较新版本算子集

这一步会生成 flower_model.onnx,它记录了完整的计算图和所有权重。

2. 验证与可视化(可选但强烈推荐)

用开源工具 Netron 打开 flower_model.onnx,检查输入输出形状、算子是否和预期一致,避免导出错误。

3. 优化:ONNX → TensorRT 引擎

为了提高推理速度,我们通过 TensorRT 对 ONNX 模型做极致优化。

# 使用 trtexec 命令行工具转换
trtexec --onnx=flower_model.onnx \
        --saveEngine=flower_model.plan \
        --fp16  # 开启半精度加速

TensorRT 会进行层融合、内存优化、精度校准,生成一个针对当前 GPU 高度优化的 .plan 引擎文件。

4. 配置推理服务器

把生成的 flower_model.plan 放入 Triton 的模型仓库,配置 config.pbtxt 文件,指定后端为 TensorRT,设置最大批次、输入输出等。

5. 启动服务与在线推理

启动 Triton 后,手机 App 拍照,把图片通过 HTTP/gRPC 发给服务器:

POST /v2/models/flower_model/infer
{
  "inputs": [{"name": "input", "data": [...]}]
}

Triton 在服务端用 TensorRT 引擎高速推理,返回识别结果(如“向日葵”)。


这个流程里,ONNX 的价值在于“解耦”:训练框架只负责导出 ONNX,推理引擎只负责读取 ONNX 并优化。中间不需要手动重写任何网络结构,也不存在框架绑定,后续你如果想换用 OpenVINO 在 Intel CPU 上跑,直接拿同一个 flower_model.onnx 去转换即可。