onnx.png

 

ONNX(Open Neural Network Exchange)是一套開放神經網路交換格式,由 Facebook、微軟結盟推出, 並獲得 Intel、AMD、ARM、IBM、華為和高通/聯發科晶片廠商支持加入 。 神經網路框架格式間的互通性,  讓不同標準的深度學習模型可以互相轉換,加快AI人工智慧的發展。目前有許多AI人工智慧Model,如 Google 的 TensorFlow、Facebook 的 Caffe2/PyTorch、微軟的CNTK、亞馬遜的 MXNet 等等。 為什麼需要框架之間有互通性?不同框架有不同優勢,因為某框架 表現比較好,你可以用它訓練了一個神經網路,然後用另一個框架來執行。  Facebook 和微軟合作就是為了解決這個問題。根據雙方透露的情況,未來CNTK、Caffe2 和 PyTorch 都會支援新的互通格式 ONNX。 但TensorFlow 目前是業界主流,已建立自己整個生態架構,並沒有要支援 ONNX,這是最大的缺憾。

微軟於2018/3/7公佈AI平台Windows Machine Learning (Windows ML),並預告將整合於春天釋出。微軟表示,Windows ML可分析Windows 10裝置上的機器學習模型,讓開發人員在其Windows 10 中使用預先訓練好的機器學習模型。 從Visual Studio Preview 15.7起,開發人員將可在UWP (Universal Windows Platform) 專案加入ONNX檔。意謂著未來在Python上訓練好的機器學習的模型,我們可以開發在Windows 10上面使用,滿足邊緣運算的應用。

AWS、Google及Azure是世界三大雲端運算平台,目前雲端上的機器學習都有提供更簡單的方式,滿足AI全民化的需求。舉微軟例子而言,Azure ML 可以輕易地從機器學習入手。上傳相關圖片,就可以深度學習,然後形成WebService API,提供各種應用程式存取。然而不是每個應用都可以連上網存取WebService,有時候需要的是邊緣運算。微軟提供一個輸出ONNX格式。我們就可以進一步在其它Python AI程式上做開發或使用微軟VS.Net 引入ONNX,開發成Windows 10可以執行的應用軟體。同樣的AWS雲端也是可以如此做,這就是ONNX標準格式的優點,值得推廣。

在AI的時代,對微軟而言有強烈的危機感,所以趕緊推出ML.Net來滿足開發人員對AI的需求 (如上圖所示)。 ML.NET 是免費的跨平台開放原始碼機器學習服務架構,可供您建置量身打造的機器學習解決方案,以及與 .NET 應用程式整合。 從圖示可以看出ML.NET 是支持分類(例如文本分類、情感分析)、迴歸(例如預測、價格預估)等機器學習,而不是深度學習。但ML.NET 是一個框架,它可以擴展將 TensorFlow、Accord.NET 和 CNTK 這樣的AI深度機器學習庫加進去,使得原本廣大使用C#的開發人員,可以花比較少的轉換學習時間,就搖身一變為全方位AI開發程式人員。

雖然TensorFlow官方不支援ONNX,但有心人士還是想辦法讓TensorFlow可以輸出ONNX,其中在GitHub上的TF2ONNX,就可以將TensorFlow models to ONNX models,但還是不能將ONNX格式引入TensorFlow。即使TensorFlow不支援ONNX,在邊緣運算方面,除了用TF2ONNX輸出給Windows10使用,還是可以使用TensorFlow+PyQT做成跨平台應用程式,滿足AI時代邊緣運算與物聯網IoT的整合應用。若對PyQT有興趣的人,可以參考我的另一篇文章:Qt Creator 4.7.0 Released

在以往整合Python AI應用與其它程式(C#/Java/PHP)等等,我們習慣用WebService(Web API)來做溝通橋樑。尤其是Python重新訓練的Model,若透過Web API,就不用像ONNX這樣,需輸出再引入程式及其它程式編譯的動作。但WebAPI比較不適合離線或即時的邊緣運算來使用,這時候ONNX格式的優點就顯現出來。但ONNX還是有一些缺點,比方說很多時候新版本的AI開發工具推出,但ONNX格式並沒有即時支援,在使用上大家會有比較大的疑慮。另一方面也是老大哥Google的TensorFlow不支援ONNX,而市面上超過一半的人工智慧應用開發者,還是選擇TensorFlow為主,期待有一天Google想通,能夠主動加入支援ONNX格式。

補充文章(2019/01/18):這陣子研究TensorFlow Serving的心得,開發者可以使用 TensorFlow 訓練模型,然後用 TensorFlow Serving 的 API 處理來自客戶端的數據輸入,類似Web API功能,訓練好的AI Model直接使用,不必再用Python框架--Flask/Django寫成Web API。

註1:  (2018/09/14)微軟釋出ML.NET 0.5,開始支援TensorFlow,開發者可以在ML.NET中直接使用已經訓練好的TensorFlow模型,等於是直接支援TensorFlow格式。

註2:  (2018/10/08) 微軟釋出ML.NET  0.6,開發者可以在ML.NET中直接使用已經訓練好的ONNX模型。

註3: (2019/01/10) 微軟釋出ML.NET 0.9,支援CUDA 10.0的GPU,以提高ONNX模型執行的能力,目前只能在64bit Windows上運作,之後將支援Linux/Mac。

註4: (2019/03/08) 微軟釋出ML.NET 0.11, 新增對文字輸入的支援,因此開發者可以在TensorFlow模型進行文字分析,開發情需分析等應用。

註5:(2019/05/06) 微軟釋出ML.NET 1.0,能自動為輸入的資料決定ML演算法,可以為開發者選擇使用分類或回歸演算法,降低應用程式應用機器學習的障礙。

註6:(2019/06/11) 微軟釋出ML.NET 1.1,新增異常偵測演算法,讓開發者來偵測各種異常事件。

註7:(2020/09/25) 微軟釋出ML.NET 1.52,提供物體偵測功能,也可以使用ML.Net CLI在本地端訓練圖像分類AI模型。

註8:(2020/11/23) ONNX Runtime是用來執行ONNX模型的推理引擎,可以在不同作業系統和硬體上執行,現在開發者可以在智慧型手機、嵌入式裝置和物聯網等邊緣裝置,以ONNX Runtime執行機器學習模型。

註9:(2021/12/21)  ONNX Runtime從1.10版本開始,支援使用Xamarin.Forms建置跨平台(Android/iOS)行動應用程式。新功能還包括加入X64和ARM64上的新量化核心,提升運算效能。

註10(2022/11/14)   微軟釋出ML.Net 2.0,更新重點包括文字分類和語句相似度API,並且改進自動化機器學習AutoML功能。

註11(2022/12/28)   微軟釋出ML.NET 3.0,加入英特爾oneDAL函式庫加速模型訓練

 

arrow
arrow

    賴源益 發表在 痞客邦 留言(0) 人氣()