目前社群已經有多個移動端深度學習推理架構,如:NCNN、MNN... 這些推理引擎都給社群的使用者帶來了在移動端上部署深度學習非常多的便利,但是他們也都有一個共性問題:随着不斷地疊代以及性能優化,運作時庫會逐漸的增大,特别是在不同算子 fuse 的時候,會導緻非常多的長尾算子,這就會增大我們 App 或者 SDK 的體積。
為了解決這個問題,由 MegEngine 團隊開源的 MegCC 創新使用模型預編譯的方案,生成模型推理必要的代碼,去除掉了和模型推理無關的代碼,是以極大程度上減少了推理引擎的體積。主要方法是:
将傳統架構運作時的必要步驟:計算圖優化、Kernel 選擇、記憶體配置設定都移到編譯時,進而最大程度上減少了 Runtime 時的二進制體積大小,并根據模型資訊做進一步的性能優化。
該方案有以下優點:
- 随着架構的疊代将不會使得推理引擎的體積增大
- 很多的算子融合可以在編譯時根據模型資訊生成對應的 code
- 模型編譯時可以獲得整個計算圖的資訊,這樣可以進一步進行極緻的性能優化
- 可以吸收社群在代碼生成方面的經驗用于為 MegCC 生成 code
不同于傳統推理架構,MegCC 是一個真真實實的深度學習模型編譯器,具備極其輕量的 Runtime 二進制體積,高性能,友善移植,極低記憶體使用以及快啟動等核心特點。使用者可在 MLIR 上進行計算圖優化,記憶體規劃,最後通過預先寫好的 code 模版進行代碼生成。目前,MegCC 已支援 Arm64,Armv7,x86,risc-v 以及單片機平台。
GitHub 開源位址:https://github.com/MegEngine/MegCCgithub.com/MegEngine/MegCC
使用方法及效果
使用 MegCC 完成模型部署隻需要完成以下 3 步:
- 模型編譯:編譯 MegEngine 模型,生成運作這個模型對應的 Kernel 以及優化之後的模型。
- Runtime編譯:這個階段會将 Runtime 和上一步中生成的 Kernel 一起編譯成一個靜态庫。
- 內建到應用中:調用上一步編譯的靜态庫的接口進行推理。
以 YOLOX 模型為例,運作效果如下圖:
從圖中可見,MegCC 生成的推理程式在保證推理性能良好(模型測速結果為 670ms)的情況下,其大小可以達到 95KB。
詳細操作文檔:MegCC/how-to-use-chinese.md at main · MegEngine/MegCC
手把手操作教程:挑戰 100KB 可執行程式高性能推理 YOLOX 模型
未來計劃
目前 MegCC 僅支援 MegEngine 模型作為輸入,其他模型格式可以考慮轉換到 ONNX,然後通過 mgeconvert 進行模型格式轉換。
預計在未來 2 個月内,MegCC 将支援更多的模型格式編譯。同時實作以下進階功能:
- 支援ONNX模型作為輸入
- 做更多的Kernel fusion
- 支援更多的後端裝置
大家在使用 MegCC 過程中有任何問題,歡迎随時提 issue 告訴我們,也歡迎提 PR 幫助 MegCC 變得更好。
精彩分享
- 概述目前端上推理的現狀,主要是推理引擎體積方面的情況
- 介紹 MegCC 的編譯器方案
- 分享「超輕量、高性能、擴充性強」等特性的實作思路
- 總結 MegCC 的現狀、優勢以及未來的計劃