Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

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. 代码仓库

2.2. 核心定位与核心价值

维度 说明
核心目标 最大化ONNX模型的推理性能,支持云/边/端全场景部署
技术本质 轻量级推理引擎(C++核心 + Python/Java/C# 等多语言API封装)
关键优势 极低延迟 + 📦 高吞吐 + 🌐 跨平台(Windows/Linux/macOS/Android/iOS)
开源协议 MIT License(完全开源)

大模型开发的流程和关键环境: 数据准备 –> 模型训练 –> 模型部署。ONNX Runtime主要是解决模型部署环节的问题。

2.3. 核心架构剖析

  1. 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)
  2. 多层图优化器

    • 基础优化:死代码消除、冗余转置移除
    • 硬件感知优化
      • GPU上融合 Conv-BN-ReLU 为单节点
      • 量化感知优化(QDQ节点合并)
    • 动态优化:运行时根据输入形状调整计算图(如动态序列长度)
  3. 高效内存管理

    • 内存复用:预分配内存池,避免反复申请释放
    • 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
2
3
4
5
6
7
# 导出动态轴ONNX模型(批处理/可变分辨率)
torch.onnx.export(..., dynamic_axes={'input': [0, 2, 3]})

# ORT自动适配动态输入
ort_session = ort.InferenceSession("model.onnx")
ort_session.run(None, {"input": np.random.randn(4,3,256,256)}) # 批大小=4
ort_session.run(None, {"input": np.random.randn(1,3,512,512)}) # 分辨率=512x512

2.4.3. 量化工具链

1
2
3
from onnxruntime.quantization import quantize_dynamic
# 动态量化(无需校准数据)
quantized_model = quantize_dynamic("fp32_model.onnx", "int8_model.onnx")

3. ONNX 与 ONNX Runtime 的关系

3.1. 核心定位差异

组件 核心定位 关键特性
ONNX 模型交换标准 定义跨框架的模型表示格式(.onnx文件),包含计算图结构、算子定义、权重数据等,实现PyTorch/TensorFlow等框架的互操作。
ONNX Runtime 模型推理引擎 专为执行ONNX模型设计的高性能运行时,提供CPU/GPU/NPU等硬件的推理加速,并集成多种后端优化器(如TensorRT、OpenVINO)。

3.2. 功能职责对比

  1. ONNX的核心功能

    • 模型转换:提供各框架(PyTorch、TensorFlow等)到ONNX格式的导出接口(如torch.onnx.export())。
    • 格式标准化:统一存储模型计算图、算子版本、权重数据,确保跨平台一致性。
    • 兼容性校验:通过onnx.checker验证模型是否符合ONNX标准。
    • 可视化支持:配合Netron等工具解析模型结构。
  2. ONNX Runtime的核心功能

    • 异构执行:通过EP(Execution Provider)机制集成多硬件后端(如CUDA、TensorRT、OpenVINO),自动分割计算图并分配子图到最优硬件执行。
    • 图优化
      • 局部优化:消除冗余节点(如推理阶段的Dropout)。
      • 全局优化:算子融合(如Conv-BN-ReLU合并)、常量折叠等。
    • 推理接口:提供Python/C++/C# API,支持动态输入与批量处理。

3.3. 协作关系与典型工作流程

两者构成“标准-实现” 的协作范式:

  1. 训练框架导出模型
    PyTorch/TensorFlow模型 → 通过转换工具生成.onnx文件(ONNX格式)。

  2. ONNX Runtime加载与优化

    import onnxruntime as rt
    sess = rt.InferenceSession("model.onnx", providers=["CUDAExecutionProvider", "CPUExecutionProvider"])  # 指定硬件后端
    outputs = sess.run(None, {"input": data})  # 执行推理
    
  3. 运行时异构计算

    • ONNX Runtime按providers顺序分配子图(如GPU优先处理卷积,CPU兜底非常用算子)。
    • 优化后的子图提交给EP执行(如TensorRT编译GPU子图)。

3.4. 架构与执行机制对比

维度 ONNX ONNX Runtime
核心构成 协议规范(算子集、IR版本) 运行时引擎 + EP抽象层 + 图优化器
硬件交互 无直接硬件交互 通过EP对接CUDA/TensorRT等硬件SDK
计算优化 无运行时优化 JIT编译、算子融合、子图分区
执行模式 静态模型描述 动态计算图调度与异构执行

3.5. 适用场景对比

  • ONNX 适用场景

    • 框架间模型迁移(如PyTorch → TensorFlow)。
    • 作为中间格式接入下游推理引擎(如ONNX → TensorRT)。
  • ONNX Runtime 适用场景

    • 直接部署ONNX模型至生产环境(云/边缘设备)。
    • 需动态切换硬件后端的跨平台推理(如同一模型在CPU/GPU自动切换)。
    • 快速验证转换后模型的推理正确性。

评论