百度嵌入式深度學習框架Paddle-Mobile

深度學習技術已經在互聯網的諸多方向產生影響,時下關於深度學習和神經網絡的討論越來越多。深度學習技術在近幾年得到飛速發展,各種互聯網產品都爭相應用深度學習技術,產品對深度學習的引入也更進一步地影響人們的生活。隨著移動設備被廣泛使用,在移動互聯網產品應用深度學習和神經網絡技術已經成為必然趨勢。在移動端應用深度學習技術能夠做出哪些驚豔的體驗,是值得大家關注的首要問題。如下是圖像搜索中的一個功能,實時翻譯。

實時翻譯

打開單搜索APP裡左下角的圖像搜索,設置好限定翻譯垂類和語種,只要用手機對準想要翻譯的文字的場景,就能夠實時地給出翻譯結果,並且將翻譯結果完美地融合到你所看到的場景中。如圖可見,翻譯結果的字體顏色以及貼圖的背景色,都與真實場景是完全一致的。同時,即使你的手機移動或抖動,你所看到的整個融合後的翻譯結果也依然是穩定。

百度嵌入式深度學習框架Paddle-Mobile

這個功能已應用於移動端深度學習技術,同時也被應用於很多計算機視覺相關技術,包括Tracking、背景色處理等功能。

技術實現:首先,需要對文字進行背景色和前景色提取,這裡所說的顏色用於翻譯結果渲染,增強現實感;其次是提取文字區域的角點,並進行光流追蹤,這一步主要用於實時更新翻譯結果貼圖的位置信息,隨著手機移動,需要讓翻譯結果貼圖始終貼合在其應該出現的位置。除了需要更新位置信息,同時需要對翻譯結果貼圖進行透視變換,因為手機的旋轉以及三維座標系上的各種角度變化,這一步的透視變換就是為了得到一個透視變換矩陣,然後作用於翻譯貼圖,讓貼圖有同樣的角度變化,大大增強了現實感。最後則是對識別到的文字進行翻譯,獲取翻譯結果。

視頻流式搜索

這一功能基於業界首創的本地"多目標識別+粗分類識別"相結合的實時識別模型,第一次大規模使用移動端GPU進行深度學習計算。在簡單搜索的IOS端已經可以體驗,2018年底將會上線百度APP的Android版。

實時檢測取景框內的多個主體,並通過毫秒級響應的粗分類識別能力,快速告知用戶各主體粗分類,從而幫助用戶快速篩選擬識別主體。在出現識別結果後會標記多個目標,用戶點擊任何一個目標後都會快速出現搜索結果。

百度嵌入式深度學習框架Paddle-Mobile

移動端深度學習遇到的問題

相比PC端,移動端設備的運算能力通常比較弱小,並且由於移動端的CPU需要將功耗指標維持在很低的水平,給性能指標的提升帶來了制約。

Paddle-Mobile作為百度深度學習平臺PaddlePaddle下的子項目,致力於嵌入式平臺的深度學習預測。訓練任務由 PaddlePaddle 在服務器端進行,Paddle-Mobile則破除深度學習落地嵌入式移動端平臺的障礙。

Paddle-Mobile設計和PaddlePaddle保持了高度一致,能夠直接運行PaddlePaddle新版訓練的模型。同時針對嵌入式平臺做了大量優化。嵌入式平臺計算資源有限,體積敏感,用戶過程中更加要求實時,所以必須針對各種嵌入式平臺挖掘極限性能。

Paddle-Mobile的優勢

目前支持 Linux-arm,IOS,Android,Dueros 平臺的編譯和部署。它的最上層是百度提供的一套非常簡潔的預測 API,並服務於百度眾多 APP。

百度嵌入式深度學習框架Paddle-Mobile

