ONNX 與 Azure Machine Learning:建立並加速 ML 模型

了解使用 Open Neural Network Exchange (ONNX) 如何有助於將機器學習模型的推斷最佳化。 推斷 (或模型評分) 是將部署的模型用於預測的階段,通常用於生產資料。

因為您需要微調模型和推斷程式庫以充分利用硬體功能,所以很難將用於推斷 (或模型評分) 的機器學習模型最佳化。 如果您想要在不同種類的平台上 (雲端/邊緣、CPU/GPU 等) 獲得最佳效能,則問題會變得非常困難,因為每個平台各有不同的功能和特性。 如果您的模型來自各種架構而需要在各種平台上執行,複雜性會再增加。 若要將所有不同組合的架構和硬體最佳化,需要耗費大量時間。 因此,我們需要一種只要在您慣用的架構中定型一次,就能在雲端或邊緣上的任何地方執行的解決方案。 這就是 ONNX 的誕生原因。

Microsoft 和一群合作夥伴共同建立了 ONNX 來作為呈現機器學習模型的開放標準。 許多架構 (包括 TensorFlow、PyTorch、SciKit-Learn、Keras、Chainer、MXNet、MATLAB 和 SparkML) 的模型都可以匯出或轉換為標準的 ONNX 格式。 一旦模型採用 ONNX 格式,就可以在各種不同的平台和裝置上執行。

ONNX Runtime 是高效能的推斷引擎,可將 ONNX 模型部署到生產環境。 其已針對雲端和邊緣進行了最佳化,可在 Linux、Windows 和 Mac 上運作。 以 C++ 撰寫,但其也有 C、Python、C#、Java 和 Javascript (Node.js) API 可供用於各種環境。 ONNX Runtime 同時支援 DNN 和傳統的 ML 模型,並與不同硬體上的加速器整合,例如 NVidia GPU 上的 TensorRT、Intel 處理器上的 OpenVINO、Windows 上的 DirectML 等等。 藉由使用 ONNX Runtime,您可從大量的生產級最佳化、測試和持續的改進獲得好處。

ONNX Runtime 會用於大規模的 Microsoft 服務,例如 Bing、Office 和 Azure 認知服務。 效能提升取決於許多因素,但這些 Microsoft 服務已實現平均 2 倍的 CPU 效能提升。 除了 Azure Machine Learning 服務之外,ONNX Runtime 也能在支援機器學習工作負載的其他產品中執行,包括:

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

取得 ONNX 模型

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

許多模型 (包括影像分類、物件偵測和文字處理) 均可呈現為 ONNX 模型。 如果某個模型遇到無法成功轉換的問題,請在所用個別轉換器的 GitHub 中提出問題。 您可以繼續使用現有格式的模型,直到問題解決為止。

在 Azure 中部署 ONNX 模型

Azure Machine Learning 可讓您部署、管理及監視 ONNX 模型。 使用標準部署工作流程和 ONNX Runtime,您可以建立裝載於雲端中的 REST 端點。 請參閱本文結尾的 Jupyter Notebook 範例,自行嘗試看看。

使用 Python 來安裝和使用 ONNX Runtime

您可在 PyPi.org (CPUGPU) 上取得 ONNX Runtime 的 Python 套件。 請先閱讀系統需求再進行安裝。

若要安裝適用於 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})

如需完整的 Python API 參考,請參閱 ONNX Runtime 參考文件 (英文)。

範例

請參閱 how-to-use-azureml/deployment/onnx,以取得建立與部署 ONNX 模型的範例 Python 筆記本。

了解如何依照使用 Jupyter 筆記本來探索這項服務一文來執行筆記本。

您可以在 ONNX Runtime GitHub 中找到其他語言的用法範例。

其他資訊

深入了解 ONNX 或參與專案:

深入了解 ONNX Runtime 或參與專案: