你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

ONNX 和 Azure 机器学习

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

要优化机器学习模型以进行推理,需要优化模型和推理库,以充分利用硬件功能。 如果要在不同类型的平台上(例如云或边缘、CPU 或 GPU 等)获得最佳性能,此任务会变得复杂,因为每个平台具有不同的功能和特征。 如果具有需要在不同平台上运行的各种框架的模型,复杂性就会增加。 优化框架和硬件的所有不同组合会很耗时。 因此,一种有用的解决方案是在你偏好的框架中训练模型一次,然后在云或边缘的任何位置运行它 - 此解决方案就是 ONNX 发挥作用的地方。

什么是 ONNX?

Microsoft 和合作伙伴社区创建了 ONNX 作为表示机器学习模型的开放标准。 许多框架(包括 TensorFlow、PyTorch、scikit-learn、Keras、Chainer、MXNet 和 MATLAB)的模型都可以导出或转换为标准 ONNX 格式。 在模型采用 ONNX 格式后,可以在各种平台和设备上运行这些模型。

ONNX 运行时是一种用于将 ONNX 模型部署到生产环境的高性能推理引擎。 它针对云和 Edge 进行了优化,适用于 Linux、Windows 和 Mac。 虽然 ONNX 是使用 C++ 编写的,但它也有 C、Python、C#、Java 和 JavaScript (Node.js) API,可在多种环境中使用。 ONNX 运行时同时支持深度神经网络 (DNN) 和传统机器学习模型,并与不同硬件上的加速器(例如,Nvidia GPU 上的 TensorRT、Intel 处理器上的 OpenVINO、Windows 上的 DirectML)集成。 通过使用 ONNX 运行时,可以从大量的生产级优化、测试和不断改进中受益。

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

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

如何获取 ONNX 模型

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

许多模型(包括图像分类、对象检测和文本处理模型)都可以表示为 ONNX 模型。 如果遇到了模型无法成功转换的问题,请在所用的转换器的存储库中发起 GitHub 议题。 你可以继续使用现有的模型格式,直到问题得到解决。

Azure 中的 ONNX 模型部署

使用 Azure 机器学习,可以部署、管理和监视 ONNX 模型。 借助标准 MLOps 部署工作流和 ONNX 运行时,可以创建在云中托管的 REST 终结点。 如需动手示例,请参阅这些 Jupyter 笔记本

通过 Python 安装和使用 ONNX 运行时

ONNX 运行时的 Python 包可在 PyPi.org 获取(CPUGPU)。 在安装之前,请务必查看系统要求

若要安装适用于 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 或参与项目:

详细了解 ONNX 运行时或参与项目: