機器學習工程與系統

ONNX 與執行時(ONNX and runtimes)

/ ON-niks and RUN-times /

ONNX(開放神經網路交換格式)是一種為練好的模型而設的、共享的檔案格式——一門通用的語言,讓一個在某框架裡造出來的模型,能被另一套工具載入並運行。執行時,則是真正在某塊特定硬體上高效執行模型的那台引擎。把 ONNX 想成機器學習裡的 PDF:你可以用任意一款文字處理軟體寫文件,但只要存成 PDF,誰都能在任何地方打開它。執行時,就是那個在你這台特定設備上飛快地把它顯示出來的 PDF 閱讀器。

為什麼這在具體層面要緊:模型常常在一個生態裡訓練(那生態有它自己描述網路的方式),卻需要跑到一個全然不同的地方去——一部手機、一個瀏覽器、一塊嵌入式晶片、一台帶特殊加速器的雲伺服器。沒有一種通用格式,每一次這樣的搬遷,都意味著痛苦而易錯的重寫。匯出成 ONNX,便把「模型是怎麼造的」與「它在哪兒跑」解了耦。像 ONNX Runtime 這樣的執行時,隨後接過那個檔案,施加針對硬體的最佳化——把運算融合起來、為這塊晶片挑出最快的實作——讓推論變得迅捷。

為什麼這很重要:這是一段不起眼的管道工程,卻讓同一個模型能在天差地別的環境裡運行,而好的執行時,能把推論比起一套粗糙的搭法顯著提速。誠實的提醒是:匯出這一步並不總是順當——稀奇古怪或自訂的運算有時翻譯不過去、版本會漂移,轉換後的模型偶爾會有微妙的行為差異、必須重新核驗。ONNX 是一個被廣泛採用的標準,但不是唯一的;而「匯出後聽天由命」是一個真實存在的翻車點;務必測一測,轉換後的模型給出的答案是否一致。

一個團隊在雲端 GPU 上訓練出一個圖像模型,把它匯出成 ONNX,同一個檔案隨後在三處跑起來:一個網頁瀏覽器、一個安卓應用、一台邊緣設備——每一處都用一套為自家硬體調校過的執行時,而無需重寫模型。

訓練一次,匯出成共享格式,到處都能跑——這正是 ONNX 生來要擔的角色。

把模型匯出成可攜的格式,並不保證無損或無 bug。不尋常的運算可能轉換失敗,數值結果也可能輕微漂移。把轉換當作一件要用「並排對比測試」去核驗的事,而不是想當然。

又稱
Open Neural Network Exchangeinference runtimeONNX Runtime运行时推理引擎