百度嵌入式深度學習框架 Paddle-Mobile 介紹
本篇內容介紹嵌入式深度學習的應用場景、Paddle-Mobile的特性優勢以及使用開發方法,預計閱讀時間4分鐘
嵌入式深度學習有哪些應用
深度學習技術已經在網際網路的諸多方向產生影響,關於深度學習和神經網路的討論越來越多。深度學習技術在近幾年得到飛速發展,各種網際網路產品都爭相應用深度學習技術,產品對深度學習的引入也更進一步地影響人們的生活。隨著移動裝置被廣泛使用,在移動網際網路產品應用深度學習和神經網路技術已經成為必然趨勢。在移動端應用深度學習技術能夠做出哪些驚豔的體驗,是值得大家關注的首要問題。接下來我們來看下影象搜尋中的一個功能,實時翻譯。
實時翻譯
開啟簡單搜尋APP裡左下角的影象搜尋,設定好限定翻譯垂類和語種,只要用手機對準想要翻譯的文字的場景,就能夠實時地給出翻譯結果,並且將翻譯結果完美地融合到你所看到的場景中。我們可以看到翻譯結果的字型顏色以及貼圖的背景色,都與真實場景是完全一致的。同時,即使你的手機移動或抖動,你所看到的整個融合後的翻譯結果也依然是穩定的。
這個功能就應用到了前面提到的移動端深度學習技術,當然也用到了很多的計算機視覺相關技術,包括tracking、背景色處理等功能。
技術實現:第一點就是需要對文字進行背景色和前景色的提取,這裡的顏色用來對翻譯結果進行渲染,增強現實感;第二點就是提取文字區域的角點並進行光流追蹤,這一步主要是用來實時更新翻譯結果貼圖的位置資訊,隨著手機移動,我們需要讓翻譯結果貼圖始終貼合在他應該出現的位置。這裡除了需要更新位置資訊,我們還需要對翻譯結果貼圖進行透視變換,因為我們手機還會有旋轉以及三維座標系上各種角度的變化,這一步的透視變換就是為了得到一個透視變換矩陣,然後作用於翻譯貼圖,讓貼圖有同樣的角度變化,大大增強了現實感。第三點就是對識別到的文字進行翻譯,獲取翻譯結果。
視訊流式搜尋
這一功能基於業界首創的本地“多目標識別+粗分類識別”相結合的實時識別模型,第一次大規模使用移動端GPU進行深度學習計算。目前簡單搜尋的IOS端已經可以體驗,2018年底將會上線百度APP的Android版。
實時檢測取景框內的多個主體,並通過毫秒級響應的粗分類識別能力,快速告知使用者各主體粗分類,從而幫助使用者快速篩選擬識別主體。在出現識別結果後會標記多個目標,使用者點選任何一個目標後都會快速出現搜尋結果。
移動端深度學習遇到的問題
相比PC端,移動端裝置的運算能力通常比較弱小,並且由於移動端的CPU需要將功耗指標維持在很低的水平,給效能指標的提升帶來了制約。
Paddle-Mobile作為百度深度學習平臺PaddlePaddle下的子專案,致力於嵌入式平臺的深度學習預測。訓練任務由 PaddlePaddle 在伺服器端進行,Paddle-Mobile則破除深度學習落地嵌入式移動端平臺的障礙。
Paddle-Mobile設計和PaddlePaddle保持了高度一致,能夠直接執行PaddlePaddle新版訓練的模型。同時針對嵌入式平臺做了大量優化。嵌入式平臺計算資源有限,體積敏感,使用者過程中更加要求實時,所以我們必須針對各種嵌入式平臺挖掘極限效能。
Paddle-Mobile的優勢
目前支援 Linux-arm,IOS,Android,DuerOS 平臺的編譯和部署。它的最上層是一套非常簡潔的預測 API,服務於百度眾多 APP。
我們來看一下Paddle-Mobile 的架構。首先是底層針對各種硬體平臺的優化,包括 CPU(主要是移動端的 ARM CPU), GPU (包括 ARM的Mali,高通的Andreno以及蘋果自研的GPU),另外還有華為的NPU,powerVR,FPGA 等平臺。 NPU 目前仍在合作中,未來會直接支援。在這一層,我們會針對各種平臺實現優化後的運算元,也稱為 kernel,他們負責最底層的運算。
演算法優化與模型壓縮
演算法優化包括降低演算法本身複雜度,比如某些條件下的卷積操作,可以使用複雜度更低的 Winograd 演算法,以及我們後面會提到的kernel融合等思想。
為了帶來更高的計算效能和吞吐,端晶片通常會提供低位寬的定點計算能力。目前Paddle-Mobile已初步具備在ARM CPU上進行8bit定點預測的功能,在我們測試的模型中8bit定點通常會帶來20%~50%的效能提升。
多軟硬體覆蓋
目前Paddle-Mobile已經實現和進行中的能力如下
01
ARM CPU
ARM CPU 計算深度學習任務是最基本通用的技術,使用也較為廣泛。但是由於 CPU 計算能力相對偏弱,還要承擔主執行緒的UI繪製工作,在APP中使用 CPU 計算深度學習計算任務壓力較大。我們針對 ARM CPU 做了大量優化工作,但是隨著硬體不斷髮展未來專有AI晶片和GPU將更加適合做這項任務。
02
IOS GPU
IOS GPU 使用metal支援直接編寫,支援的系統範圍向下到了IOS 9。這比coreml支援的範圍有所擴大。目前該程式碼也已全面開放在Github。
03
Mali GPU
Mali GPU在華為等主流機型中廣泛存在,我們使用了OpenCL對Mali GPU做了Paddle模型支援。在較高階的Mali GPU上已經可以得到非常高的效能。
04
Andreno GPU
Andreno GPU是高通設計的端側GPU,同樣基於OpenCL對其進行了優化實現。其高效能、低功耗的優勢在Paddle-Mobile框架執行時得到了驗證。
05
FPGA ZU系列
該項工作程式碼已經可以執行,在Github同樣可以找到相關程式碼。對於ZU9和ZU5等開發板完全支援。FPGA的計算能力較強,深度學習功能可以在Github找到,感興趣的工程師們可以去了解。
06
H5網頁版深度學習支援
Paddle-Mobile正在實現底層基於WebGL的網頁版深度學習框架。我們使用了ES6。後續會使用WebAssembly和WebGL並行融合的設計,在效能上進一步提高。該功能近期也會在Github開源,歡迎關注。
07
樹莓派、RK3399等開發板
樹莓派、RK3399系列等硬體在開發者中被大量用及,Paddle-Mobile同樣做了支援,解決了很多問題,目前在其平臺上的cpu版本一鍵編譯即可完美執行。
體積小
Paddle-Mobile從設計之初就深入考慮到移動端的包體積的問題,cpu實現中沒有外部依賴。
在編譯過程中,如果該網路不需要的op是完全不會被打入的。同時編譯選項優化也為體積壓縮提供了幫助。Protobuf是主流框架使用的格式協議,如果放棄對Protobuf支援將給開發者帶來轉換模型的工作量,於是Paddle-Mobile團隊將Protobuf生成檔案重新精簡逐行重寫,拿到了一個只有幾十k增長的protobuf體積。為開發者帶來了一鍵執行的可行能力。
除了二進位制體積,我們對程式碼體積極力避免過大,整個倉庫的程式碼體積也非常小。
高效能CPU優化
針對 ARM CPU,我們會使用 ARM 彙編來實現 kernel 計算。 在卷積神經網路中,卷積操作是耗時佔比最大的部分,可能會佔80%到0%。而卷積操作通常可以轉化為兩個矩陣的乘法,如何來優化通用矩陣乘法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經過了多次版本迭代,CPU和GPU版本都執行在幾億級使用者的百度APP和簡單搜尋APP。如此量級的APP產品的驗證是對靠性的例證。同時Paddle-Mobile也在和華為合作,HiAI平臺的深度實現會在後繼放出。
支援的模型
目前Paddle-Mobile已經在多個平臺有不同模型覆蓋,下表表示目前已經支援的模型範圍。空白區域也是接下來會補齊的模型。
模型獲取
深度學習技術離不開模型支援,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。也歡迎相關愛好者加入開發為移動端深度學習的發展貢獻力量。