以下是關於Paddle-Mobile 的架構。首先是底層針對各種硬件平臺的優化,包括 CPU(主要是移動端的 ARM CPU), GPU (包括 ARM的Mali,高通的Andreno以及蘋果自研的GPU),另外還有華為的NPU、PowerVR、FPGA 等平臺。 NPU 目前仍在合作中,未來會直接支持。在這一層,我們會針對各種平臺實現優化後的算子,也稱為 Kernel,主要負責最底層的運算。

與此同時,Paddle-Mobile還具備許多優勢。

算法優化,以及模型壓縮

算法優化包括降低算法本身複雜度,比如某些條件下的卷積操作,可以使用複雜度更低的 Winograd 算法,以及Kernel融合等思想。

為了帶來更高的計算性能和吞吐,端芯片通常會提供低位寬的定點計算能力。目前Paddle-Mobile已初步具備在ARM CPU上進行8bit定點預測的功能,在測試的模型中8bit定點通常會帶來20%~50%的性能提升。

多軟、硬件平臺覆蓋

目前Paddle-Mobile已經實現和進行中的能力如下:

· ARM CPU

· ARM CPU計算深度學習任務是最基本通用的技術,使用也較為廣泛。但是由於CPU計算能力相對偏弱,還要承擔主線程的UI繪製工作,在APP中使用CPU計算深度學習計算任務壓力較大。百度針對ARM CPU做了大量優化工作,但是隨著硬件不斷髮展,未來專有AI芯片和GPU將更加適合做這項任務。

· IOS GPU

· IOS gpu使用metal支持直接編寫,支持的系統範圍向下到了IOS 9。這比coreml支持的範圍有所擴大。目前該代碼也已全面開放在Github。

· Mali GPU

· Mali GPU在華為等主流機型中廣泛存在,百度使用了OpenCL對Mali GPU做了Paddle模型支持。在較高端的Mali GPU上已經可以得到非常高的性能。

· Andreno GPU

· Andreno GPU是高通設計的端側GPU,同樣基於OpenCL對其進行了優化實現。其高性能、低功耗的優勢在Paddle-Mobile框架運行時得到了驗證。

· FPGA ZU系列

· 該項工作代碼已經可以運行,在Github同樣可以找到相關代碼。對於ZU9和ZU5等開發板完全支持。FPGA的計算能力較強,深度學習功能可以在Github找到,感興趣的工程師們可以去了解。

· H5網頁版深度學習支持

· Paddle-Mobile正在實現底層基於WebGL的網頁版深度學習框架。百度使用了ES6。後續會使用WebAssembly和WebGL並行融合的設計,在性能上進一步提高。該功能近期也會在Github開源,歡迎關注。

· 樹莓派、RK3399等開發板

· 樹莓派、RK3399系列等硬件在開發者中被大量用及,Paddle-Mobile同樣做了支持,解決了很多問題,目前在其平臺上的cpu版本一鍵編譯即可完美運行。

·

體積小

Paddle-Mobile從設計之初就深入考慮到移動端的包體積的問題,CPU實現中沒有外部依賴。

在編譯過程中,如果該網絡不需要的OP是完全不會被打入的,同時編譯選項優化也為體積壓縮提供了幫助。Protobuf是主流框架使用的格式協議,如果放棄對Protobuf支持將給開發者帶來轉換模型的工作量,於是Paddle-Mobile團隊將Protobuf生成文件重新精簡逐行重寫,拿到了一個只有幾十K增長的Protobuf體積。為開發者帶來了一鍵運行的可行能力。

除了二進制體積,Paddle-Mobile對代碼也進行了精簡,整個倉庫的體積非常小。

高性能CPU優化

針對 ARM CPU,百度會使用 ARM 彙編來實現Kernel 計算。

在卷積神經網絡中,卷積操作是耗時佔比最大的部分,可能會佔80%。而卷積操作通常可以轉化為兩個矩陣的乘法,如何來優化通用矩陣乘法GEMM就是成為了關鍵中的關鍵。Paddle-Mobile主要使用了以下技術:

1. SIMD NEON優化技術

2. 片上緩存命中優化

3. 矩陣合理分塊

