王騫,陶青川
(四川大學(xué)電子信息學(xué)院,成都 610065)
近年來,由于深度學(xué)習(xí)技術(shù)的蓬勃發(fā)展,深度卷積神經(jīng)網(wǎng)絡(luò)也被大量地運用于生活中的各種場景,例如人臉識別、人臉檢測、異常檢測、姿態(tài)估計,等等。盡管其應(yīng)用廣泛,但是其龐大的計算量和內(nèi)存占用始終是深度神經(jīng)網(wǎng)絡(luò)無法全面落地的一個重要原因。很多大型深度卷積神經(jīng)網(wǎng)絡(luò)的精度非常高,但往往伴隨著龐大的參數(shù)量和計算量,例如VGG[6],ResNet[5],MobileNetV3[7],ShuffleNet[8],等等。但是他們的權(quán)重模型參數(shù)巨大,從幾十MB 到幾個GB 不等,這使得這項技術(shù)很難在需求更加廣泛的邊緣計算設(shè)備上運用。眾所周知,邊緣計算設(shè)備是嚴(yán)重的計算和內(nèi)存資源受限的,比如常用的嵌入式開發(fā)板,其普通的芯片算力可能只有幾個GFLOPs,而上述所說的網(wǎng)絡(luò)模型少則幾個GFLOPs 的計算量,多則幾十、幾百GFLOPs 甚至幾個TFLOPs 的計算量,而大多數(shù)應(yīng)用場景又要求能夠?qū)崟r的計算,所以原本的網(wǎng)絡(luò)模型根本無法在邊緣嵌入式設(shè)備上進(jìn)行模型部署。
針對上述問題,工業(yè)界和學(xué)術(shù)界都在努力解決,都在盡可能地將網(wǎng)絡(luò)模型縮小,降低模型前向推理時的計算量和內(nèi)存占用,并且也取得了相當(dāng)不錯的成果。目前主流的方法有四種:①設(shè)計輕量化的網(wǎng)絡(luò)結(jié)構(gòu),比如使用于手機端的Mo?bileNet系列、ShuffleNet系列都是輕量化設(shè)計的典范,其中設(shè)計的深度可分離卷積和分組卷積效果很好,其性能在配合手機端的GPU 時非常不錯。②模型剪枝[10],其基本方法是將訓(xùn)練好的浮點模型中的神經(jīng)元根據(jù)信息量大小進(jìn)行屏蔽,將網(wǎng)絡(luò)稀疏化,達(dá)到降低內(nèi)存開銷,加速推理過程,剪枝方法包括結(jié)構(gòu)化剪枝和非結(jié)構(gòu)化剪枝。③知識蒸餾[10],即通過訓(xùn)練一個大的精度非常高的模型來指導(dǎo)一個設(shè)計好的小模型,在訓(xùn)練過程中通過凍結(jié)大模型的權(quán)重參數(shù),反向傳播時只更新小模型的參數(shù),然后使得小模型在最后的輸出或者中間層的輸出逼近大模型的輸出結(jié)果,如此便能使小模型獲得和大模型相近的精度,但是在計算量上小模型較大模型卻大大降低。④模型量化[4],即將訓(xùn)練好的浮點網(wǎng)絡(luò)模型,通過某種算法將權(quán)重參數(shù)映射到某個定點數(shù)域內(nèi),如此網(wǎng)絡(luò)的運算便從浮點運算變?yōu)槎c運算,然后通過與特定的計算指令例如SIMD(單指令多數(shù)據(jù)流)配合,既可提高運算速度,也可以降低內(nèi)存占用,可謂一舉兩得。
盡管壓縮方法有很多,但是邊緣設(shè)備的計算能力始終有限,因此本文選取了一款神經(jīng)網(wǎng)絡(luò)加速芯片并通過使用在感知量化算法[4],在訓(xùn)練中不指定每層的量化精度,而為每個網(wǎng)絡(luò)層設(shè)置了一個可學(xué)習(xí)參數(shù),用以學(xué)習(xí)該層應(yīng)該采用的量化精度,使得網(wǎng)絡(luò)以自適應(yīng)的方式去選擇量化的精度。并且本文設(shè)計的算法是通過異構(gòu)計算的方式部署在邊緣端,推理性能極高、功耗極低。實驗證明,本文所設(shè)計的算法在精度,耗時和功耗上都具有很大的優(yōu)勢,可以很好地滿足實際需求。
對稱量化算法屬于后量化算法的一種,這種量化算法也被廣泛應(yīng)用于各種邊緣設(shè)備,英偉達(dá)的tensorRT 便是使用了這種量化算法。其原理如下:假設(shè)要量化網(wǎng)絡(luò)的其中一個卷積核,量化精度為8 bit,量化范圍為-128~127,卷積核的尺寸為cin×cout×k×k,那么首先就要計算出此卷積核中的權(quán)重的最大值和最小值,比較最大值與最小值的絕對值大小,保留絕對值較大的并以此作為截斷極值,如圖1 所示,即截斷范圍為-max |xi|~max |xi|,然后根據(jù)映射公式(1)將32位浮點值映射到8 bit 定點數(shù)域內(nèi),這樣便完成了32 位浮點數(shù)到8 位定點數(shù)的參數(shù)量化,可以看到浮點的每個權(quán)重占的內(nèi)存為4 bit,量化為8 位精度之后占用變成了1 bit,實現(xiàn)了模型的4 倍壓縮。不僅如此,在邊緣設(shè)備上,以armv8a 架構(gòu)為例,以往的一條指令可以計算一個4 bit 的加法,那么量化為1 bit 之后,使用單指令多數(shù)據(jù)流的方式,一條指令可以實現(xiàn)4 個1 bit 數(shù)的加法,由此可見不僅僅模型的內(nèi)存占用降低了4 倍,計算速度同樣也會提升4倍。

