PhoneBit: 基于手機(jī) GPU 的高能效二值神經(jīng)網(wǎng)絡(luò)加速引擎開源項目發(fā)布

在過去的幾年里,深度神經(jīng)網(wǎng)絡(luò)(DNN)已經(jīng)在計算機(jī)視覺和其他領(lǐng)域取得了巨大的進(jìn)展。然而,由于深度神經(jīng)網(wǎng)絡(luò)較高的計算復(fù)雜度,以及移動設(shè)備性能和功率限制,導(dǎo)致深度神經(jīng)網(wǎng)絡(luò)在移動設(shè)備上部署仍然具有挑戰(zhàn)性。二值神經(jīng)網(wǎng)絡(luò)(Binary Neural Networks)是一種特殊的神經(jīng)網(wǎng)絡(luò),它將網(wǎng)絡(luò)的權(quán)重和中間特征壓縮為 1 個比特位,通過使用位運算替代傳統(tǒng)的浮點運算來實現(xiàn)模型的壓縮與加速。現(xiàn)有的大多數(shù)神經(jīng)網(wǎng)絡(luò)計算框架,如MXNet、Caffe、TensorFlow等,它們大多為浮點計算框架,并只針對桌面平臺的獨立GPU優(yōu)化。相比桌面與服務(wù)器獨立GPU,移動端GPU往往與CPU合并在一塊芯片上作為SoC的一部分,同時存在著功率小、可分配資源少、帶寬低等限制,這使得在移動端GPU上進(jìn)行并行計算的優(yōu)化與獨立GPU有很大的不同。而在移動設(shè)備上,大多數(shù)輕量級框架如TensorFlow Lite,CNNdroid,Core ML,Caffe2等,它們大多支持浮點與8bit量化,并不支持BNN,同時存在一定兼容性問題,如TensorFlow Lite對移動GPU的支持并不完善。2019年8月,京東AI開源了第一個基于ARM CPU的高度優(yōu)化的BNN前向傳播計算框架daBNN,但是daBNN使用CPU計算使得daBNN和其他使用CPU計算的框架一樣,仍然具有在運算時發(fā)熱大、消耗電量快等缺點。因此,使用移動GPU對BNN進(jìn)行推理計算優(yōu)化仍然是一個空白。

中山大學(xué)無人系統(tǒng)研究所陳剛副教授和黃凱教授聯(lián)合鵬城實驗室發(fā)表在DATE 2020的論文 《PhoneBit: Efficient GPU-Accelerated Binary Neural Network Inference Engine for Mobile Phones》提出了業(yè)界首個基于手機(jī) GPU 的高能效二值神經(jīng)網(wǎng)絡(luò)加速引擎,針對移動端GPU進(jìn)行高度優(yōu)化。PhoneBit框架在進(jìn)行二值神經(jīng)網(wǎng)絡(luò)推理的同時,可大幅提升推理速度,降低計算消耗的電量以及帶來更高的能耗比。目前,PhoneBit框架已在鵬城匯智開源代碼托管平臺上正式發(fā)布(地址:https://code.ihub.org.cn/projects/915)。

PhoneBit框架及其優(yōu)化簡介

如下圖所示,PhoneBit框架加載一個在其他框架上訓(xùn)練好的模型,模型經(jīng)過轉(zhuǎn)換工具的轉(zhuǎn)換后,上傳至移動設(shè)備,只需要簡單幾步即可完成模型的部署。


PhoneBit框架于移動端快捷部署B(yǎng)NN模型

同時,PhoneBit框架為使用者提供了多項支持:

1) 提供了對多種常用神經(jīng)網(wǎng)絡(luò)層的支持,例如add,convolution,max pooling,average pooling,BN,dense,softmax等層,同時支持shortcut結(jié)構(gòu)并有對應(yīng)的優(yōu)化,理論上可適應(yīng)大多數(shù)網(wǎng)絡(luò)結(jié)構(gòu)。

2) 支持混合精度,支持32位浮點,16位浮點,int8整數(shù),二值化等計算方式。

3)提供了模型轉(zhuǎn)換工具,支持從ONNX(Open Neural Network Exchange)模型轉(zhuǎn)換至本框架專用模型,在轉(zhuǎn)換模型的同時進(jìn)行針對BNN的模型壓縮與半精度浮點格式的轉(zhuǎn)換,。

4) 考慮到Android應(yīng)用大多采用Java編寫,本框架提供了方便的Java API支持,使用者只需要簡單的調(diào)用幾行Java代碼,即可自動實現(xiàn)模型的GPU推理計算。


使用框架進(jìn)行BNN模型加載與推理

