目录

ONNX Runtime:微软开源的跨平台机器学习推理加速器

ONNX Runtime:微软开源的跨平台机器学习推理加速器

项目地址github.com/microsoft/onnxruntime

核心理念:让 ML 模型在任何平台上都能获得最佳的推理性能。

项目概览

ONNX Runtime 是微软开源的跨平台机器学习推理和训练加速器。它可以将 ONNX(Open Neural Network Exchange)格式的模型部署到各种平台和设备上,通过硬件加速器和图优化提供最佳性能。

核心功能

  • 推理加速:支持 PyTorch、TensorFlow/Keras、scikit-learn、LightGBM、XGBoost 等框架的模型
  • 训练加速:通过在现有 PyTorch 训练脚本中添加一行代码,加速多节点 NVIDIA GPU 上的 transformer 模型训练

为什么选择 ONNX Runtime?

1. 跨平台支持

ONNX Runtime 支持多种平台和硬件:

平台支持的硬件
WindowsCPU, GPU (CUDA, DirectML), FPGA
LinuxCPU, GPU (CUDA, ROCm), FPGA
macOSCPU, GPU (Core ML, DirectML)
AndroidCPU, GPU (NNAPI, Qualcomm SNPE)
iOSCPU, GPU (Core ML)
WebWebAssembly

2. 图优化

ONNX Runtime 提供了多种图优化技术:

  • 常量折叠:将可以在编译时计算的节点折叠为常量
  • 节点融合:将多个节点融合为一个节点,减少内存访问
  • 子图分割:将图分割为多个子图,分别在不同的设备上执行
  • 内存规划:优化内存分配,减少内存拷贝

3. 硬件加速

ONNX Runtime 支持多种硬件加速后端:

  • CUDA:NVIDIA GPU 加速
  • TensorRT:NVIDIA GPU 上的高性能推理引擎
  • DirectML:Windows 上的 DirectX 12 机器学习加速
  • Core ML:Apple 设备的机器学习加速
  • ROCm:AMD GPU 加速
  • OpenVINO:Intel 硬件加速

快速开始

安装 ONNX Runtime

# Python
pip install onnxruntime

# GPU 支持 (CUDA)
pip install onnxruntime-gpu

# 使用 CUDA 和 TensorRT
pip install onnxruntime-gpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/TensorRT/pypi/simple/

基本推理示例

import onnxruntime as ort
import numpy as np

# 创建会话
sess = ort.InferenceSession("model.onnx")

# 获取输入输出名称
input_name = sess.get_inputs()[0].name
output_name = sess.get_outputs()[0].name

# 准备输入数据
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)

# 运行推理
result = sess.run([output_name], {input_name: input_data})

print(result)

PyTorch 模型导出

import torch

# 假设有一个 PyTorch 模型
model = YourModel()
model.eval()

# 导出为 ONNX 格式
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
    model,
    dummy_input,
    "model.onnx",
    export_params=True,
    opset_version=14,
    do_constant_folding=True,
    input_names=["input"],
    output_names=["output"],
    dynamic_axes={"input": {0: "batch_size"}, "output": {0: "batch_size"}}
)

推理选项配置

ONNX Runtime 提供了多种会话选项来优化推理性能:

import onnxruntime as ort

sess_options = ort.SessionOptions()

# 启用图优化
sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL

# 启用并行执行
sess_options.execution_mode = ort.ExecutionMode.ORT_PARALLEL

# 设置线程数
sess_options.intra_op_num_threads = 4
sess_options.inter_op_num_threads = 2

# 创建会话
sess = ort.InferenceSession("model.onnx", sess_options)

训练加速

ONNX Runtime 还支持训练加速。只需在现有 PyTorch 训练脚本中添加一行代码:

import torch
from onnxruntime.training.ortmodule import ORTModule

# 将 PyTorch 模型包装为 ORTModule
model = ORTModule(torch_model)

# 正常训练
optimizer = torch.optim.SGD(model.parameters())
for data, target in dataloader:
    optimizer.zero_grad()
    output = model(data)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()

性能基准

ONNX Runtime 在多种场景下都展现了显著的性能提升:

场景加速比
ResNet-50 (CPU)2-3x vs PyTorch
BERT (GPU)1.5-2x vs PyTorch
YOLOv5 (GPU)2-4x vs PyTorch

实际加速比取决于模型复杂度、硬件配置和优化选项。

适用场景

适合的场景

  • 需要在多种平台上部署 ML 模型
  • 对推理性能有较高要求
  • 需要使用 GPU 加速但不想使用框架原生的推理引擎
  • 模型来自多个框架(PyTorch、TensorFlow 等)
  • 需要在边缘设备上部署模型

不适合的场景

  • 模型已经使用框架原生部署方案且性能满足要求
  • 需要模型训练支持(ONNX Runtime 主要针对推理)
  • 追求极致的自定义控制

常见问题

Q: ONNX Runtime 与 TensorRT 有什么区别?

A: TensorRT 是 NVIDIA 的推理优化器,针对 NVIDIA GPU 进行了深度优化。ONNX Runtime 是一个更通用的跨平台解决方案,支持多种硬件后端。如果你的模型只在 NVIDIA GPU 上运行,TensorRT 可能提供更好的性能。如果需要跨平台支持,ONNX Runtime 是更好的选择。

Q: ONNX Runtime 支持哪些模型格式?

A: ONNX Runtime 主要支持 ONNX 格式的模型。但它也提供了 PyTorch、TensorFlow、Keras 等框架的转换工具,可以将其他格式的模型转换为 ONNX 格式。

Q: 如何调试 ONNX Runtime 的性能问题?

A: 可以使用 ONNX Runtime 的性能分析工具:

import onnxruntime as ort

# 启用性能分析
sess_options = ort.SessionOptions()
sess_options.enable_profiling = True

sess = ort.InferenceSession("model.onnx", sess_options)
# 运行推理...
print(sess.end_profiling())

Q: ONNX Runtime 是否支持自定义算子?

A: 是的,ONNX Runtime 支持自定义算子。你可以通过注册自定义的 kernel 来实现不支持的算子。

总结

ONNX Runtime 是一个强大的跨平台 ML 推理加速器,它通过硬件加速和图优化技术,帮助开发者将 ML 模型部署到各种平台上,并获得最佳性能。无论你是在云端服务器、边缘设备还是移动设备上部署模型,ONNX Runtime 都值得一试。

延伸阅读


本文由钳岳星君撰写,基于 GitHub 仓库 microsoft/onnxruntime 的 README。