圖1 對稱量化原理
然而,對于對稱量化算法,如果權(quán)重值的分布為非均勻分布,那么浮點值分布比較密集的區(qū)域的值會被映射到值域很窄的定點數(shù)范圍,而當(dāng)浮點值大部分集中在max ( |xi|)附近而-max ( |xi|)~min(xi)之間并沒有分布太多的參數(shù)時,那么在對應(yīng)的量化范圍內(nèi)的量化值就會被浪費掉,這就會導(dǎo)致網(wǎng)絡(luò)的精度有很大的下降幅度。
線性量化的一般步驟為:①求取尺度因子:②舍入小數(shù);②截斷超界值。首先對步驟1,量化首先要將量化前的32位浮點值wf映射到整點數(shù)域內(nèi):

例如對于8 比特對稱量化來說,zmax= 127,zmin= -128,wmax為待量化權(quán)重的最大值,wmin為待量化權(quán)重的最小值,wq為縮放后的權(quán)重值,scale為求取的尺度因子。對浮點權(quán)值進(jìn)行縮放后我們得到的權(quán)值仍然為浮點數(shù),此時再通過公式(3)將浮點數(shù)近似到定點數(shù)。

然而在進(jìn)行了縮放和取整運算之后由于小數(shù)位可能會向上取整,故取整后的值會存在超界問題,所以在取整之后再通過公式(4)對整數(shù)值進(jìn)行截斷即可。

由圖2 所示,與對稱量化算法對比,非對稱量化算法的最大值與最小值的選取不是求得了最大絕對值之后取對稱區(qū)間,而是直接由將最大值與最小值包圍的權(quán)值分布區(qū)間映射到定點數(shù)的數(shù)域。與對稱量化不同的是,非對稱量化的零點的求取不是直接令其等于0 而是根據(jù)映射公式(1),(2)求得,這是因為零點值在網(wǎng)絡(luò)計算過程中具有特殊意義,比如對卷積的補邊操作,在量化之后我們不能簡單的將原來應(yīng)該補0 的地方量化后仍然填充為0,此時在非對稱量化中我們就將計算的零點偏移值作為浮點中的零點值。由圖2 可知,采用非對稱量化后將原浮點模型映射到定點數(shù)后,因為沒有空余的浮點數(shù)域,那么在定點數(shù)區(qū)間上浪費的定點值會更少,如此非對稱量化的魯棒性會更好。

圖2 非對稱量化原理
感知量化算法對比于對稱和非對稱量化算法,它不是在浮點模型訓(xùn)練好后再對權(quán)重參數(shù)進(jìn)行量化,而是在訓(xùn)練過程中通過定義量化器(量化函數(shù)),對參數(shù)進(jìn)行實時訓(xùn)練,如圖3所示。

