ONNX Runtime:微软开源的跨平台机器学习推理加速器
posts posts 2026-04-24T12:00:00+08:00ONNX Runtime 是微软开源的跨平台机器学习推理和训练加速器,支持 PyTorch、TensorFlow/Keras、scikit-learn、LightGBM、XGBoost 等框架。它通过硬件加速器和图优化提供最佳性能。技术笔记机器学习, ONNX, 微软, 推理加速, PyTorchONNX 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 支持多种平台和硬件:
| 平台 | 支持的硬件 |
|---|---|
| Windows | CPU, GPU (CUDA, DirectML), FPGA |
| Linux | CPU, GPU (CUDA, ROCm), FPGA |
| macOS | CPU, GPU (Core ML, DirectML) |
| Android | CPU, GPU (NNAPI, Qualcomm SNPE) |
| iOS | CPU, GPU (Core ML) |
| Web | WebAssembly |
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。