4. PLD彙編指令優化

5. 循環展開

6. 重排流水線

GPU 優化

CPU 和 GPU 的結構有著明顯的區別, CPU每個核心僅有一個ALU算數邏輯單元,幾個核心共享L2緩存。而 GPU 通常會有很多個ALU計算單元, 成百上千個計算單元並行計算。這種並行是非常適合於深度學習中的計算。Paddle-Mobile充分利用了手機平臺的GPU對主流GPU幾乎是全覆蓋,包含了ios和android兩大陣營中的GPU實現。未來,Paddle-Mobile將會以GPU為主,CPU為輔的思路發展。

另外,CPU 和 GPU 並不是用的同一塊內存,大量數據計算時會有較大差異。因此百度使用了佔用內存更小的數據類型。

內核融合

如今較為常見的深度學習框架都會將模型抽象為由一些基本運算單元組成的有向無環圖,這些基本運算單元包括常見的卷積、池化以及各種激活函數等,在真正執行時這些OP會調用更底層的內核函數 kernel 來完成運算。通常情況下,一個複雜的模型會包含上千個OP,而這些OP在調用kerenl時都會產生內存IO。內核融合可以將一序列順序執行的OP kernel進行合併,從而減少內存IO次數,並充分利用CPU的流水線技術。此外內核融合也可以降低計算複雜度,比如Convolution和Batch Normalization的融合。

支持的模型

目前Paddle-Mobile已經在多個平臺有不同模型覆蓋,下表表示目前已經支持的模型範圍。空白區域也是接下來會補齊的模型。

百度嵌入式深度學習框架Paddle-Mobile

如何使用 & 如何參與開發

Paddle-Mobile經過了多次版本迭代,CPU和GPU版本都運行在幾億級用戶的百度APP和簡單搜索APP。如此量級的APP產品的驗證是對靠性的例證。同時Paddle-Mobile也在和華為合作,HiAI平臺的深度實現會在後繼放出。

模型獲取

深度學習技術離不開模型支持,Paddle-Mobile支持的是PaddlePaddle模型規範。模型的獲取主要通過以下途徑獲得。

1. 如果你只是用來測試,對效果要求不高。測試模型和測試圖片下載如下:

http://mms-graph.bj.bcebos.com/paddle-mobile%2FmodelsAndImages.zip

2. 若想有更好的效果獨立訓練模型,可以直接使用Paddle Fluid訓練,該方式是最為可靠、推薦方式。

3. 如果你手中的模型是其他框架訓練的模型,需要進模型轉換才可以運行。比如將Caffe的模型轉為Paddle Fluid的模型可以參考如下鏈接:

https://github.com/PaddlePaddle/models/tree/develop/fluid/image_classification/caffe2fluid

編譯及開發

Paddle-Mobile框架所需要的測試模型已經在github完全免費公佈,為開發者進一步使用提供便利。由於大量UI工程師對性能和底層優化有一定困擾,Paddle-Mobile的編譯過程極其簡單。以Android平臺為例。在安裝好cmake和ndk以後進入項目根目錄,直接可以如下命令編譯:

cd tools

sh build.sh android

如果百度已經明確自己的模型,同時想要更小的體積可以:

sh build.sh android googlenet

這樣就不會打入開發者不需要的依賴,體積進一步減小。

設計文檔,主要分為IOS、Android、FPGA、arm_linux等文檔,在Readme和 https://github.com/PaddlePaddle/paddle-mobile首頁中都有相關鏈接,其中包含大量設計和開發過程所需要的資料。

總結

Paddle-Mobile作為國內全面支持各大平臺的移動端深度學習框架,以移動端特點出發,針對性做了大量的優化、平臺覆蓋工作,並且保持了高性能、體積小等諸多優勢。為對中國開發者更友好,中文文檔被重點維護,有任何問題都可以到Github發Issue。也歡迎相關愛好者加入開發為移動端深度學習的發展貢獻力量。


分享到:


相關文章: