1. ONNX
1.1. 什么是ONNX?
ONNX通常指.onnx模型文件
。ONNX(Open Neural Network Exchange
,开放神经网络交换)是一种开源格式,旨在表示机器学习模型,允许它们在不同框架之间无缝传输。通过提供标准化格式,ONNX 允许开发人员使用各种工具和库,优化工作流程并增强模型互操作性。
ONNX 解决了深度学习和机器学习领域的一个重大挑战,尤其是在工具、框架和运行时碎片化方面。ONNX出现之前,AI开发人员经常发现自己被锁定在TensorFlow、PyTorch等特定生态系统中;ONNX提供了一种解决方案,允许模型在不同平台之间共享,而无需重新训练或大量修改。
ONNX 定义了一组通用运算符、机器学习和深度学习模型的构建块以及统一的文件格式。这种标准化允许模型在一个框架中进行训练,然后在另一个框架中轻松使用或部署,从而增强了 AI 开发的灵活性。
1.2. ONNX 的发展历史
ONNX 最初由 Facebook 的 PyTorch 团队以”Toffee”的名义开发。2017 年 9 月,Facebook 和微软将该项目重新命名为 ONNX 并正式宣布。
目标是创建一个表示机器学习模型的开放标准,以促进更大的协作和创新。 ONNX 得到了 IBM、华为、英特尔、AMD、Arm 和高通等主要科技公司的广泛支持。
1.3. 关键特性
- 互操作性: 借助 ONNX,可以在一个框架中训练模型,然后在另一个框架中使用,从而增强了模型开发和部署的灵活性。
- 平台独立性: ONNX 包含一个高性能生态系统(
ONNX Runtime
),可以跨各种硬件平台优化和执行模型。这可确保模型高效运行,无论部署环境如何。 - 预训练模型: ONNX 提供各种在大型数据集上预训练的模型,节省时间和计算资源。
- 运算符: ONNX 提供一组通用运算符,将各种框架(如 TensorFlow、PyTorch 等)中的操作映射到标准化的 ONNX 格式。
- 社区支持: ONNX 由强大的开发者社区和主要科技公司管理,确保持续开发和创新。
- 定期更新: ONNX 由庞大的开发者社区和主要科技公司管理,定期更新以包含新功能和改进。
2. ONNX-Runtime
**ONNX Runtime (ORT)**是由微软开发的高性能跨平台推理引擎,专为执行ONNX模型设计。它不仅是ONNX生态的核心执行层,更通过硬件抽象、图优化和异构计算支持,成为工业级部署的首选工具。
2.1. 代码仓库
- 官网: https://onnxruntime.ai/
- ONNX Runtime源码: https://github.com/microsoft/onnxruntime
- C++ Demo源码:https://github.com/microsoft/onnxruntime-inference-examples/tree/main/c_cxx
2.2. 核心定位与核心价值
维度 | 说明 |
---|---|
核心目标 | 最大化ONNX模型的推理性能,支持云/边/端全场景部署 |
技术本质 | 轻量级推理引擎(C++核心 + Python/Java/C# 等多语言API封装) |
关键优势 | ⚡ 极低延迟 + 📦 高吞吐 + 🌐 跨平台(Windows/Linux/macOS/Android/iOS) |
开源协议 | MIT License(完全开源) |
大模型开发的流程和关键环境: 数据准备
–> 模型训练
–> 模型部署
。ONNX Runtime主要是解决模型部署
环节的问题。
2.3. 核心架构剖析
Execution Provider(EP)机制
ORT通过插件式EP对接不同硬件后端,实现异构计算:- CPU后端:默认使用MLAS(微软轻量代数库),可选MKL-DNN/OpenBLAS
- GPU后端:
CUDAExecutionProvider
:通用NVIDIA GPU加速TensorrtExecutionProvider
:调用TensorRT进一步优化子图(需NVIDIA GPU)
- 移动端/专用硬件:
CoreMLExecutionProvider
(Apple Silicon)CanonicalExecutionProvider
(华为昇腾NPU)OpenVINOExecutionProvider
(Intel CPU/iGPU)
多层图优化器
- 基础优化:死代码消除、冗余转置移除
- 硬件感知优化:
- GPU上融合
Conv-BN-ReLU
为单节点 - 量化感知优化(QDQ节点合并)
- GPU上融合
- 动态优化:运行时根据输入形状调整计算图(如动态序列长度)
高效内存管理
- 内存复用:预分配内存池,避免反复申请释放
- Zero-Copy:支持PyTorch/TensorFlow张量直接输入,避免数据拷贝
2.4. 关键性能特性
2.4.1. 极致推理加速
优化技术 | 效果示例 |
---|---|
算子融合 | 将Conv+BN+ReLU 合并为单算子,速度提升2x |
低精度推理 | FP16/INT8量化(CPU/GPU)提速3-5x |
异步执行 | 流水线并行,吞吐量提升40%+ |
实测数据(ResNet50 on NVIDIA T4):
- FP32:7ms(ORT+TensorRT EP) vs 15ms(原生PyTorch)
- INT8:2ms(ORT量化+TensorRT)
2.4.2. 动态输入支持
1 | # 导出动态轴ONNX模型(批处理/可变分辨率) |
2.4.3. 量化工具链
1 | from onnxruntime.quantization import quantize_dynamic |
3. ONNX 与 ONNX Runtime 的关系
3.1. 核心定位差异
组件 | 核心定位 | 关键特性 |
---|---|---|
ONNX | 模型交换标准 | 定义跨框架的模型表示格式(.onnx文件),包含计算图结构、算子定义、权重数据等,实现PyTorch/TensorFlow等框架的互操作。 |
ONNX Runtime | 模型推理引擎 | 专为执行ONNX模型设计的高性能运行时,提供CPU/GPU/NPU等硬件的推理加速,并集成多种后端优化器(如TensorRT、OpenVINO)。 |
3.2. 功能职责对比
ONNX的核心功能
- 模型转换:提供各框架(PyTorch、TensorFlow等)到ONNX格式的导出接口(如
torch.onnx.export()
)。 - 格式标准化:统一存储模型计算图、算子版本、权重数据,确保跨平台一致性。
- 兼容性校验:通过
onnx.checker
验证模型是否符合ONNX标准。 - 可视化支持:配合Netron等工具解析模型结构。
- 模型转换:提供各框架(PyTorch、TensorFlow等)到ONNX格式的导出接口(如
ONNX Runtime的核心功能
- 异构执行:通过EP(Execution Provider)机制集成多硬件后端(如CUDA、TensorRT、OpenVINO),自动分割计算图并分配子图到最优硬件执行。
- 图优化:
- 局部优化:消除冗余节点(如推理阶段的Dropout)。
- 全局优化:算子融合(如Conv-BN-ReLU合并)、常量折叠等。
- 推理接口:提供Python/C++/C# API,支持动态输入与批量处理。
3.3. 协作关系与典型工作流程
两者构成“标准-实现” 的协作范式:
训练框架导出模型
PyTorch/TensorFlow模型 → 通过转换工具生成.onnx
文件(ONNX格式)。ONNX Runtime加载与优化
import onnxruntime as rt sess = rt.InferenceSession("model.onnx", providers=["CUDAExecutionProvider", "CPUExecutionProvider"]) # 指定硬件后端 outputs = sess.run(None, {"input": data}) # 执行推理
运行时异构计算
- ONNX Runtime按
providers
顺序分配子图(如GPU优先处理卷积,CPU兜底非常用算子)。 - 优化后的子图提交给EP执行(如TensorRT编译GPU子图)。
- ONNX Runtime按
3.4. 架构与执行机制对比
维度 | ONNX | ONNX Runtime |
---|---|---|
核心构成 | 协议规范(算子集、IR版本) | 运行时引擎 + EP抽象层 + 图优化器 |
硬件交互 | 无直接硬件交互 | 通过EP对接CUDA/TensorRT等硬件SDK |
计算优化 | 无运行时优化 | JIT编译、算子融合、子图分区 |
执行模式 | 静态模型描述 | 动态计算图调度与异构执行 |
3.5. 适用场景对比
ONNX 适用场景:
- 框架间模型迁移(如PyTorch → TensorFlow)。
- 作为中间格式接入下游推理引擎(如ONNX → TensorRT)。
ONNX Runtime 适用场景:
- 直接部署ONNX模型至生产环境(云/边缘设备)。
- 需动态切换硬件后端的跨平台推理(如同一模型在CPU/GPU自动切换)。
- 快速验证转换后模型的推理正确性。