ONNX 和 Azure 机器学习

本文介绍了 Open Neural Network Exchange (ONNX) 如何帮助优化机器学习模型的推理。 推理或模型评分是使用部署的模型生成对生产数据的预测的过程。

优化机器学习模型以进行推理需要调整模型和推理库,以便充分利用硬件功能。 如果想要在不同平台(如云、边缘、CPU 或 GPU)上获得最佳性能,则此任务会变得复杂,因为每个平台都有不同的功能和特征。 如果需要在不同平台上运行来自各种框架的模型,则复杂性会增加。 优化框架和硬件的所有不同组合会很耗时。

一个有用的解决方案是在首选框架中训练模型一次,然后将其导出或转换为 ONNX,以便可以在云或边缘的任何位置运行。 Microsoft 和合作伙伴社区创建了 ONNX 作为表示机器学习模型的开放标准。 可以将模型从许多框架导出或转换为标准 ONNX 格式。 支持的框架包括 TensorFlow、PyTorch、scikit-learn、Keras、Chainer、MXNet 和 MATLAB。 可以在各种平台和设备上以 ONNX 格式运行模型。

此 ONNX 流图显示了可用的框架和部署选项。

ONNX 流程图,其中显示了训练、转换器和部署。

ONNX 运行时

ONNX 运行时是一种用于将 ONNX 模型部署到生产环境的高性能推理引擎。 ONNX 运行时已针对云和边缘进行了优化,适用于 Linux、Windows 和 macOS。 ONNX 是采用 C++ 编写的,但也具有可在这些环境中使用的 C、Python、C#、Java 和 JavaScript (Node.js) API。

ONNX 运行时同时支持深度神经网络 (DNN) 和传统机器学习模型,并与不同硬件上的加速器(例如,Nvidia GPU 上的 TensorRT、Intel 处理器上的 OpenVINO、Windows 上的 DirectML)集成。 通过使用 ONNX Runtime,可以从广泛的生产级优化、测试和持续改进中受益。

Bing、Office 和 Azure AI 等大规模 Microsoft 服务使用 ONNX 运行时。 尽管性能提升取决于许多因素,但这些 Microsoft 服务报告称,使用 ONNX 时,CPU 性能平均提高了 2 倍。 ONNX 运行时在 Azure 机器学习和其他支持机器学习工作负荷的 Microsoft 产品中运行,包括:

获取 ONNX 模型的方法

可通过以下几种方式获取 ONNX 模型:

可以将许多模型表示为 ONNX,包括图像分类、对象检测和文本处理模型。 如果无法成功转换模型,请在使用的转换器的存储库中提交 GitHub 问题。

Azure 中的 ONNX 模型部署

可以在 Azure 机器学习中部署、管理和监视 ONNX 模型。 将标准 MLOps 部署工作流与 ONNX 运行时结合使用,可以创建托管在云端的 REST 终结点。

ONNX 运行时的 Python 包

PyPi.org 上提供了适用于 CPUGPU ONNX 运行时的 Python 包。在安装之前,请务必查看系统要求。

若要安装适用于 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})

若要查看完整的 ONNX 运行时 API 参考,请参阅 Python API 文档