TensorFlow?PyTorch?Paddle?AI工具庫生態之爭:ONNX將一統天下

💡 作者:韓信子@ShowMeAI
📘 深度學習實戰系列//www.showmeai.tech/tutorials/42
📘 本文地址//www.showmeai.tech/article-detail/319
📢 聲明:版權所有,轉載請聯繫平台與作者並註明出處
📢 收藏ShowMeAI查看更多精彩內容

當今的很多AI演算法落地,我們都需要依賴特定的機器學習框架,現在比較熱門的 AI 工具庫如 TensorFlow 和 PyTorch 都出自大廠,並且有很好的生態和資源,藉助它們我們可以很快速完成典型的一些任務,如影像分類或自然語言處理。

然而,工具庫和工具庫之間的相互切換,是一件很麻煩的事情,比如某公司團隊開發主要使用TensorFlow,然而現在有一個深度演算法,需要使用 caffe2 部署在移動設備上,那我們需要用 caffe2 重寫模型重新訓練,這是一個非常耗時耗力的過程。

ONNX 便應運而生,TensorFlow、Caffe2、PyTorch、paddlepaddle、Microsoft Cognitive Toolkit、Apache MXNet 等主流框架都對 ONNX 有著不同程度的支援。這就便於了我們的演算法及模型在不同的框架之間的遷移

ONNX(Open Neural Network Exchange)是一種針對機器學習所設計的開放式的文件格式,用於存儲訓練好的模型。它使得不同的人工智慧框架(如PyTorch,TensorRT,MXNet)可以採用相同格式存儲模型數據並交互。 ONNX的規範及程式碼主要由微軟,亞馬遜 ,Facebook 和 IBM 等公司共同開發,以開放源程式碼的方式託管在Github上。

💡 ONNX 官方資源

  • 支援的工具庫

💡 為什麼需要ONNX

機器學習/深度學習的出現和蓬勃發展的背景下,深度學習/機器學習模型訓練與執行的框架/庫的數量呈指數級增長。有兩大原因促成這個增長:

  • 硬體供應商開發了自己的框架以實現垂直集成並使其更容易為他們的硬體開發模型
  • 開發自己的框架以針對特定用例實現最佳性能的軟體供應商

深度學習框架數量的激增導致整個AI生態系統碎片化,也使跨框架或硬體生態系統的工作變得困難。ONNX 的誕生是為了消除框架之間以及不同硬體生態系統之間互操作性的障礙。

💡 什麼是ONNX

ONNX 是一個開放規範,包含以下定義:

📌 計算圖模型存儲文件格式

模型:是一個保存版本資訊和元數據的非循環計算數據流圖。

:包含模型中數據流圖的名稱、形成圖的計算節點列表、圖的輸入和輸出。

計算節點:圖中的每個計算節點都接受零個或多個 📘定義類型、一個或多個定義類型的輸出以及特定節點對其輸入執行的操作類型。

📌 標準數據類型

ONNX 作為標準支援以下數據類型列表:

張量類型

  • Int8、Int16、Int32、Int64
  • Quantized Int
  • uint8, uint16, uint32, uint64
  • Float16, float, double
  • Bool
  • String
  • Complex64, complex128

非張量類型

  • Sequence
  • Map
  • Operators (Built-in/ Custom)

📌 運算元/運算符

ONNX Graph 中的每個計算節點都執行特定的操作併產生一個或多個輸出。 ONNX 標準定義了 📘運算符,ONNX圖支援的運算符列表也在不斷拓展,並通過 ONNX Opsets 保持最新狀態。每次 ONNX Opset 更新都可能新增運算元支援或改進現有運算元。

💡 ONNX的目標

ONNX 的核心設計理念是:

  • 互操作性
  • 可移植性

如上圖所示,ONNX 希望通過提供一個高效的介面將模型從一個框架轉換到另一個框架,從而成為不同框架之間的中介。

下表中列出了將模型從一些最常見的AI框架轉換為 ONNX 格式的工具。

💡 ONNX實現與現狀

實際上,要滿足將模型從任何其他AI框架轉換為ONNX一直是一個挑戰。主要障礙之一是這些AI框架生態的高速發展與每次版本迭代帶來的新支援(例如運算元等)。

模型從一個框架到另一個框架的轉換歸結為能夠表示原始模型的基礎數學運算。下圖顯示了每個框架中定義的運算符數量。實際上,目前ONNX僅支援PyTorch所有運算元的約13% ,一些使用低頻 PyTorch 運算符構建的模型在轉換時還是有困難。

不過像PyTorch這樣的工具庫里,包含的很多運算符有這一樣或者類似的功能,是否需要完全同步支援也是一個問題。但ONNX開放了自定義運算符的功能,使得用戶可以 📘根據需要添加自己的功能

即使目前 ONNX 還做不到完全支援和自由銜接所有AI工具框架,但憑藉豐富的運算符集,ONNX已經可以描述來自各種框架的大多數 DNN 和 ML 模型。它的『函數』功能,使得用戶可以把暫時不支援的複雜的操作符用更原始的操作符來表達 。

它帶來了AI生態的自由流通,隨著生態和社區的高速發展,相信在未來ONNX會成為AI生態中最終的橋樑之一,發揮巨大的作用。

參考資料