圖3 模擬量化示意圖
模擬量化操作即為將浮點數(shù)通過映射公式將原本的浮點值映射到定點數(shù)域,但是模擬量化僅僅是將定點數(shù)用浮點數(shù)來保存,此時還不是真正的定點數(shù),就是僅存有定點數(shù)的信息的浮點數(shù),只有在網(wǎng)絡(luò)訓(xùn)練好將權(quán)重轉(zhuǎn)為定點數(shù)之后,那么此時網(wǎng)絡(luò)模型就是真正的定點數(shù)。由此可見,在整個感知量化訓(xùn)練過程中,最重要的是如何定義模擬量化函數(shù)。在卷積神經(jīng)網(wǎng)絡(luò)中,模型訓(xùn)練通過反向傳播算法進(jìn)行訓(xùn)練,因此這個模擬量化函數(shù)也必須可以進(jìn)行反向傳播,而如果在訓(xùn)練時就真正的將浮點數(shù)保存為定點數(shù),那么反向傳播就無法完成,即網(wǎng)絡(luò)無法訓(xùn)練,所以實際的做法就是將32 位浮點數(shù)通過量化公式量化到定點數(shù)域,但此時的權(quán)重仍然是32位精度的,但是取值為定點數(shù)取值。
目前已經(jīng)有很多優(yōu)秀的AI加速芯片可以選擇,例如華為的昇騰系列;英偉達(dá)的TX、TK系列,英特爾的Movidius 神經(jīng)加速棒,但是這些芯片由于算力很強導(dǎo)致體積和功耗很高,在綜合考慮后本文選擇了一款極低功耗的、由Gyrfalcon Technology公司生產(chǎn)的加速芯片。此芯片采用的是自研的APiM 架構(gòu)(存儲和計算融合一體的本地并行AI 計算),大大節(jié)省了數(shù)據(jù)搬運環(huán)節(jié)的時延,有極高的計算密度。此款芯片有近30000個并行計算核心,但是功耗僅僅只有180 MW,在單張輸入圖片尺寸為224×224 的情況下,基于VGG16 的推理時間僅有5 ms,而VGG16在PC機上做一次推理需要3 s,由此可見此芯片在邊緣計算領(lǐng)域有很強的優(yōu)勢,這也是本文選擇這款芯片的主要原因。
本文采用的基準(zhǔn)網(wǎng)絡(luò)為VGG16,因為此網(wǎng)絡(luò)的參數(shù)量大,浮點模型的性能很好。由圖4 算法流程圖可知,本文設(shè)計的算法將VGG16切分為兩部分,第一部分為主干網(wǎng),此部分的網(wǎng)絡(luò)為從圖片輸入到第五層池化層,第二部分為第五層池化層之后的所有的層為分類頭。由網(wǎng)絡(luò)結(jié)構(gòu)可知,網(wǎng)絡(luò)的計算負(fù)載90%都在第一部分,因此我們將第一部分放在神經(jīng)網(wǎng)絡(luò)加速芯片上去計算。而對于第二部分網(wǎng)絡(luò)由于做分類或者回歸任務(wù)時我們的分類頭或者回歸頭需要有很寬的數(shù)域,故這部分我們未對它進(jìn)行量化,仍然使用浮點計算,這樣可以最大程度地保留網(wǎng)絡(luò)的精度。而我們對于需要量化的層都設(shè)置一個系數(shù)α,這個系數(shù)會隨著網(wǎng)絡(luò)的訓(xùn)練而不斷的變化,但是會被控制在1~8 范圍內(nèi),而每次計算的是其的滑動平均值,當(dāng)網(wǎng)絡(luò)訓(xùn)練結(jié)束后我們再對它進(jìn)行四舍五入得到的整數(shù)值便是本層的量化精度。

