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