ONNX 與 Azure Machine Learning

本文說明 開放神經網路交換 (ONNX) 如何協助優化機器學習模型的推斷。 推論或模型評分是使用已部署模型產生生產資料預測的程序。

優化機器學習模型以進行推斷需要您微調模型和推斷連結庫,以充分利用硬體功能。 如果您想要在不同平台(例如雲端、邊緣、CPU 或 GPU)上獲得最佳效能,則此任務會變得複雜,因為每個平台都有不同的功能和特性。 如果您需要在不同的平臺上從各種架構執行模型,複雜度會增加。 若要將所有不同組合的架構和硬體最佳化,需要耗費大量時間。

有用的解決方案是在慣用的架構中訓練模型一次,然後將模型匯出或轉換成 ONNX,以便它可以在雲端或邊緣的任何位置執行。 Microsoft 和一群合作夥伴共同建立了 ONNX 來作為呈現機器學習模型的開放標準。 您可以將模型從 許多架構 匯出或轉換成標準 ONNX 格式。 支持的架構包括 TensorFlow、PyTorch、scikit-learn、Keras、Chainer、MXNet 和 MATLAB。 您可以在各種平台和裝置上,以 ONNX 格式執行模型。

此 ONNX 流程圖會顯示可用的架構和部署選項。

顯示定型、轉換和部署的 ONNX 流程圖。

ONNX 執行階段

ONNX Runtime 是高效能的推斷引擎,可將 ONNX 模型部署到生產環境。 ONNX 運行時間已針對雲端和邊緣優化,可在Linux、Windows和macOS上運作。 ONNX 是用 C++ 編寫的,但也有 C、Python、C#、Java 和 JavaScript (Node.js) API 可供您在這些環境中使用。

ONNX Runtime 支援深度神經網路 (DNN) 和傳統機器學習模型。 它與不同硬體上的加速器集成,例如 NVIDIA GPU 上的 TensorRT、Intel 處理器上的 OpenVINO 和 Windows 上的 DirectML。 使用 ONNX Runtime,您即可享有廣泛的生產級最佳化、測試與持續改進。

大規模 Microsoft 服務,例如 Bing、Office 和 Azure AI 會使用 ONNX Runtime。 雖然效能提升取決於許多因素,但這些 Microsoft 服務在 CPU 上平均效能增益 2 倍,因為它們使用 ONNX。 ONNX Runtime 會在 Azure 機器學習 和其他支持機器學習工作負載的Microsoft產品中執行,包括:

取得 ONNX 模型的方法

您可以透過數種方式取得 ONNX 模型:

您可以將許多模型表示為 ONNX,包括影像分類、物件偵測和文字處理模型。 如果您無法成功轉換模型,請在您使用之轉換程式的存放庫中提出 GitHub 問題。

Azure 中的 ONNX 模型部署

您可以在 Azure 機器學習 中部署、管理及監視您的 ONNX 模型。 藉由搭配 ONNX 執行階段使用標準 MLOps 部署工作流程 ,您可以建立裝載在雲端中的 REST 端點。

適用於 ONNX 運行時間的 Python 套件

CPU 和 GPU ONNX 執行階段的 Python 套件可在 PyPi.org 上取得。安裝前請務必檢閱系統需求。

若要安裝適用於 Python 的 ONNX Runtime,請使用下列其中一個命令:

pip install onnxruntime       # CPU build
pip install onnxruntime-gpu   # GPU build

若要在 Python 腳本中呼叫 ONNX Runtime,請使用下列程式代碼:

import onnxruntime
session = onnxruntime.InferenceSession("path to model")

模型隨附的文件通常會告訴您使用模型所需的輸入和輸出。 您也可以使用視覺效果工具 (例如 Netron) 來檢視模型。

ONNX Runtime 可讓您查詢模型元數據、輸入和輸出,如下所示:

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 檔。