百度開(kāi)源移動(dòng)端深度學(xué)習(xí)框架mobile-deep-learning-36大數(shù)據(jù)
作者:李永會(huì)
2017 年 9 月 25 日,百度在 GitHub 開(kāi)源了移動(dòng)端深度學(xué)習(xí)框架 mobile-deep-learning(MDL)的全部代碼以及腳本,希望這個(gè)項(xiàng)目在社區(qū)的帶動(dòng)下能夠更好地發(fā)展。
寫(xiě)在前面
深度學(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ì)。
與深度學(xué)習(xí)緊密聯(lián)系在一起的圖像技術(shù)同樣在業(yè)界廣泛應(yīng)用。傳統(tǒng)計(jì)算機(jī)視覺(jué)和深度學(xué)習(xí)的結(jié)合使圖像技術(shù)得以快速發(fā)展。
GitHub 地址: https://github.com/baidu/mobile-deep-learning
移動(dòng)端深度學(xué)習(xí)技術(shù)應(yīng)用
百度應(yīng)用案例
在移動(dòng)端應(yīng)用深度學(xué)習(xí)技術(shù)比較典型的就是 CNN(Convolutional Neural Network)技術(shù),即常被人提起的卷積神經(jīng)網(wǎng)絡(luò)。mobile-deep-learning(MDL)是一個(gè)基于卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)的移動(dòng)端框架。
MDL 在移動(dòng)端主要有哪些應(yīng)用場(chǎng)景呢?比較常見(jiàn)的如分辨出一張圖片中的物體是什么,也就是 分類;或者識(shí)別出一張圖片中的物體在哪、有多大,也就是 主體識(shí)別。
下面這個(gè) App 叫拾相,可以在 Android 平臺(tái)的應(yīng)用寶中找到。它可以自動(dòng)為用戶將照片分類,對(duì)于擁有大量照片的用戶來(lái)講,這個(gè)功能很有吸引力。
另外,在手機(jī)百度搜索框右側(cè)可以打開(kāi)圖像搜索,打開(kāi)圖像搜索后的界面效果如下圖。當(dāng)用戶在通用垂直類別下開(kāi)啟自動(dòng)拍開(kāi)關(guān)(圖中下方標(biāo)注)時(shí),手停穩(wěn)它就會(huì)自動(dòng)找到物體進(jìn)行框選,并無(wú)需拍照直接發(fā)起圖像搜索。整個(gè)過(guò)程可以給用戶帶來(lái)流暢的體驗(yàn),無(wú)需用戶手動(dòng)拍照。圖片中的框體應(yīng)用的就是典型的深度學(xué)習(xí)主體識(shí)別技術(shù),使用的就是 mobile-deep-learning(MDL)框架。MDL 目前在手機(jī)百度中穩(wěn)定運(yùn)行了多個(gè)版本,經(jīng)過(guò)數(shù)次迭代后可靠性大幅提升。
業(yè)界其他案例
互聯(lián)網(wǎng)行業(yè)在移動(dòng)端應(yīng)用神經(jīng)網(wǎng)絡(luò)的案例已經(jīng)越來(lái)越多。
目前的流派主要有兩種,其一是完全在客戶端運(yùn)行神經(jīng)網(wǎng)絡(luò),這種方式的優(yōu)點(diǎn)顯而易見(jiàn),那就是不需要經(jīng)過(guò)網(wǎng)絡(luò),如果能保證運(yùn)行速度,用戶體驗(yàn)會(huì)非常流暢。如果能保證移動(dòng)端高效運(yùn)行神經(jīng)網(wǎng)絡(luò),可以使用戶感覺(jué)不到加載過(guò)程。使用完全脫離互聯(lián)網(wǎng)網(wǎng)絡(luò)在移動(dòng)端運(yùn)算神經(jīng)網(wǎng)絡(luò)的 App 已經(jīng)舉例,如前述拾相和手機(jī)百度中的圖像搜索。
其二是另一種,運(yùn)算神經(jīng)網(wǎng)絡(luò)過(guò)程依賴互聯(lián)網(wǎng)網(wǎng)絡(luò),客戶端只負(fù)責(zé) UI 展示。在客戶端神經(jīng)網(wǎng)絡(luò)落地之前,絕大部分 App 都使用了這種運(yùn)算在服務(wù)端、展示在客戶端的方式。這種方式的優(yōu)點(diǎn)是實(shí)現(xiàn)相對(duì)容易,開(kāi)發(fā)成本更低。
為了更好理解上述兩種神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)方法,下面展示兩個(gè)識(shí)別植物花卉的例子,分別用到了識(shí)花和形色兩個(gè) App。這兩款 App 都使用了典型分類方法,都可以在 iOS 平臺(tái)的 App Store 中找到。下圖是一張蓮花圖片,這張圖片使用識(shí)花和形色兩個(gè) App 分類都能得到較好的分類結(jié)果。你可以嘗試安裝這兩款 App 并根據(jù)使用效果來(lái)判斷它們分別使用了上述哪一種方法。
識(shí)花
近一年來(lái)涌現(xiàn)出很多花卉識(shí)別的 App。微軟「識(shí)花」是微軟亞洲研究院推出的一款用于識(shí)別花卉的 App,用戶可以在拍攝后選擇花卉,App 會(huì)給出該類花卉的相關(guān)信息。精準(zhǔn)的花卉分類是其對(duì)外宣傳的一大亮點(diǎn)。
形色
這款「形色」App,只需要對(duì)準(zhǔn)植物 (花、草、樹(shù)) 拍照,就能快速給出植物的名字,還有不少有趣的植物知識(shí),如這個(gè)植物還有什么別名、植物的花語(yǔ)、相關(guān)古詩(shī)詞、植物文化、趣味故事以及養(yǎng)護(hù)方法,看完收獲不少。
移動(dòng)端應(yīng)用深度學(xué)習(xí)的難點(diǎn)
一直以來(lái)由于技術(shù)門(mén)檻和硬件條件的限制,在移動(dòng)端應(yīng)用深度學(xué)習(xí)的成功案例不多。傳統(tǒng)移動(dòng)端 UI 工程師在編寫(xiě)神經(jīng)網(wǎng)絡(luò)代碼時(shí),可以查閱到的移動(dòng)端深度學(xué)習(xí)資料也很少。另一方面,時(shí)下的互聯(lián)網(wǎng)競(jìng)爭(zhēng)又頗為激烈,先入咸陽(yáng)者王,可以率先將深度學(xué)習(xí)技術(shù)在移動(dòng)端應(yīng)用起來(lái),就可以更早地把握時(shí)代先機(jī)。
移動(dòng)端設(shè)備的運(yùn)算能力相對(duì) PC 端非常弱小。由于移動(dòng)端的 CPU 要將功耗指標(biāo)維持在很低的水平,制約了性能指標(biāo)的提升。在 App 中做神經(jīng)網(wǎng)絡(luò)運(yùn)算會(huì)使 CPU 運(yùn)算量猛增。如何協(xié)調(diào)好用戶功耗指標(biāo)和性能指標(biāo)就顯得至關(guān)重要。
百度圖像搜索客戶端團(tuán)隊(duì)在 2015 年底就開(kāi)始針對(duì)移動(dòng)端深度學(xué)習(xí)技術(shù)應(yīng)用進(jìn)行攻關(guān)。最終,挑戰(zhàn)性問(wèn)題被逐一解決,現(xiàn)今相關(guān)代碼已經(jīng)在很多 App 上運(yùn)行,這些 App 有日 PV 億級(jí)的產(chǎn)品,也有創(chuàng)業(yè)期的產(chǎn)品。
在移動(dòng)端應(yīng)用深度學(xué)習(xí)技術(shù)本已困難重重,而在手機(jī)百度這種量級(jí)的產(chǎn)品上應(yīng)用,更是要面對(duì)各種機(jī)型和硬件、手機(jī)百度的指標(biāo)要求。如何使神經(jīng)網(wǎng)絡(luò)技術(shù)穩(wěn)定高效運(yùn)轉(zhuǎn)是最大的考驗(yàn)。拆解問(wèn)題就是移動(dòng)端團(tuán)隊(duì)面對(duì)的首要問(wèn)題。我們簡(jiǎn)單總結(jié)后發(fā)現(xiàn)移動(dòng)端與服務(wù)器端進(jìn)行對(duì)比更容易呈現(xiàn)問(wèn)題和難點(diǎn),繼而在服務(wù)器端和客戶端做了以下深度學(xué)習(xí)技術(shù)應(yīng)用對(duì)比。
難點(diǎn)與服務(wù)器端對(duì)比內(nèi)存內(nèi)存:服務(wù)器端弱限制 – 移動(dòng)端內(nèi)存有限耗電量耗電量:服務(wù)器端不限制 – 移動(dòng)端嚴(yán)格限制依賴庫(kù)體積依賴庫(kù)體積:服務(wù)器端不限制 – 移動(dòng)端強(qiáng)限制模型體積模型大?。悍?wù)器端常規(guī)模型體積 200M 起 – 移動(dòng)端不宜超過(guò) 10M性能性能:服務(wù)器端強(qiáng)大 GPU BOX – 移動(dòng)端 CPU 和 GPU
在開(kāi)發(fā)過(guò)程中,團(tuán)隊(duì)逐步解決掉以上困難,形成了現(xiàn)在的 MDL 深度學(xué)習(xí)框架。為了讓更多移動(dòng)端工程師能夠快速用輪子、專注業(yè)務(wù),百度開(kāi)源了全部相關(guān)代碼,社區(qū)也歡迎任何人加入到造輪子的開(kāi)發(fā)過(guò)程中來(lái)。
MDL 框架設(shè)計(jì)
設(shè)計(jì)思路
作為一款移動(dòng)端深度學(xué)習(xí)框架,我們充分考慮到移動(dòng)應(yīng)用自身及運(yùn)行環(huán)境的特點(diǎn),在速度、體積、資源占用率等方面提出了嚴(yán)格的要求,因?yàn)槠渲腥魏我豁?xiàng)指標(biāo)對(duì)用戶體驗(yàn)都有重大影響。
同時(shí),可擴(kuò)展性、魯棒性、兼容性也是我們?cè)O(shè)計(jì)之初就考慮到了的。為了保證框架的可擴(kuò)展性,我們對(duì) layer 層進(jìn)行了抽象,方便框架使用者根據(jù)模型的需要,自定義實(shí)現(xiàn)特定類型的層,我們期望 MDL 通過(guò)添加不同類型的層實(shí)現(xiàn)對(duì)更多網(wǎng)絡(luò)模型的支持,而不需要改動(dòng)其他位置的代碼;為了保證框架的魯棒性,MDL 通過(guò)反射機(jī)制,將 C++ 底層異常拋到應(yīng)用層,應(yīng)用層通過(guò)捕獲異常對(duì)異常進(jìn)行相應(yīng)處理,如通過(guò)日志收集異常信息、保證軟件可持續(xù)優(yōu)化等;目前行業(yè)內(nèi)各種深度學(xué)習(xí)訓(xùn)練框架種類繁多,而 MDL 不支持模型訓(xùn)練能力,為了保證框架的兼容性,我們提供 Caffe 模型轉(zhuǎn) MDL 的工具腳本,使用者通過(guò)一行命令就可以完成模型的轉(zhuǎn)換及量化過(guò)程,后續(xù)我們會(huì)陸續(xù)支持 PaddlePaddle、TensorFlow 等模型轉(zhuǎn) MDL,兼容更多種類的模型。
總體架構(gòu)
MDL 框架的總體架構(gòu)設(shè)計(jì)圖如下:
MDL 框架主要包括模型轉(zhuǎn)換模塊(MDL Converter)、模型加載模塊(Loader)、網(wǎng)絡(luò)管理模塊(Net)、矩陣運(yùn)算模塊(Gemmers)及供 Android 端調(diào)用的 JNI 接口層(JNI Interfaces)。其中,模型轉(zhuǎn)換模塊主要負(fù)責(zé)將 Caffe 模型轉(zhuǎn)為 MDL 模型,同時(shí)支持將 32bit 浮點(diǎn)型參數(shù)量化為 8bit 參數(shù),從而極大地壓縮模型體積;模型加載模塊主要完成模型的反量化及加載校驗(yàn)、網(wǎng)絡(luò)注冊(cè)等過(guò)程,網(wǎng)絡(luò)管理模塊主要負(fù)責(zé)網(wǎng)絡(luò)中各層 Layer 的初始化及管理工作;MDL 提供了供 Android 端調(diào)用的 JNI 接口層,開(kāi)發(fā)者可以通過(guò)調(diào)用 JNI 接口輕松完成加載及預(yù)測(cè)過(guò)程。
MDL 定位簡(jiǎn)單可用
MDL 開(kāi)源項(xiàng)目在實(shí)施之初就已經(jīng)有了清晰定位。在設(shè)備繁雜且性能較低的移動(dòng)端平臺(tái)技術(shù)研發(fā)過(guò)程中,能夠?yàn)樾路f的深度學(xué)習(xí)技術(shù)找到合適場(chǎng)景并應(yīng)用到自己的產(chǎn)品中是非常吸引人的。但如果讓每個(gè)移動(dòng)端工程師在應(yīng)用深度學(xué)習(xí)過(guò)程中都要重新寫(xiě)一次全部神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn),會(huì)增加較大成本。MDL 的定位是簡(jiǎn)單地使用和部署神經(jīng)網(wǎng)絡(luò),如果使用基本功能則不需要進(jìn)行過(guò)多配置和修改,甚至連機(jī)器學(xué)習(xí)庫(kù)的編譯過(guò)程都不需要,只需要關(guān)注具體業(yè)務(wù)實(shí)現(xiàn)、如何使用即可。
與此同時(shí) MDL 簡(jiǎn)單清晰的代碼結(jié)構(gòu)也可以作為學(xué)習(xí)材料,為剛剛接觸深度學(xué)習(xí)的研發(fā)工程師提供參考。因?yàn)槲覀冊(cè)谥С质謾C(jī)平臺(tái)交叉編譯同時(shí),也支持 Linux 和 Mac 的 x86 平臺(tái)編譯,在調(diào)整深度學(xué)習(xí)代碼的同時(shí)可以直接在工作電腦上編譯運(yùn)行,而不需要部署到 arm 平臺(tái)。所需要的只是簡(jiǎn)單的幾行代碼,具體可以查閱 MDL 的 GitHub Readme。
# https://github.com/baidu/mobile-deep-learning # mac or linux: ./build.sh mac cd build/release/x86/build ./mdlTest
復(fù)雜的編譯過(guò)程往往比開(kāi)發(fā)的時(shí)間更長(zhǎng),在 MDL 中只要一行./build.sh android 就能把 so、測(cè)試 test 都搞定,部署非常簡(jiǎn)便。
./build.sh android
MDL 的性能及兼容性
- 體積 armv7 300k+
- 速度 iOS GPU mobilenet 可以達(dá)到 40ms、squeezenet 可以達(dá)到 30ms
MDL 從立項(xiàng)到開(kāi)源,已經(jīng)迭代了一年多。移動(dòng)端比較關(guān)注的多個(gè)指標(biāo)都表現(xiàn)良好,如體積、功耗、速度。百度內(nèi)部產(chǎn)品線在應(yīng)用前也進(jìn)行過(guò)多次對(duì)比,和已開(kāi)源的相關(guān)項(xiàng)目對(duì)比,MDL 能夠在保證速度和能耗的同時(shí)支持多種深度學(xué)習(xí)模型,如 mobilenet、googlenet v1、squeezenet 等,且具有 iOS GPU 版本,squeezenet 一次運(yùn)行最快可以達(dá)到 3-40ms。
同類框架對(duì)比
框架Caffe2TensorFlowncnnMDL(CPU)MDL(GPU)硬件CPUCPUCPUCPUGPU速度慢慢快快極快體積大大小小小兼容Android&iOSAndroid&iOSAndroid&iOSAndroid&iOSiOS
與支持 CNN 的移動(dòng)端框架對(duì)比,MDL 速度快、性能穩(wěn)定、兼容性好、demo 完備。
兼容性
MDL 在 iOS 和 Android 平臺(tái)均可以穩(wěn)定運(yùn)行,其中 iOS10 及以上平臺(tái)有基于 GPU 運(yùn)算的 API,性能表現(xiàn)非常出色,在 Android 平臺(tái)則是純 CPU 運(yùn)行。高中低端機(jī)型運(yùn)行狀態(tài)和手機(jī)百度及其他 App 上的覆蓋都有絕對(duì)優(yōu)勢(shì)。
MDL 同時(shí)也支持 Caffe 模型直接轉(zhuǎn)換為 MDL 模型。
MDL 特性一覽
在移動(dòng) AI 相關(guān)研發(fā)啟動(dòng)之初,百度圖像搜索團(tuán)隊(duì)對(duì)比了大部分已經(jīng)開(kāi)源的同類 CNN 框架,百家爭(zhēng)鳴的同時(shí)也暴露了該方向的問(wèn)題。一些框架實(shí)驗(yàn)數(shù)據(jù)表現(xiàn)優(yōu)秀,實(shí)際產(chǎn)品中或是表現(xiàn)較差且性能極不穩(wěn)定,或是機(jī)型無(wú)法全覆蓋,或是體積達(dá)不到上線標(biāo)準(zhǔn)。為了避免這些問(wèn)題,MDL 加入了以下 Features:
- 一鍵部署,腳本參數(shù)就可以切換 iOS 或者 Android
- 支持 Caffe 模型全自動(dòng)轉(zhuǎn)換為 MDL 模型
- 支持 GPU 運(yùn)行
- 已經(jīng)測(cè)試過(guò)可以穩(wěn)定運(yùn)行 MobileNet、GoogLeNet v1、squeezenet 模型
- 體積極小,無(wú)任何第三方依賴,純手工打造
- 提供量化腳本,直接支持 32 位 float 轉(zhuǎn) 8 位 uint,模型體積量化后在 4M 上下
- 與 ARM 相關(guān)算法團(tuán)隊(duì)線上線下多次溝通,針對(duì) ARM 平臺(tái)會(huì)持續(xù)優(yōu)化
- NEON 使用涵蓋了卷積、歸一化、池化等運(yùn)算過(guò)程
- loop unrolling 循環(huán)展開(kāi),為提升性能減少不必要的 CPU 消耗,全部展開(kāi)判斷操作
- 將大量繁重的計(jì)算任務(wù)前置到 overhead 過(guò)程
后續(xù)規(guī)劃
- 為了讓 MDL 體積進(jìn)一步縮小,MDL 并未使用 protobuf 做為模型配置存儲(chǔ),而是使用了 Json 格式。目前 MDL 支持 Caffe 模型轉(zhuǎn)換到 MDL 模型,未來(lái)會(huì)支持全部主流模型轉(zhuǎn)換為 MDL 模型。
- 隨著移動(dòng)端設(shè)備運(yùn)算性能的提升,GPU 在未來(lái)移動(dòng)端運(yùn)算領(lǐng)域?qū)?huì)承擔(dān)非常重要的角色,MDL 對(duì)于 GPU 的實(shí)現(xiàn)極為看重。目前 MDL 已經(jīng)支持 iOS GPU 運(yùn)行,iOS10 以上版本機(jī)型均可以使用。根據(jù)目前得到的統(tǒng)計(jì)數(shù)據(jù)顯示,iOS10 已經(jīng)涵蓋絕大部分 iOS 系統(tǒng),在 iOS10 以下可以使用 CPU 運(yùn)算。除此之外,雖然 Android 平臺(tái)目前的 GPU 運(yùn)算能力與 CPU 相比整體偏弱,但日益涌現(xiàn)的新機(jī)型 GPU 已經(jīng)越來(lái)越強(qiáng)大。MDL 后面也將加入 GPU 的 Feature 實(shí)現(xiàn),基于 OpenCL 的 Android 平臺(tái) GPU 運(yùn)算會(huì)讓高端機(jī)型的運(yùn)算性能再提升一個(gè)臺(tái)階。
歡迎開(kāi)發(fā)者貢獻(xiàn)代碼
移動(dòng)端神經(jīng)網(wǎng)絡(luò)的穩(wěn)定高效運(yùn)行,離不開(kāi)諸多開(kāi)發(fā)者的編碼。MDL 長(zhǎng)期本著靠譜運(yùn)行、實(shí)用而不虛美的宗旨,希望能為移動(dòng)端深度學(xué)習(xí)技術(shù)添磚加瓦。強(qiáng)烈歡迎有識(shí)之士濟(jì)濟(jì)加入,將深度學(xué)習(xí)技術(shù)在移動(dòng)端廣泛應(yīng)用、播揚(yáng)海內(nèi)。
最后再次奉上 MDL 的 GitHub 目錄:
https://github.com/baidu/mobile-deep-learning
End.
轉(zhuǎn)載請(qǐng)注明來(lái)自36大數(shù)據(jù)(36dsj.com): 36大數(shù)據(jù) ? 百度開(kāi)源移動(dòng)端深度學(xué)習(xí)框架mobile-deep-learning