了解如何使用
Open Neural Network Exchange
(ONNX) 来帮助优化机器学习模型的推理。 推理或模型评分是将部署的模型用于预测(通常针对生产数据)的阶段。
优化用于推理(或模型评分)的机器学习模型非常困难,因为需要调整模型和推理库,充分利用硬件功能。 如果想要在不同类型的平台(云/Edge、CPU/GPU 等)上获得最佳性能,实现起来会异常困难,因为每个平台都有不同的功能和特性。 如果模型来自需要在各种平台上运行的多种框架,会极大增加复杂性。 优化框架和硬件的所有不同组合非常耗时。 这就需要一种解决方案,在首选框架中训练一次后能在云或 Edge 上的任意位置运行。 此时 ONNX 便派上了用场。
Microsoft 和合作伙伴社区创建了 ONNX 作为表示机器学习模型的开放标准。
许多框架
(包括 TensorFlow、PyTorch、SciKit-Learn、Keras、Chainer、MXNet、MATLAB 和 SparkML)中的模型都可以导出或转换为标准 ONNX 格式。 模型采用 ONNX 格式后,可在各种平台和设备上运行。
ONNX 运行时
是一种用于将 ONNX 模型部署到生产环境的高性能推理引擎。 它针对云和 Edge 进行了优化,适用于 Linux、Windows 和 Mac。 它使用 C++ 编写,还包含 C、Python、C#、Java 和 JavaScript (Node.js) API,可在各种环境中使用。 ONNX 运行时同时支持 DNN 和传统 ML 模型,并与不同硬件上的加速器(例如,NVidia GPU 上的 TensorRT、Intel 处理器上的 OpenVINO、Windows 上的 DirectML 等)集成。 通过使用 ONNX 运行时,可以从大量的生产级优化、测试和不断改进中受益。
ONNX 运行时用于大规模 Microsoft 服务,例如必应、Office 和 Azure AI。 性能提升取决于许多因素,但这些 Microsoft 服务的 CPU 平均起来可实现 2 倍的性能提升。 除了 Azure 机器学习服务外,ONNX 运行时还在支持机器学习工作负荷的其他产品中运行,包括:
Windows:该运行时作为
Windows 机器学习
的一部分内置于 Windows 中,在数亿台设备上运行。
Azure SQL 产品系列:针对
Azure SQL Edge
和
Azure SQL 托管实例
中的数据运行本机评分。
ML.NET:
在 ML.NET 中运行 ONNX 模型
。
获取 ONNX 模型
可通过以下几种方式获取 ONNX 模型:
通过 Azure 机器学习(参见本文底部的示例)或
自动机器学习功能
训练新的 ONNX 模型
将现有模型从其他格式转换为 ONNX(请参阅
教程
)
从
ONNX 模型 Zoo
获取预先定型的 ONNX 模型
通过
Azure AI 自定义视觉服务
生成自定义 ONNX 模型
许多模型(包括图像分类、对象检测和文本处理)都可以表示为 ONNX 模型。 如果遇到无法成功转换的模型的问题,请在所用的相应转换器的 GitHub 中提出问题。 可以继续使用现有的格式模型,直到问题得到解决。
在 Azure 中部署 ONNX 模型
使用 Azure 机器学习,可以部署、管理和监视 ONNX 模型。 使用标准
部署工作流
和 ONNX 运行时,可以创建在云中托管的 REST 终结点。 请参阅本文末尾的 Jupyter 笔记本示例,亲自试用。
安装 ONNX 运行时并与 Python 配合使用
ONNX 运行时的Python 包可用于
PyPi.org
(
CPU
和
GPU
)。 安装之前,请阅读
系统要求
。
若要安装适用于 Python 的 ONNX 运行时,请使用以下命令之一:
pip install onnxruntime # CPU build
pip install onnxruntime-gpu # GPU build
若要在 Python 脚本中调用 ONNX 运行时,请使用:
import onnxruntime
session = onnxruntime.InferenceSession("path to model")
模型附带的文档通常会指示有关使用模型的输入和输出。 还可使用可视化工具(如 Netron)查看模型。 ONNX 运行时还可以查询模型元数据、输入和输出:
session.get_modelmeta()
first_input_name = session.get_inputs()[0].name
first_output_name = session.get_outputs()[0].name
若要推理模型,请使用 run
,并传入要返回的输出列表(如果需要所有输出,则保留为空)和输入值的映射。 结果是输出列表。
results = session.run(["output1", "output2"], {
"input1": indata1, "input2": indata2})
results = session.run([], {"input1": indata1, "input2": indata2})
有关完整的 Python API 参考,请参阅 ONNX 运行时参考文档。
有关创建和部署 ONNX 模型的示例 Python 笔记本,请参阅 how-to-use-azureml/deployment/onnx。
阅读使用 Jupyter 笔记本探索此服务一文,了解如何运行笔记本。
有关其他语言的使用示例,请参阅 ONNX 运行时 GitHub。
详细了解 ONNX 或参与项目:
ONNX 项目网站
GitHub 上的 ONNX 代码
详细了解 ONNX 运行时或参与项目:
ONNX 运行时项目网站
ONNX 运行时 GitHub 存储库