本篇內(nèi)容介紹嵌入式深度學(xué)習(xí)的應(yīng)用場(chǎng)景、Paddle-Mobile的特性優(yōu)勢(shì)以及使用開(kāi)發(fā)方法,預(yù)計(jì)閱讀時(shí)間4分鐘
嵌入式深度學(xué)習(xí)有哪些應(yīng)用
深度學(xué)習(xí)技術(shù)已經(jīng)在互聯(lián)網(wǎng)的諸多方向產(chǎn)生影響,關(guān)于深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的討論越來(lái)越多。深度學(xué)習(xí)技術(shù)在近幾年得到飛速發(fā)展,各種互聯(lián)網(wǎng)產(chǎn)品都爭(zhēng)相應(yīng)用深度學(xué)習(xí)技術(shù),產(chǎn)品對(duì)深度學(xué)習(xí)的引入也更進(jìn)一步地影響人們的生活。隨著移動(dòng)設(shè)備被廣泛使用,在移動(dòng)互聯(lián)網(wǎng)產(chǎn)品應(yīng)用深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)技術(shù)已經(jīng)成為必然趨勢(shì)。在移動(dòng)端應(yīng)用深度學(xué)習(xí)技術(shù)能夠做出哪些驚艷的體驗(yàn),是值得大家關(guān)注的首要問(wèn)題。接下來(lái)我們來(lái)看下圖像搜索中的一個(gè)功能,實(shí)時(shí)翻譯。
實(shí)時(shí)翻譯
打開(kāi)簡(jiǎn)單搜索APP里左下角的圖像搜索,設(shè)置好限定翻譯垂類和語(yǔ)種,只要用手機(jī)對(duì)準(zhǔn)想要翻譯的文字的場(chǎng)景,就能夠?qū)崟r(shí)地給出翻譯結(jié)果,并且將翻譯結(jié)果完美地融合到你所看到的場(chǎng)景中。我們可以看到翻譯結(jié)果的字體顏色以及貼圖的背景色,都與真實(shí)場(chǎng)景是完全一致的。同時(shí),即使你的手機(jī)移動(dòng)或抖動(dòng),你所看到的整個(gè)融合后的翻譯結(jié)果也依然是穩(wěn)定的。
這個(gè)功能就應(yīng)用到了前面提到的移動(dòng)端深度學(xué)習(xí)技術(shù),當(dāng)然也用到了很多的計(jì)算機(jī)視覺(jué)相關(guān)技術(shù),包括tracking、背景色處理等功能。
技術(shù)實(shí)現(xiàn):第一點(diǎn)就是需要對(duì)文字進(jìn)行背景色和前景色的提取,這里的顏色用來(lái)對(duì)翻譯結(jié)果進(jìn)行渲染,增強(qiáng)現(xiàn)實(shí)感;第二點(diǎn)就是提取文字區(qū)域的角點(diǎn)并進(jìn)行光流追蹤,這一步主要是用來(lái)實(shí)時(shí)更新翻譯結(jié)果貼圖的位置信息,隨著手機(jī)移動(dòng),我們需要讓翻譯結(jié)果貼圖始終貼合在他應(yīng)該出現(xiàn)的位置。這里除了需要更新位置信息,我們還需要對(duì)翻譯結(jié)果貼圖進(jìn)行透視變換,因?yàn)槲覀兪謾C(jī)還會(huì)有旋轉(zhuǎn)以及三維坐標(biāo)系上各種角度的變化,這一步的透視變換就是為了得到一個(gè)透視變換矩陣,然后作用于翻譯貼圖,讓貼圖有同樣的角度變化,大大增強(qiáng)了現(xiàn)實(shí)感。第三點(diǎn)就是對(duì)識(shí)別到的文字進(jìn)行翻譯,獲取翻譯結(jié)果。
視頻流式搜索
這一功能基于業(yè)界首創(chuàng)的本地“多目標(biāo)識(shí)別+粗分類識(shí)別”相結(jié)合的實(shí)時(shí)識(shí)別模型,第一次大規(guī)模使用移動(dòng)端GPU進(jìn)行深度學(xué)習(xí)計(jì)算。目前簡(jiǎn)單搜索的IOS端已經(jīng)可以體驗(yàn),2018年底將會(huì)上線百度APP的Android版。
實(shí)時(shí)檢測(cè)取景框內(nèi)的多個(gè)主體,并通過(guò)毫秒級(jí)響應(yīng)的粗分類識(shí)別能力,快速告知用戶各主體粗分類,從而幫助用戶快速篩選擬識(shí)別主體。在出現(xiàn)識(shí)別結(jié)果后會(huì)標(biāo)記多個(gè)目標(biāo),用戶點(diǎn)擊任何一個(gè)目標(biāo)后都會(huì)快速出現(xiàn)搜索結(jié)果。
移動(dòng)端深度學(xué)習(xí)遇到的問(wèn)題
相比PC端,移動(dòng)端設(shè)備的運(yùn)算能力通常比較弱小,并且由于移動(dòng)端的CPU需要將功耗指標(biāo)維持在很低的水平,給性能指標(biāo)的提升帶來(lái)了制約。
Paddle-Mobile作為百度深度學(xué)習(xí)平臺(tái)PaddlePaddle下的子項(xiàng)目,致力于嵌入式平臺(tái)的深度學(xué)習(xí)預(yù)測(cè)。訓(xùn)練任務(wù)由 PaddlePaddle 在服務(wù)器端進(jìn)行,Paddle-Mobile則破除深度學(xué)習(xí)落地嵌入式移動(dòng)端平臺(tái)的障礙。
Paddle-Mobile設(shè)計(jì)和PaddlePaddle保持了高度一致,能夠直接運(yùn)行PaddlePaddle新版訓(xùn)練的模型。同時(shí)針對(duì)嵌入式平臺(tái)做了大量?jī)?yōu)化。嵌入式平臺(tái)計(jì)算資源有限,體積敏感,用戶過(guò)程中更加要求實(shí)時(shí),所以我們必須針對(duì)各種嵌入式平臺(tái)挖掘極限性能。
Paddle-Mobile的優(yōu)勢(shì)
目前支持 Linux-arm,IOS,Android,DuerOS 平臺(tái)的編譯和部署。它的最上層是一套非常簡(jiǎn)潔的預(yù)測(cè) API,服務(wù)于百度眾多 APP。
我們來(lái)看一下Paddle-Mobile 的架構(gòu)。首先是底層針對(duì)各種硬件平臺(tái)的優(yōu)化,包括 CPU(主要是移動(dòng)端的 ARM CPU),? GPU (包括 ARM的Mali,高通的Andreno以及蘋果自研的GPU),另外還有華為的NPU,powerVR,F(xiàn)PGA 等平臺(tái)。 NPU 目前仍在合作中,未來(lái)會(huì)直接支持。在這一層,我們會(huì)針對(duì)各種平臺(tái)實(shí)現(xiàn)優(yōu)化后的算子,也稱為 kernel,他們負(fù)責(zé)最底層的運(yùn)算。
算法優(yōu)化與模型壓縮
算法優(yōu)化包括降低算法本身復(fù)雜度,比如某些條件下的卷積操作,可以使用復(fù)雜度更低的 Winograd 算法,以及我們后面會(huì)提到的kernel融合等思想。
為了帶來(lái)更高的計(jì)算性能和吞吐,端芯片通常會(huì)提供低位寬的定點(diǎn)計(jì)算能力。目前Paddle-Mobile已初步具備在ARM CPU上進(jìn)行8bit定點(diǎn)預(yù)測(cè)的功能,在我們測(cè)試的模型中8bit定點(diǎn)通常會(huì)帶來(lái)20%~50%的性能提升。
多軟硬件覆蓋
目前Paddle-Mobile已經(jīng)實(shí)現(xiàn)和進(jìn)行中的能力如下
01ARM CPU
ARM CPU計(jì)算深度學(xué)習(xí)任務(wù)是最基本通用的技術(shù),使用也較為廣泛。但是由于CPU計(jì)算能力相對(duì)偏弱,還要承擔(dān)主線程的UI繪制工作,在APP中使用CPU計(jì)算深度學(xué)習(xí)計(jì)算任務(wù)壓力較大。我們針對(duì)ARM?CPU做了大量?jī)?yōu)化工作,但是隨著硬件不斷發(fā)展未來(lái)專有AI芯片和GPU將更加適合做這項(xiàng)任務(wù)。
02IOS GPU
IOS GPU使用metal支持直接編寫,支持的系統(tǒng)范圍向下到了IOS 9。這比coreml支持的范圍有所擴(kuò)大。目前該代碼也已全面開(kāi)放在Github。
03Mali GPU
Mali GPU在華為等主流機(jī)型中廣泛存在,我們使用了OpenCL對(duì)Mali GPU做了Paddle模型支持。在較高端的Mali GPU上已經(jīng)可以得到非常高的性能。
04Andreno GPU
Andreno GPU是高通設(shè)計(jì)的端側(cè)GPU,同樣基于OpenCL對(duì)其進(jìn)行了優(yōu)化實(shí)現(xiàn)。其高性能、低功耗的優(yōu)勢(shì)在Paddle-Mobile框架運(yùn)行時(shí)得到了驗(yàn)證。
05?FPGA ZU系列
該項(xiàng)工作代碼已經(jīng)可以運(yùn)行,在Github同樣可以找到相關(guān)代碼。對(duì)于ZU9和ZU5等開(kāi)發(fā)板完全支持。FPGA的計(jì)算能力較強(qiáng),深度學(xué)習(xí)功能可以在Github找到,感興趣的工程師們可以去了解。
06?H5網(wǎng)頁(yè)版深度學(xué)習(xí)支持
Paddle-Mobile正在實(shí)現(xiàn)底層基于WebGL的網(wǎng)頁(yè)版深度學(xué)習(xí)框架。我們使用了ES6。后續(xù)會(huì)使用WebAssembly和WebGL并行融合的設(shè)計(jì),在性能上進(jìn)一步提高。該功能近期也會(huì)在Github開(kāi)源,歡迎關(guān)注。
07?樹莓派、RK3399等開(kāi)發(fā)板
樹莓派、RK3399系列等硬件在開(kāi)發(fā)者中被大量用及,Paddle-Mobile同樣做了支持,解決了很多問(wèn)題,目前在其平臺(tái)上的cpu版本一鍵編譯即可完美運(yùn)行。
體積小
Paddle-Mobile從設(shè)計(jì)之初就深入考慮到移動(dòng)端的包體積的問(wèn)題,cpu實(shí)現(xiàn)中沒(méi)有外部依賴。
在編譯過(guò)程中,如果該網(wǎng)絡(luò)不需要的op是完全不會(huì)被打入的。同時(shí)編譯選項(xiàng)優(yōu)化也為體積壓縮提供了幫助。Protobuf是主流框架使用的格式協(xié)議,如果放棄對(duì)Protobuf支持將給開(kāi)發(fā)者帶來(lái)轉(zhuǎn)換模型的工作量,于是Paddle-Mobile團(tuán)隊(duì)將Protobuf生成文件重新精簡(jiǎn)逐行重寫,拿到了一個(gè)只有幾十k增長(zhǎng)的protobuf體積。為開(kāi)發(fā)者帶來(lái)了一鍵運(yùn)行的可行能力。
除了二進(jìn)制體積,我們對(duì)代碼體積極力避免過(guò)大,整個(gè)倉(cāng)庫(kù)的代碼體積也非常小。
高性能CPU優(yōu)化
針對(duì) ARM CPU,我們會(huì)使用 ARM 匯編來(lái)實(shí)現(xiàn) kernel 計(jì)算。在卷積神經(jīng)網(wǎng)絡(luò)中,卷積操作是耗時(shí)占比最大的部分,可能會(huì)占80%到0%。而卷積操作通常可以轉(zhuǎn)化為兩個(gè)矩陣的乘法,如何來(lái)優(yōu)化通用矩陣乘法GEMM就是成為了關(guān)鍵中的關(guān)鍵。
Paddle-Mobile主要使用了以下技術(shù)
1.???SIMD NEON優(yōu)化技術(shù)
2.???片上緩存命中優(yōu)化
3.???矩陣合理分塊
4.???Pld匯編指令優(yōu)化
5.???循環(huán)展開(kāi)
6.???重排流水線
GPU優(yōu)化
CPU 和 GPU 的結(jié)構(gòu)有著明顯的區(qū)別, CPU每個(gè)核心僅有一個(gè)ALU算數(shù)邏輯單元,幾個(gè)核心共享L2緩存。而 GPU 通常會(huì)有很多個(gè)ALU計(jì)算單元, 成百上千個(gè)計(jì)算單元并行計(jì)算。這種并行是非常適合于深度學(xué)習(xí)中的計(jì)算。Paddle-Mobile充分利用了手機(jī)平臺(tái)的GPU對(duì)主流GPU幾乎是全覆蓋,包含了ios和android兩大陣營(yíng)中的GPU實(shí)現(xiàn)。未來(lái),Paddle-Mobile將會(huì)以GPU為主,CPU為輔的思路發(fā)展。
另外,CPU 和 GPU 并不是用的同一塊內(nèi)存,大量數(shù)據(jù)計(jì)算時(shí)會(huì)有較大差異。因此我們使用了占用內(nèi)存更小的數(shù)據(jù)類型。
內(nèi)核融合
如今較為常見(jiàn)的深度學(xué)習(xí)框架都會(huì)將模型抽象為由一些基本運(yùn)算單元組成的有向無(wú)環(huán)圖,這些基本運(yùn)算單元包括常見(jiàn)的卷積、池化以及各種激活函數(shù)等,在真正執(zhí)行時(shí)這些OP會(huì)調(diào)用更底層的內(nèi)核函數(shù) kernel 來(lái)完成運(yùn)算。通常情況下,一個(gè)復(fù)雜的模型會(huì)包含上千個(gè)OP,而這些OP在調(diào)用kerenl時(shí)都會(huì)產(chǎn)生內(nèi)存IO。內(nèi)核融合可以將一序列順序執(zhí)行的OP kernel進(jìn)行合并,從而減少內(nèi)存IO次數(shù),并充分利用CPU的流水線技術(shù)。此外內(nèi)核融合也可以降低計(jì)算復(fù)雜度,比如Convolution和Batch Normalization的融合。
如何使用&如何參與開(kāi)發(fā)
Paddle-Mobile經(jīng)過(guò)了多次版本迭代,CPU和GPU版本都運(yùn)行在幾億級(jí)用戶的百度APP和簡(jiǎn)單搜索APP。如此量級(jí)的APP產(chǎn)品的驗(yàn)證是對(duì)靠性的例證。同時(shí)Paddle-Mobile也在和華為合作,HiAI平臺(tái)的深度實(shí)現(xiàn)會(huì)在后繼放出。
支持的模型
目前Paddle-Mobile已經(jīng)在多個(gè)平臺(tái)有不同模型覆蓋,下表表示目前已經(jīng)支持的模型范圍。空白區(qū)域也是接下來(lái)會(huì)補(bǔ)齊的模型。
模型獲取
深度學(xué)習(xí)技術(shù)離不開(kāi)模型支持,Paddle-Mobile支持的是PaddlePaddle模型規(guī)范。模型的獲取主要通過(guò)以下途徑獲得。
1. 如果你只是用來(lái)測(cè)試,對(duì)效果要求不高。測(cè)試模型和測(cè)試圖片下載地址如下:
http://mms-graph.bj.bcebos.com/paddle-mobile%2FmodelsAndImages.zip
2. 若想有更好的效果獨(dú)立訓(xùn)練模型,可以直接使用Paddle Fluid訓(xùn)練,該方式最為可靠,推薦方式。
3. 如果你手中的模型是其他框架訓(xùn)練的模型,需要進(jìn)模型轉(zhuǎn)換才可以運(yùn)行。比如將caffe的模型轉(zhuǎn)為Paddle Fluid的模型可以參考如下鏈接:
https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleCV/caffe2fluid
編譯及開(kāi)發(fā)
Paddle-Mobile框架所需要的測(cè)試模型已經(jīng)在github完全免費(fèi)公布,為開(kāi)發(fā)者進(jìn)一步使用提供便利。由于大量UI工程師對(duì)性能和底層優(yōu)化有一定困擾,Paddle-Mobile的編譯過(guò)程極其簡(jiǎn)單。以Android平臺(tái)為例。在安裝好cmake和ndk以后進(jìn)入項(xiàng)目根目錄,直接可以如下命令編譯:
?cd tools
sh?build.sh?android
如果我們已經(jīng)明確自己的模型,同時(shí)想要更小的體積可以:
sh?build.sh?android googlenet
這樣就不會(huì)打入開(kāi)發(fā)者不需要的依賴,體積進(jìn)一步減小。
設(shè)計(jì)文檔,主要分為IOS、Android、FPGA、arm_linux等文檔,在Readme和
https://github.com/PaddlePaddle/paddle-mobile
首頁(yè)中都有相關(guān)鏈接,其中包含大量設(shè)計(jì)和開(kāi)發(fā)過(guò)程所需要的資料。
總結(jié)
Paddle-Mobile做為國(guó)內(nèi)全面支持各大平臺(tái)的移動(dòng)端深度學(xué)習(xí)框架,以移動(dòng)端特點(diǎn)出發(fā),針對(duì)性做了大量的優(yōu)化、平臺(tái)覆蓋工作,并且保持了高性能、體積小等諸多優(yōu)勢(shì)。為對(duì)中國(guó)開(kāi)發(fā)者更友好,中文文檔被重點(diǎn)維護(hù),有任何問(wèn)題都可以到Github發(fā)issue。也歡迎相關(guān)愛(ài)好者加入開(kāi)發(fā)為移動(dòng)端深度學(xué)習(xí)的發(fā)展貢獻(xiàn)力量。