在BNN前向計算過程中,由于輸入特征與權(quán)重只包含1與-1兩種值,因此一個輸入特征和權(quán)重可以只用1個二進(jìn)制位來表示,而通常的輸入特征與權(quán)重是浮點數(shù),一個浮點數(shù)需要使用32個二進(jìn)制位來表示,二者相差32倍,因此,BNN相比通常的浮點DNN,理論上可以將模型縮小32倍,同時計算上提升32倍的速度。在計算卷積層時,有大量的向量點乘操作。在BNN中,通過數(shù)學(xué)推導(dǎo),傳統(tǒng)的浮點向量點乘操作可以被以下公式替代:

其中,與  是由浮點向量經(jīng)過壓縮后的二值向量,是向量的長度, 與  分別是 中每個比特位。因此,在BNN中的卷積計算時采用上述公式,就能完成使用1位二進(jìn)制位計算代替通常的32位計算,極大的減小了傳輸?shù)臄?shù)據(jù)量與計算量。同時,在BNN計算中將卷積層、Batch-Normalization(BN)層、二值化層(將浮點數(shù)據(jù)變?yōu)?與-1的層)整合,通過層與層之間的整合,層之間額外的數(shù)據(jù)傳輸以及計算量得到大幅度降低,從而節(jié)省時間。

同時,針對移動GPU的體系結(jié)構(gòu),PhoneBit框架采用了向量化訪存與計算、合并內(nèi)存訪問、隱藏訪存延遲、合理安排計算量負(fù)載、避免邏輯分支的判斷等計算優(yōu)化方法。相比于矢量方式1次指令只能讀取1個數(shù)據(jù),向量化方式讀寫使得計算時GPU可以只使用1次指令即可讀取若干個數(shù)據(jù)如4個、8個甚至16個,達(dá)到高效利用內(nèi)存帶寬的效果;合并內(nèi)存訪問則是將GPU中同一批計算單元安排處理內(nèi)存上連續(xù)的數(shù)據(jù),這樣訪存時不需要間隔訪問,達(dá)到最大的讀寫率;隱藏訪存延遲則通過安排GPU中一批計算單元計算時,另一批待計算的單元同時讀取數(shù)據(jù),避免相互等待;合理安排計算量負(fù)載則是根據(jù)計算規(guī)模的不同,調(diào)整GPU同一批計算單元進(jìn)行計算的數(shù)據(jù)量,使之不會因為計算數(shù)據(jù)量過少而造成浪費,也不會因為數(shù)據(jù)量過多造成擁塞。避免邏輯分支則是盡可能讓GPU中同一批計算單元執(zhí)行相同的條件分支代碼,節(jié)省執(zhí)行時間。通過以上優(yōu)化方法,PhoneBit框架速度比較如下:


于高通驍龍820平臺運行YOLOv2 Tiny網(wǎng)絡(luò)與現(xiàn)有主流浮點DNN框架對比

在高通驍龍820平臺,運行YOLOv2 Tiny網(wǎng)絡(luò),相比CNNdroid(一個基于Android RenderScript的浮點神經(jīng)網(wǎng)絡(luò)前向傳播框架),PhoneBit框架實現(xiàn)了1218-2378倍的速度提升,2.54-4.05倍更低的功率以及89-5263倍更高的能效比。相比TensorFlow Lite(谷歌針對移動設(shè)備提出的輕量級神經(jīng)網(wǎng)絡(luò)前向傳播框架,支持浮點與8bit量化模式),PhoneBit框架實現(xiàn)了10-15.6倍的速度提升,2-2.77倍更低的功率以及23.9-44倍更高的能效比。


于高通驍龍820平臺運行Bi-Real Net 18網(wǎng)絡(luò)與現(xiàn)有基于ARM的BNN框架對比

在高通驍龍820平臺,運行Bi-Real Net 18網(wǎng)絡(luò),相比daBNN(一個最新的基于ARM高度優(yōu)化的二值神經(jīng)網(wǎng)絡(luò)框架),PhoneBit框架實現(xiàn)了2.6倍的速度提升,2.62倍更低的功率以及6.8倍更高的能效比。


PhoneBit框架使用Bi-Real Net 18網(wǎng)絡(luò)對物品進(jìn)行分類

目前,PhoneBit框架項目仍在不斷快速迭代進(jìn)化,框架整體性能亦在不斷提升中,希望能夠以此項目為相關(guān)領(lǐng)域的科研工作者、開發(fā)者們提供一個穩(wěn)定易用、高效便捷的輕量化神經(jīng)網(wǎng)絡(luò)加速引擎。同時,也期望能有更多志同道合的朋友加入項目組,共同開發(fā)、優(yōu)化本項目,為PhoneBit框架的發(fā)展出一份力。

Share this article:

Facebook
Twitter
LinkedIn
WhatsApp