推理框架概覽

haoliuhust發表於2022-03-22


工作中涉及到在各種各樣的硬體上做神經網路的推理,對使用到的一些框架做一個梳理彙總。

資訊彙總

框架 專案地址 平臺支援 所屬公司 特點
NCNN https://github.com/Tencent/ncnn image 騰訊 開放時間比較早,資源較多
TNN https://github.com/Tencent/TNN image 騰訊 與其他框架相比,支援跨模型的記憶體複用,對於記憶體比較吃緊的情況有用
MNN https://github.com/alibaba/MNN ARM CPU, ARM GPU, X86 CPU, CUDA 阿里 支援的裝置型別多,優化較好
Paddle-Lite https://github.com/PaddlePaddle/Paddle-Lite image 百度 有配套訓練框架,方便做量化重訓練
OpenVino https://docs.openvino.ai/latest/index.html Intel CPU, GPU, VPU Intel Intel CPU官方框架
TensorRT https://docs.nvidia.com/deeplearning/tensorrt/ NVIDIA GPU 英偉達 英偉達顯示卡的官方框架

使用體驗

1. MNN VS NCNN

最初從NCNN往MNN切的時候(19年),MNN總體比NCNN快了25%,不知道現在的情況是怎麼樣,據說ncnn後來也優化了,這就不瞭解了,沒有再繼續對比了,加上那時NCNN還沒有支援arm的GPU,整體上比MNN弱了些。MNN的跨平臺做的挺好,Windows上用也很方便。
小插曲:在把MNN用到RK3399的GPU上的時候,UI會比較卡頓,原因是模型推理時,GPU使用率會到100%,最後是參考小米的MACE,對OpenCL的命令佇列做了個限制,詳情參考:https://github.com/alibaba/MNN/issues/495

2.TNN

使用TNN的契機是有一個專案要在3518ev300上做,記憶體比較吃緊。剛開始使用MNN,記憶體不夠,然後又嘗試了Paddle-Lite跑Int8模型,還是起不來,偶然看到了TNN的一個特性:

記憶體優化

高效”記憶體池”實現:通過 DAG 網路計算圖分析,實現無計算依賴的節點間複用記憶體,降低 90% 記憶體資源消耗
跨模型記憶體複用:支援外部實時指定用於網路記憶體,實現“多個模型,單份記憶體”。

主要是第二點,在其他框架沒有發現。使用這個特性,就可以只消耗最大的模型所需要的記憶體了,最終,也是確實只有他能夠在板子上起來。不過那時候TNN還比較早期,對X86 CPU支援得不好,很多運算元都不能用,現在好像是直接整合OpenVino了。

3.Paddle-Lite

Paddle-Lite主要特點是有個Paddle訓練框架,比較方便做量化重訓練,量化也支援某些層不量化。速度比較快,當時和Tengine的商業版本對比了下,甚至比它快。缺點就是對X86 CPU支援不好,沒好好做,因為百度還有個叫Padding Inference的東西專門用來做X86上的推理。

4.OpenVino

OpenVino就比較專注了,專門用來做Intel CPU和VPU之類。速度上,有一次參加FAT的比賽,要求是單執行緒推理在1S之內,MNN是剛剛卡線,換成OpenVino, 直接縮短到了100ms。不過後來看MNN的釋出說明,對X86 CPU做了優化,據說已經比OpenVino還快了···具體我也沒測過了。OpenVino 使用場景比較侷限,而且只支援64位的。

5.TensorRT

算是顯示卡上部署必備了,像TNN、MNN、PaddleLite對GPU的支援,也是接入了TensorRT。像Jetson nx之類的也只能用它了。

社群支援

國內這幾個都建有QQ群或釘釘群,不過MNN群裡的管理員基本上是不怎麼理人的,Paddle-Lite是最活躍的,TNN也不錯。TensorRT的話有官方論壇,回覆有時候還算及時,OpenVino暫時不知道。

發展趨勢

從最近這些框架特別是國內這幾個的更新看,都在走大而全的道路,比如MNN從最初集中優化arm CPU,arm GPU, 到優化X86 CPU, NV GPU, 現在甚至開始了擴充NPU。TNN也是同樣的發展路徑, 個人覺得這也是個正確的道路,畢竟這麼多平臺,誰都想做到開發一次,只需要改改配置就能到處執行。對於這些硬體的支援,既有自己做優化(MNN的X86 CPU), 也有直接相容成熟的框架(TNN接入了OpenVino來支援X86 CPU, 接入了TensorRT來支援顯示卡,MNN對顯示卡的支援也是通過TensorRT),這種方法能夠極大的減少開發量,集中精力優化通用裝置,而特定硬體的廠家的優化應該是最強的。隨著晶片的發展,現在越來越多的晶片都是自帶NPU了,直接在arm CPU上做推理的場景也越來越少了,後續可能再拼就是拼對各種NPU的支援了。

其他

比較出名的還有TVM、TFlite等,使用不多,就不說了,個人感覺這塊還是國內做的更易用些,純屬個人看法。