BNN - 基於low-bits量化壓縮的跨平台深度學習框架
本文介紹阿裏IDST部門研發、基於low-bits量化壓縮的深度學習框架BNN(Binary Neural Network),BNN具有以下特點:
1) 跨平台:BNN可以在不同的主流硬件平台上進行部署,包括ARM係列移動端處理器、Intel係列服務器以及正在開發中的NVidia的圖形處理器;
2)壓縮比高:使用了自研發low-bits量化壓縮技術,在算法精度幾乎無損的前提下能達到40-100倍壓縮率,而且我們也提供無需重新訓練的壓縮方式,極大簡化了迭代周期;
3)內嵌高度優化的矩陣運算庫GEMMi8:和市麵多種主流計算庫相比GEMMi8有多至4倍的性能優勢;
4)框架靈活:無第三方依賴,BNN定製化後大小不超過200K。
基於以上技術,BNN的手機端加速效果比市麵上同類產品的快2-3倍;
AI趨勢
近年來,人工智能已經逐漸融入到我們的日常生活,而深度學習作為其中一個分支,在計算機視覺、語音識別等領域也取得了重大突破。深度學習的開源框架也層出不窮,如Caffe,Tensorflow等等。與此同時,各大芯片巨頭(Intel、NVidia、Xilinx、ARM)也在硬件加速領域動作頻頻,紛紛推出針對人工智能加速的解決方案,連互聯網巨頭穀歌也花巨資研發了自己的硬件加速芯片TPU。
另一方麵,如圖1所示,隨著移動互聯網、IoT的蓬勃發展,數據采集、傳送量日益增大,雲和端的數據傳送瓶頸已經浮現,傳統的本地采集+雲處理方式已經不能滿足未來發展的需求,所以為了減輕雲端服務的壓力,同時滿足良好的用戶體驗、兼顧保護用戶隱私,行業領頭企業決定將計算任務適當前移,紛紛推出自己的移動端深度學習框架,如臉書的Caffe2Go,騰訊的NCNN,百度的MDL。與服務端不同,移動端深度學習框架受限於嚴格的設備硬件,在框架大小、性能、內存消耗、模型大小方麵都有很高的要求。
AI開發人員一方麵需要設計端到端的算法方案,對算法效果進行調優。另一方麵需要調研紛繁複雜的深度學習框架和硬件平台組合,確定前向方案,並為了達到上線的性能和成本要求進一步調優,此時往往會涉及到重新調整端到端算法方案,加長了產品迭代周期。為了解決這個瓶頸和痛點,我們提出了跨硬件平台的深度學習前向框架,便於開發者使用和部署,同時針對核心量化壓縮以及矩陣運算進行了深度優化,從而在性能上有了進一步的保障。
為了解決上述問題,我們提出了一套基於量化壓縮的跨平台深度學習框架:BNN(Binary Neural Network),一個高度優化的輕量深度學習前向框架,使用C/C++語言開發,跨平台,支持讀取Caffe模型文件,主要處理卷積神經網絡。與市麵上大多數移動端解決方案不同,我們的量化壓縮技術不僅針對模型的權重,還涉及到輸入的特征向量壓縮。針對這一特性我們在模型文件和內存大小得到裁剪的同時還對框架的性能做了大量優化。
另一方麵,矩陣乘法是深度學習的核心,也是神經網絡中耗時最多的步驟。例如在卷積神經網絡中,70%以上的耗時花在卷積層,而在很多深度學習框架中卷積過程被轉化成了矩陣乘法的數學模型,因此我們針對性地設計了一套矩陣計算庫GEMMi8(General Matrix Multiplication for Int8),內嵌在BNN框架中。GEMMi8是一個低精度矩陣乘法庫,兼容x86/ARM架構,可運行在雲端、移動端,以及開發中的GPU圖形處理器。
在BNN和GEMMi8的性能優化方麵我們做了很多工作,性能的評測上我們將GEMMi8與市麵上大量的數學計算庫在不同架構上做了矩陣乘法性能對比,包括Tensorflow默認的計算庫Eigen和在移動端有很高評價、Caffe使用的計算庫OpenBLAS,Arm公司自研的Arm Compute Library,還有大名鼎鼎的Intel MKL,Google的Gemmlowp。評測選擇了10個矩陣乘法規模作為基準用例,具體見附錄,單線程環境,大部分數據來自實際神經網絡中的矩陣大小,評測結果參見圖2和圖3。
可以看出矩陣乘法方麵,無論是x86架構還是移動端的ARM,GEMMi8相比其它計算庫都明顯的性能優勢(除了用例8,這是由於我們暫時還沒有根據矩陣的形狀做針對性的優化),高效的矩陣運算庫大大縮短了BNN處理神經網絡階段的耗時。
總體來說,BNN具有以下幾個特性(圖4):
1. 壓縮率高
在模型壓縮方麵,我們采用低精度整型代替浮點數據類型,再結合密集存儲等技術,在算法準確率幾乎無損的前提條件下可以達到40-100倍的壓縮率。而且我們也提供無需重新訓練的壓縮方式,極大簡化了迭代周期。目前我們已將模型壓縮方案在IDST的Gauss平台服務化,用戶可以將訓練好的模型上傳至雲端自動壓縮,或者直接在Gauss訓練模型,後者的精度更高。關於模型壓縮相關算法 ,我們後續會單獨介紹。
2.速度快
我們投入了大部分精力在性能優化上,主要使用的技術有SIMD,多線程,矩陣分塊,cache命中率,流水線,指令預取等等,其中核心模塊根據不同的硬件架構使用向量化的匯編語言編寫,性能業界領先。我們在實際項目中發現,某些場景使用FP32數據類型的傳統深度學習框架優化到一定程度後,性能的瓶頸往往在內存讀寫(Memory Bound),當內存帶寬占滿後即使處理器提供更高效的運算指令(如浮點數FMA)也無法進一步獲得加速。而量化後的低精度整數占用內存遠小於FP32,可以獲得更高的傳輸效率,避免CPU在訪存上過多地等待。關於BNN在移動端的性能評測,我們將BNN和基於OpenBLAS的Caffe以及騰訊公司的NCNN框架做了對比。考慮到當前移動端硬件配置以摩爾定律遞增,不難猜測在不久的將來運行在移動設備的網絡模型也會越來越大,我們采用了resnet18網絡模型做圖像識別,如圖5所示,BNN with gemmi8的網絡前向性能,是市麵上同類產品的2-3倍。
3.框架輕
框架無第三方依賴,BNN+GEMMi8定製化後大小不超過200K,可輕鬆移植到手機端運行。
4.跨硬件平台
目前BNN已經可以在Intel x86和ARM的主流CPU上運行,無論是服務器端、移動端、還是IoT場景(如門禁人臉識別、車載設備)都可以運行我們的框架,對GPU端、FPGA的支持也將稍後發布。
5.可擴展
針對不同的業務,可添加用戶自定義網絡層,增加了框架的靈活性。雖然目前僅支持Caffe,後續會逐步增加對主流人工智能框架的支持。
6.易使用
從離線的模型壓縮到在線的網絡前向過程提供自動化服務,無煩雜的人工幹預過程。
BNN框架的使用也非常簡單(如圖6所示),針對訓練好的Caffe模型,我們在Gauss平台上有模型壓縮的對外服務,也可以使用我們提供的離線工具自動量化,量化後的文件可以直接被BNN框架讀取。
目前BNN隻支持Caffe的離線模型量化,後期會逐漸添加對其它主流深度學習框架(如Tensorflow)模型的支持。
在業務落地方麵,BNN正接入了集團內多個BU的產品,包括黃圖識別,安全部人臉識別項目(如圖7),手淘直播等等。
BNN隻是IDST在人工智能算法服務化(AI-as-a-Service)的一個開端,我們的腳步並未放緩,我們希望能夠搭建更加完善的服務化框架(如profiling),讓人工智能開發者/算法工程師更加專注在場景和端到端方案的設計上。
矩陣測試用例表,用例2-10來自googlenet和resnet18。
用例/矩陣規模 |
Row,Col,Depth |
用例1 |
500,500,500 |
用例2 |
2000,2000,2000 |
用例3 |
64,3136,64 |
用例4 |
128,784,64 |
用例5 |
256,196,2304 |
用例6 |
512,49,2304 |
用例7 |
512,49,4608 |
用例8 |
32,12544,27 |
用例9 |
1024,49,1024 |
用例10 |
128,3136,128 |
1. Caffe (https://github.com/BVLC/caffe)
2. Tensorflow (https://github.com/tensorflow/tensorflow)
3. Eigen (https://bitbucket.org/eigen/eigen/src)
4. OpenBLAS (https://github.com/xianyi/OpenBLAS)
5. Arm Compute Library (https://github.com/ARM-software/ComputeLibrary)
6. Intel MKL (https://software.intel.com/en-us/mkl)
7. Gemmlwop (https://github.com/google/gemmlowp)
8. Extremely Low Bit Neural Network: Squeeze the Last Bit Out with ADMM (https://arxiv.org/abs/1707.09870)
作者 :李謀、竇則勝、孔建鋼、冷聰、李禺、李昊、顧震宇、戴宗宏。
最後更新:2017-11-02 17:04:01