本篇內容介紹嵌入式深度學習的應用場景、Paddle-Mobile的特性優點以及使用開發方法,預計閱讀時間4分鐘linux
嵌入式深度學習有哪些應用android
深度學習技術已經在互聯網的諸多方向產生影響,關於深度學習和神經網絡的討論愈來愈多。深度學習技術在近幾年獲得飛速發展,各類互聯網產品都爭相應用深度學習技術,產品對深度學習的引入也更進一步地影響人們的生活。隨着移動設備被普遍使用,在移動互聯網產品應用深度學習和神經網絡技術已經成爲必然趨勢。在移動端應用深度學習技術可以作出哪些驚豔的體驗,是值得你們關注的首要問題。接下來咱們來看下圖像搜索中的一個功能,實時翻譯。ios
實時翻譯git
打開簡單搜索APP裏左下角的圖像搜索,設置好限定翻譯垂類和語種,只要用手機對準想要翻譯的文字的場景,就可以實時地給出翻譯結果,而且將翻譯結果完美地融合到你所看到的場景中。咱們能夠看到翻譯結果的字體顏色以及貼圖的背景色,都與真實場景是徹底一致的。同時,即便你的手機移動或抖動,你所看到的整個融合後的翻譯結果也依然是穩定的。github
這個功能就應用到了前面提到的移動端深度學習技術,固然也用到了不少的計算機視覺相關技術,包括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主要使用瞭如下技術
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模型規範。模型的獲取主要經過如下途徑得到。
http://mms-graph.bj.bcebos.co...
https://github.com/PaddlePadd...
編譯及開發
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/PaddlePadd...
首頁中都有相關連接,其中包含大量設計和開發過程所須要的資料。
總結
Paddle-Mobile作爲國內全面支持各大平臺的移動端深度學習框架,以移動端特色出發,針對性作了大量的優化、平臺覆蓋工做,而且保持了高性能、體積小等諸多優點。爲對中國開發者更友好,中文文檔被重點維護,有任何問題均可以到Github發issue。也歡迎相關愛好者加入開發爲移動端深度學習的發展貢獻力量。