ONNX 和 Azure 機器學習

瞭解如何使用 開放式類神經網路交換 (ONNX) 來協助優化機器學習模型的推斷。 推斷模型評分是使用已部署模型來產生生產數據預測的程式。

優化機器學習模型進行推斷需要您微調模型和推斷連結庫,以充分利用硬體功能。 如果您想要在雲端或邊緣、CPU 或 GPU 等不同種類的平臺上取得最佳效能,此工作會變得複雜,因為每個平臺都有不同的功能和特性。 如果您有需要在不同平臺上執行的各種架構模型,複雜度會增加。 將架構和硬體的所有不同組合優化可能很耗時。 因此,有用的解決方案是在慣用的架構中定型模型一次,然後在雲端或邊緣的任何位置執行此解決方案,這是 ONNX 的所在位置。

什麼是 ONNX?

Microsoft 和合作夥伴社群建立 ONNX 作為代表機器學習模型的開放標準。 來自 許多架構的 模型,包括 TensorFlow、PyTorch、scikit-learn、Keras、Chainer、MXNet 和 MATLAB,都可以導出或轉換成標準 ONNX 格式。 模型一旦使用 ONNX 格式,就可以在各種平台和裝置上執行。

ONNX 運行時間 是高效能推斷引擎,可用來將 ONNX 模型部署到生產環境。 它已針對雲端和邊緣進行優化,可在Linux、Windows和Mac上運作。 雖然 ONNX 是以 C++ 撰寫,但它也有 C、Python、C#、Java 和 JavaScript (Node.js) API,以供許多環境中使用。 ONNX 運行時間同時支援深度神經網路(DNN)和傳統機器學習模型,而且它與不同硬體上的加速器整合,例如 Nvidia GPU 上的 TensorRT、Intel 處理器上的 OpenVINO,以及 Windows 上的 DirectML。 藉由使用 ONNX 運行時間,您可以受益於廣泛的生產等級優化、測試和持續改善。

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

  • Windows:運行時間內建於 Windows 中,作為 Windows 機器學習一部分,並在數億部裝置上執行。
  • Azure SQL 產品系列:對 Azure SQL Edge 中的數據執行原生評分,並 Azure SQL 受控執行個體
  • ML.NET:在 ML.NET 中執行 ONNX 模型。

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

如何取得 ONNX 模型

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

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

Azure 中的 ONNX 模型部署

使用 Azure 機器學習,您可以部署、管理及監視您的 ONNX 模型。 使用標準 MLOps 部署工作流程 和 ONNX 運行時間,您可以建立裝載在雲端中的 REST 端點。 如需實際操作範例,請參閱這些 Jupyter Notebook

搭配 Python 安裝及使用 ONNX 運行時間

適用於 ONNX 執行時間的 Python 套件可在 PyPi.org (CPU 和 GPU) 上使用 請務必在安裝之前檢閱 系統需求

若要安裝適用於 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 執行時間參考檔

範例

深入瞭解 ONNX 或參與專案:

深入瞭解 ONNX 執行時間 或參與專案: