AWS研究熱點:BMXNet – 基於MXNet的開源二進神經網絡實現

http://www.atyun.com/9625.htmlhtml

最近提出的二進神經網絡(BNN)能夠經過應用逐位運算替代標準算術運算來大大減小存儲器大小和存取率。經過顯着提升運行時的效率並下降能耗,讓最早進的深度學習模型也能在低功耗設備上使用。這種技術結合了對開發者友好的OpenCL(與VHDL或Verilog相比),同時也讓FPGA成爲深度學習的可行選擇。git

在這篇文章中,咱們要介紹BMXNet,它是一種基於Apache MXNet的開源BNN(二進神經網絡)庫。成熟的BNN層能夠很好地應用於其餘標準庫組件,而且在GPU和CPU模式均可以工做。BMXNet由Hasso Plattner研究所的多媒體研究小組維護和開發,並根據Apache許可發佈。庫、示例項目以及預訓練的二進制模型集合可從https://github.com/hpi-xnor下載。github

框架

BMXNet提供支持輸入數據和權重二值化的激活,卷積和徹底鏈接的層。這些層被設計成相應MXNet變體的嵌入式替代,稱爲QActivation,QConvolution和QFullyConnected。它們提供了一個額外的參數act_bit,它能夠控制由層計算的位寬度。在列表1和列表2中展現了使用推薦的二進制層與MXNet相比較的Python示例。在網絡中的第一層和最後一層不能使用二進制層,由於這可能會大大下降精度。BMXNet中BNN的標準塊結構:QActivation-QConvolution或QFullyConnected-BatchNorm-Pooling以下所示。ubuntu

AWS研究熱點:BMXNet – 基於MXNet的開源二進神經網絡實現

在傳統的深度學習模型中,全鏈接層和卷積層主要依賴於矩陣的點積,這須要大量的浮點運算。相反,使用二值化權重和輸入數據能夠經過利用CPU指令xnorpopcount來執行高性能矩陣乘法實現。如今大多數的CPU都針對這些類型的操做進行了優化。每一行的A和每一列的B的乘法和加法的點積近似於,首先將它們與xnor操做結合起來而後統計結果中位組爲1的數量,也就是位1計數。這樣咱們就能夠利用這種按位操做的硬件支持。位1計數指令在支持SSE4.2的x86和x64 CPU上可用,而在ARM架構中,它包含在NEON指令集中。使用這些說明的未優化的GEMM(通用矩陣乘法)實現如列表3所示:緩存

AWS研究熱點:BMXNet – 基於MXNet的開源二進神經網絡實現

編譯器內置的popcount由gcc和clang支持,它編譯並轉換爲支持的硬件上的機器指令。BINARY_WORD是封裝的數據類型,存儲32(x86和ARMv7)或64(x64)矩陣元素,每一個元素表明一個位。咱們實施了幾個優化版本的xnor的GEMM內核,咱們嘗試經過阻止和打包數據以及使用unrolling和並行化技術來利用處理器緩存層次結構。網絡

訓練和推理

在訓練階段,當將權重和輸入值限制在離散值-1和+1之間時,咱們仔細設計二值化層以精確匹配MXNet內置層的輸出(使用BLAS點產品操做計算)。在計算點積後,咱們將結果映射回所提出的xnor樣式點積的值範圍,以下式所示:架構

AWS研究熱點:BMXNet – 基於MXNet的開源二進神經網絡實現

其中n是值範圍參數。此設置可經過應用CuDNN實現GPU支持的大規模並行訓練。而後,訓練後的模型可用於對功能不強大的設備(無GPU支持和小型存儲空間)進行推理,其中預測的前向傳遞將使用xnor和popcount操做而不是標準算術運算來計算點積。框架

在使用BMXNet訓練網絡後,權重存儲在32位浮點變量中。這一樣適用於以1位位寬訓練的網絡。咱們提供一個model_converter,它讀取二進制訓練的模型文件,並封裝QConvolution和QFullyConnected的權重。轉換後,每一個權重僅使用1位存儲和運行時內存。例如,具備徹底精確權重的ResNet-18網絡(在CIFAR-10上)的大小爲44.7MB。咱們的模型轉換器的轉換實現29倍壓縮,壓縮後的文件大小爲1.5MB。性能

分類精度

咱們用BNN在MNIST(手寫數字識別),CIFAR-10(圖像分類)數據集上進行了實驗。實驗在具備Intel(R)Core TM i7-6900K CPU,64GB RAM和4TITAN X(Pascal)GPU的工做站上進行。學習

AWS研究熱點:BMXNet – 基於MXNet的開源二進神經網絡實現

上表列出了咱們在MNIST和CIFAR-10上訓練的二進制和全精度模型的分類測試精度。咱們能看到表內顯示二進制模型很是小。而且準確性仍然很不錯。咱們還在ImageNet數據集上進行了二值化,部分二值化和全精度模型的實驗,其中部分二值化模型結果不錯,而徹底二值化的模型仍具備很大的改進空間(更多細節訪問論文:https://arxiv.org/abs/1705.09864)。

效率分析

咱們對基於ubuntu160.04/64位平臺的不一樣GEMM方法的效率進行了實驗,採用英特爾2.50GHz×4 CPU,配有popcnt指令(SSE4.2)和8G RAM。測量在卷積層內進行。在這裏,咱們修改參數以下:filter number = 64,kernel size = 5×5,batch size = 200,矩陣大小M,N,K分別爲64,12800,kernel_w×kernel_h×inputChannelSize。下圖顯示告終果。

AWS研究熱點:BMXNet – 基於MXNet的開源二進神經網絡實現

不一樣顏色的柱形表示不一樣輸入通道大小的處理時間(以毫秒爲單位):xnor_32和xnor_64表示xnor和gemm在32位和64位中操做;xnor_64_omp表示經過使用OpenMP並行程序庫加速的64位xnor和gemm;「binarize input and xnor_64_omp」進一步累加了輸入數據二值化的處理時間。經過積累輸入數據的二值化時間,咱們仍然實現了比Cblas方法快約13倍的加速度。

結論

咱們在基於MXNet的C/C++中引入了BMXNet,一種開源二進制神經網絡實現。在咱們目前的實驗中,咱們已經實現了高達29倍模型大小的節省和更高效的二進制gemm計算。咱們開發了針對Android和iOS的圖像分類的示例應用程序,並使用了一個二進制的resne-18模型。

GitHub地址:https://github.com/hpi-xnor

相關文章
相關標籤/搜索