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 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產品中執行,包括:
- 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 套件
適用於 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 檔。