共用方式為


ONNX 與 Azure Machine Learning

本文說明 Open Neural Network Exchange (ONNX) 如何協助優化機器學習模型的推斷 推斷或模型評分是使用已部署模型來產生生產數據預測的程式。

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

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

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

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

ONNX Runtime

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 運行時間,您可以受益於廣泛的生產等級優化、測試和持續改善。

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

取得 ONNX 模型的方式

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

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

Azure 中的 ONNX 模型部署

您可以在 Azure 機器學習 中部署、管理及監視您的 ONNX 模型。 您可以使用標準 MLOps 部署工作流程 搭配 ONNX 運行時間,建立裝載在雲端中的 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 檔