圖4 算法流程
由圖5可知,對于我們的算法,訓(xùn)練共分為4步。首先,我們在訓(xùn)練集上訓(xùn)練浮點模型,當(dāng)浮點模型達(dá)到精度要求后,將浮點模型權(quán)重當(dāng)成量化卷積訓(xùn)練的預(yù)訓(xùn)練模型,并在同一訓(xùn)練集上進(jìn)行訓(xùn)練。接下來我們再用量化卷積模型作為預(yù)訓(xùn)練模型去訓(xùn)練量化激活層,注意此時的卷積核中的權(quán)重已經(jīng)是浮點數(shù)表示的定點數(shù)了。當(dāng)量化激活層訓(xùn)練完成后,我們再使用一個很小的學(xué)習(xí)率,本文采用的是1e-7 來對網(wǎng)絡(luò)進(jìn)行一個微調(diào),但這一步并非必須。最后我們便得到了量化后的模型,再使用加速芯片供應(yīng)商提供的轉(zhuǎn)換庫,即可將我們的量化模型轉(zhuǎn)換為芯片特有模型數(shù)據(jù)格式(.model),然后即可將此模型用于芯片推理。

圖5 算法訓(xùn)練流程
本地訓(xùn)練和測試的計算機硬件配置為:CPU為Intel Core i5-7400,主頻為3.0 GHz,內(nèi)存8 GB;GPU為NVIDIA Geforce GTX1080 Ti,顯存為11 GB;操作系統(tǒng)為Ubuntu 16.04,開發(fā)環(huán)境為Pytorch 1.7.0,Python 3.7。網(wǎng)絡(luò)的主干網(wǎng)權(quán)值初始化使用了在ImageNet 數(shù)據(jù)集上預(yù)訓(xùn)練的模型,網(wǎng)絡(luò)的圖片輸入尺寸為224×224 的RGB 圖片。在數(shù)據(jù)預(yù)處理上做了色彩抖動,隨機裁剪,隨機反轉(zhuǎn),每批次圖片為16 張,并使用1e-3 為初始學(xué)習(xí)率,每50個訓(xùn)練集迭代減小0.5倍,共訓(xùn)練了300輪,圖6 顯示了量化模型在四步訓(xùn)練過程中的損失和準(zhǔn)確率的變化情況。邊緣計算設(shè)備我們使用的是ROC-3399-PC;CPU 為RK3399,處理器為ARM Cortex-A72(雙核)及Cortex A53(四核),GPU 為Mali T860(四核),主頻為2.0 GHz,內(nèi)存為2 GB,操作系統(tǒng)為Ubuntu18.04。且除芯片計算的模型以外的所有模型,在CPU 的前向推理我們都使用Ncnn開源框架完成。

圖6 模型在cifar100數(shù)據(jù)集上的損失和準(zhǔn)確率變化
由表1 可知,在本文所采用的實驗環(huán)境下,在Cifar10 上效果最好的網(wǎng)絡(luò)為MobileNetV3 精度達(dá)到了95.2%,本文所提出的量化模型的精度為93.6%,在Cifar100 數(shù)據(jù)集上標(biāo)準(zhǔn)的VGG16 取得了最好的結(jié)果為82.8%,本文提出的量化模型的精度為82.1%。模型參數(shù)量最大的是標(biāo)準(zhǔn)的VGG16 達(dá)到了528 MB,本文的量化模型的參數(shù)量為6.5 MB。且在將模型轉(zhuǎn)換為推理模型后,部署到開發(fā)板上測得的速度所提出的量化模型取得了最快的推理速度,單張圖片的前向推理速度為28 ms,實驗證明本文提出的算法可以在計算和內(nèi)存資源極其受限的邊緣嵌入式設(shè)備上達(dá)到實時推理性能。

表1 網(wǎng)絡(luò)準(zhǔn)確率對比
本文針對深度學(xué)習(xí)模型參數(shù)量大,計算耗時難以在邊緣計算設(shè)備上部署的問題,選用了一款神經(jīng)網(wǎng)絡(luò)前向推理加速芯片,并基于VGG16設(shè)計了一種自適應(yīng)的量化精度選擇算法。實驗證明本文所提出的量化算法在公開數(shù)據(jù)集上的測試性能略低于浮點精度模型,但是經(jīng)過量化后的模型的大小遠(yuǎn)遠(yuǎn)低于浮點模型,且由部署實驗可知,量化后的模型在邊緣計算設(shè)備上的單張圖片推理性能為28 ms,遠(yuǎn)遠(yuǎn)優(yōu)于浮點模型,證明了所提出算法的實用性和有效性。