你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
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 运行时已针对云和边缘进行了优化,适用于 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 产品中运行,包括:
- Windows。 ONNX 运行时作为 Windows 机器学习的一部分内置于 Windows 中,在数亿台设备上运行。
- Azure SQL。 Azure SQL Edge 和 Azure SQL 托管实例使用 ONNX 对数据运行本机评分。
- ML.NET。 若要查看示例,请参阅教程:在 ML.NET 中使用 ONNX 检测对象。
获取 ONNX 模型的方法
可通过以下几种方式获取 ONNX 模型:
- 在 Azure 机器学习中训练新 ONNX 模型或使用自动化机器学习功能。
- 将现有模型从其他格式转换为 ONNX。 若要详细了解,请参阅 ONNX 教程。
- 从 ONNX Model Zoo 获取预训练的 ONNX 模型。
- 通过 Azure AI 自定义视觉服务生成自定义 ONNX 模型。
可以将许多模型表示为 ONNX,包括图像分类、对象检测和文本处理模型。 如果无法成功转换模型,请在使用的转换器的存储库中提交 GitHub 问题。
Azure 中的 ONNX 模型部署
可以在 Azure 机器学习中部署、管理和监视 ONNX 模型。 将标准 MLOps 部署工作流与 ONNX 运行时结合使用,可以创建托管在云端的 REST 终结点。
ONNX 运行时的 Python 包
PyPi.org 上提供了适用于 CPU 和 GPU 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 文档。