唐 蕊,焦繼業(yè),徐華昊
西安郵電大學(xué) 計(jì)算機(jī)學(xué)院,西安 710121
近年來(lái),隨著人工智能應(yīng)用需求的快速增長(zhǎng),神經(jīng)網(wǎng)絡(luò)在學(xué)術(shù)研究和人工智能相關(guān)應(yīng)用中蓬勃發(fā)展,并被應(yīng)用于各種新興的智能領(lǐng)域,如語(yǔ)音識(shí)別、圖像分類等[1-4]。與此同時(shí),加速卷積運(yùn)算的硬件設(shè)計(jì)隨之產(chǎn)生,針對(duì)神經(jīng)網(wǎng)絡(luò)推理的加速芯片已成為該領(lǐng)域重要的發(fā)展方向。
目前針對(duì)嵌入式端的神經(jīng)網(wǎng)絡(luò)加速優(yōu)化,可以從模型壓縮和優(yōu)化加速運(yùn)算兩方面出發(fā)。從模型壓縮角度講,主要通過(guò)一定的優(yōu)化方式來(lái)減小網(wǎng)絡(luò)模型所占的存儲(chǔ)空間,其中包括模型剪枝和模型參數(shù)低精度量化,參數(shù)的低精度量化對(duì)卷積網(wǎng)絡(luò)中所有的運(yùn)算加速都有效。從優(yōu)化加速運(yùn)算來(lái)講,主要針對(duì)神經(jīng)網(wǎng)絡(luò)中的結(jié)構(gòu)及權(quán)重參數(shù)的共享性進(jìn)行相關(guān)硬件單元的設(shè)計(jì),可用來(lái)加快神經(jīng)網(wǎng)絡(luò)的執(zhí)行速度,優(yōu)化設(shè)計(jì)的整體性能[5-7]。文獻(xiàn)[1]采用了數(shù)據(jù)量化的方式,分析參數(shù)的取值范圍,先確定量化的大致精度,然后選出最優(yōu)量化精度,將原有參數(shù)從64 位浮點(diǎn)數(shù)量化為16 位定點(diǎn)數(shù)來(lái)表示,顯著提升了運(yùn)行速度,并提出相應(yīng)的計(jì)算和存儲(chǔ)設(shè)計(jì),結(jié)果證明對(duì)卷積網(wǎng)絡(luò)的性能有明顯提升。文獻(xiàn)[2]采用動(dòng)態(tài)可配置定點(diǎn)數(shù)據(jù)來(lái)表示網(wǎng)絡(luò)的權(quán)重和激活函數(shù),在推斷的過(guò)程中也可保持較高的準(zhǔn)確率。結(jié)果表明,低精度量化后,在盡可能保持準(zhǔn)確性的前提下,對(duì)內(nèi)存容量和帶寬的需求減小了50%。文獻(xiàn)[3]在進(jìn)行數(shù)據(jù)量化時(shí),采用的是非線性量化,分析每一層參數(shù)的范圍,確定數(shù)據(jù)量化的系數(shù),對(duì)參數(shù)進(jìn)行量化。谷歌TPU、NVIDIA Tesla V100、寒武紀(jì)DianNao[8-9]等是具有代表性的人工智能加速芯片,均采用了數(shù)據(jù)低精度量化的思想。在卷積神經(jīng)網(wǎng)絡(luò)中,網(wǎng)絡(luò)各層參數(shù)范圍各有差異,不同網(wǎng)絡(luò)層權(quán)重的概率分布也有一定的差異。
一般來(lái)說(shuō),神經(jīng)網(wǎng)絡(luò)中的參數(shù)主要為32 位和64 位浮點(diǎn)數(shù)。然而,隨著卷積神經(jīng)網(wǎng)絡(luò)模型的層數(shù)越來(lái)越多,其中權(quán)重參數(shù)數(shù)量也在增長(zhǎng)。因此網(wǎng)絡(luò)中包含的運(yùn)算量愈加復(fù)雜,在一些場(chǎng)景上限制了相應(yīng)網(wǎng)絡(luò)模型的部署,需要借助模型壓縮、優(yōu)化加速運(yùn)算等方法突破瓶頸[10-11]。通常情況下,嵌入式設(shè)備上計(jì)算資源是非常有限的,并且對(duì)功耗有著比較嚴(yán)格的要求,使得嵌入式設(shè)備的計(jì)算能力與存儲(chǔ)訪問(wèn)能力受到了極大的限制。卷積神經(jīng)網(wǎng)絡(luò)中較為復(fù)雜的運(yùn)算及存儲(chǔ)訪問(wèn)需求使其在嵌入端的部署成為難點(diǎn)[12],其中最為復(fù)雜的便是卷積運(yùn)算。針對(duì)以上情況,神經(jīng)網(wǎng)絡(luò)模型在嵌入式設(shè)備上進(jìn)行實(shí)現(xiàn),需在保持準(zhǔn)確性的前提下,解決其運(yùn)算量大、存儲(chǔ)需求大的問(wèn)題[13]。
為了解決該問(wèn)題,本文主要采用了將模型參數(shù)量化與硬件設(shè)計(jì)加速運(yùn)算的方式結(jié)合起來(lái)的方法,更大程度優(yōu)化網(wǎng)絡(luò)模型。首先,提出并設(shè)計(jì)了針對(duì)嵌入式平臺(tái)的低精度定點(diǎn)量化單元,研究了神經(jīng)網(wǎng)絡(luò)中經(jīng)過(guò)訓(xùn)練后的數(shù)據(jù)分布范圍及數(shù)據(jù)量化原理,根據(jù)最小誤差量化算法設(shè)計(jì)了動(dòng)態(tài)低精度量化單元,對(duì)數(shù)據(jù)進(jìn)行低精度定點(diǎn)量化。在保持精度的同時(shí)減小了數(shù)據(jù)的位寬,進(jìn)而減小了對(duì)內(nèi)存及帶寬的需求。其次,設(shè)計(jì)了可循環(huán)調(diào)用的矩陣卷積運(yùn)算的結(jié)構(gòu),使量化后的數(shù)據(jù)可并行執(zhí)行卷積運(yùn)算,進(jìn)而縮短了運(yùn)算的執(zhí)行時(shí)間,提升整體性能。本設(shè)計(jì)在減小網(wǎng)絡(luò)中數(shù)據(jù)位寬,實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)輕量化的同時(shí),又保證了數(shù)據(jù)精度,可用在對(duì)實(shí)時(shí)性要求高的嵌入式設(shè)備中。
在神經(jīng)網(wǎng)絡(luò)中,對(duì)其中的FP32 類型的參數(shù)進(jìn)行INT16 量化,使其模型更小,推斷更快。對(duì)參數(shù)量化精簡(jiǎn)的方式之所以有效,廣義來(lái)說(shuō),是由于經(jīng)過(guò)訓(xùn)練后的神經(jīng)網(wǎng)絡(luò)對(duì)噪聲和較小的擾動(dòng)具有魯棒性,意味著在將數(shù)據(jù)量化并做相關(guān)舍入處理后,卷積網(wǎng)絡(luò)的推斷過(guò)程依舊可以得到一個(gè)相當(dāng)準(zhǔn)確的結(jié)果[14-15]。因此參數(shù)量化在幾乎不犧牲精度的情況下,可使執(zhí)行速度加快,進(jìn)而有效提升對(duì)數(shù)據(jù)的處理能力。低精度量化從某個(gè)角度來(lái)說(shuō),是一種數(shù)據(jù)在不同范圍空間的映射[16]。經(jīng)過(guò)大量研究,針對(duì)神經(jīng)網(wǎng)絡(luò)中的低精度量化,總結(jié)得出下面結(jié)論:
(1)相比于FP32模型,低精度量化后卷積速度得到大幅提升。
(2)量化后的網(wǎng)絡(luò)模型權(quán)重所占空間降低60%~70%,有效提升對(duì)數(shù)據(jù)的處理能力。
(3)INT16 量化可以在提升運(yùn)行速度的同時(shí),可最大程度保持準(zhǔn)確性。
對(duì)于INT8量化來(lái)說(shuō),在追求運(yùn)行速度的同時(shí),準(zhǔn)確性也有更大程度的損失,本設(shè)計(jì)旨在實(shí)現(xiàn)高性能的同時(shí),也盡可能保持?jǐn)?shù)據(jù)最好精度,因此將輸入的FP32數(shù)據(jù)量化為INT16定點(diǎn)數(shù)據(jù),然后進(jìn)行卷積運(yùn)算。整體設(shè)計(jì)的原理如圖1,首先需要分析神經(jīng)網(wǎng)絡(luò)中參數(shù)的數(shù)值分布范圍,如第一層神經(jīng)元的輸入、權(quán)重等,然后進(jìn)行數(shù)據(jù)的低精度量化,并將量化后的數(shù)據(jù)放入存儲(chǔ)。在執(zhí)行卷積運(yùn)算時(shí)將數(shù)據(jù)從存儲(chǔ)中取出,下一時(shí)鐘周期送入并行卷積運(yùn)算單元進(jìn)行卷積計(jì)算,實(shí)現(xiàn)了取數(shù)據(jù)和運(yùn)算的流水結(jié)構(gòu)。卷積運(yùn)算后將結(jié)果依次送至下一個(gè)存儲(chǔ)。重復(fù)調(diào)用卷積運(yùn)算單元進(jìn)行卷積運(yùn)算。
然而,針對(duì)神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),從浮點(diǎn)數(shù)據(jù)量化而來(lái)的每個(gè)定點(diǎn)數(shù)據(jù),以及每個(gè)中間參數(shù)的精度都是不確定的,固定精度量化會(huì)產(chǎn)生一些不必要的誤差。經(jīng)過(guò)大量研究,結(jié)果表明,在對(duì)不同精度的數(shù)據(jù)進(jìn)行低精度量化時(shí),若采用固定精度定點(diǎn)量化,則量化后的數(shù)據(jù)精度越高,數(shù)據(jù)準(zhǔn)確性也越高。然而對(duì)于同等位寬數(shù)據(jù)進(jìn)行量化時(shí),采用動(dòng)態(tài)多精度量化的情況下,數(shù)據(jù)準(zhǔn)確性更高。當(dāng)采用16 bit 的數(shù)據(jù)動(dòng)態(tài)低精度量化時(shí),引入的誤差很小[17],并且對(duì)內(nèi)存容量和對(duì)帶寬的需求減小了50%。相比于固定精度定點(diǎn)量化,動(dòng)態(tài)多精度定點(diǎn)量化更適合神經(jīng)網(wǎng)絡(luò)中的卷積運(yùn)算,進(jìn)而最小化卷積網(wǎng)絡(luò)中數(shù)據(jù)量化過(guò)程產(chǎn)生的誤差。
因此針對(duì)該問(wèn)題,在本設(shè)計(jì)中使用動(dòng)態(tài)多精度定點(diǎn)量化方法對(duì)浮點(diǎn)數(shù)據(jù)進(jìn)行量化。
浮點(diǎn)與定點(diǎn)之間的量化關(guān)系如下所示:
圖1 量化卷積運(yùn)算原理示意圖
其中,x表示浮點(diǎn)數(shù),q表示這個(gè)浮點(diǎn)數(shù)對(duì)應(yīng)的Qn型定點(diǎn)數(shù)。
在量化單元的設(shè)計(jì)過(guò)程中,采用了最小誤差量化算法的思想,如式(3):
其中,Dfloat為輸入的原浮點(diǎn)型參數(shù),Dfixed(L,Q)為量化后的定點(diǎn)數(shù)據(jù)。由于網(wǎng)絡(luò)中的所有參數(shù)的精度不完全一致,根據(jù)輸入數(shù)據(jù)的數(shù)值范圍,選擇合適的數(shù)據(jù)量化比例并使用Q 格式表示,通過(guò)動(dòng)態(tài)設(shè)置數(shù)據(jù)的Q 值,即可調(diào)整量化后的定點(diǎn)數(shù)據(jù)精度,進(jìn)而最小化定點(diǎn)量化所帶來(lái)的誤差。
計(jì)算機(jī)中常用的數(shù)據(jù)類型有兩種,包括定點(diǎn)數(shù)和浮點(diǎn)數(shù)。一般來(lái)說(shuō),定點(diǎn)格式允許表示的數(shù)值范圍有限,但要求的處理硬件單元比較簡(jiǎn)單。浮點(diǎn)格式則相對(duì)復(fù)雜,浮點(diǎn)運(yùn)算廣泛應(yīng)用于通用處理器,如圖形處理器[18]。
定點(diǎn)數(shù)的小數(shù)點(diǎn)位置是固定的。定點(diǎn)運(yùn)算相比于浮點(diǎn)運(yùn)算有著更低的硬件成本,被廣泛應(yīng)用于神經(jīng)網(wǎng)絡(luò)加速器中,定點(diǎn)數(shù)可以在存儲(chǔ)數(shù)據(jù)時(shí)節(jié)省更多的內(nèi)存容量和帶寬資源。
一個(gè)定點(diǎn)數(shù)據(jù)的最大數(shù)值范圍取決于所給定的字長(zhǎng)。數(shù)值中定義整數(shù)最低位和小數(shù)最高位之間的方式被稱為定標(biāo),即指示了小數(shù)點(diǎn)的位置。定標(biāo)有兩種方法,包括Q 表示法和S 表示法,本設(shè)計(jì)中的量化部分借助Q表示法完成。
16 位定點(diǎn)數(shù)的部分Q 值以及每個(gè)Q 值的表示精度如表1。量化單元是該設(shè)計(jì)中的一大核心模塊,量化數(shù)據(jù)的精度決定了整個(gè)卷積運(yùn)算中的數(shù)據(jù)精度。對(duì)于16位的定點(diǎn)數(shù)據(jù),若保留最高精度可使用Q15 格式,即將數(shù)據(jù)放大215倍后用定點(diǎn)數(shù)表示,然而,若浮點(diǎn)數(shù)的有效數(shù)據(jù)超出該精度表示范圍,即使該數(shù)據(jù)量化后帶來(lái)的誤差非常小,但將會(huì)損失全部有效數(shù)據(jù)。因此量化適用于有效精度在Q格式可表示最高精度范圍內(nèi)的數(shù)據(jù),有效精度超出最高精度表示范圍的極少數(shù)據(jù)將被舍棄。
表1 16位定點(diǎn)數(shù)的Q格式表示及精度
使用數(shù)據(jù)量化會(huì)引入額外的空間存儲(chǔ)Q值,但是相比于存儲(chǔ)原本的浮點(diǎn)數(shù)據(jù),定點(diǎn)數(shù)與Q值所占的存儲(chǔ)空間會(huì)明顯降低,同時(shí)也降低了帶寬需求。
為進(jìn)一步解決量化過(guò)程中的誤差問(wèn)題,數(shù)據(jù)量化后使用了近似舍入方法對(duì)量化結(jié)果進(jìn)行微調(diào)。
在運(yùn)算過(guò)程中,對(duì)量化后的數(shù)據(jù)進(jìn)行數(shù)據(jù)舍入的方案也是至關(guān)重要的。例如定點(diǎn)數(shù)可以表示為[IL:FL],分別對(duì)應(yīng)著量化后定點(diǎn)數(shù)據(jù)的整數(shù)部分和小數(shù)部分,定點(diǎn)數(shù)據(jù)范圍是[-2IL-1,2IL-1-2-FL],其中IL、FL分別代表整數(shù)和小數(shù)位寬[19]。數(shù)據(jù)在量化過(guò)程中會(huì)涉及到數(shù)據(jù)截?cái)?,針?duì)此情況本設(shè)計(jì)按照就近舍入原則,對(duì)量化后的定點(diǎn)數(shù)據(jù)進(jìn)行分析,若定點(diǎn)數(shù)據(jù)中被截?cái)嗖糠肿罡呶粸?時(shí),即被舍去部分的數(shù)值大于真實(shí)數(shù)值的0.5時(shí),則將數(shù)據(jù)進(jìn)行向上取整,小于0.5時(shí)將數(shù)據(jù)向下取整,保留整數(shù)部分即可。本設(shè)計(jì)中的數(shù)據(jù)舍入公式如式(4):
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)主要包括輸入層、卷積層、池化層、全連接層及輸出層,其中最主要的運(yùn)算為卷積運(yùn)算,并且卷積層和全連接層包含的便是神經(jīng)網(wǎng)絡(luò)中最復(fù)雜、最耗時(shí)的運(yùn)算[20]。在常用的網(wǎng)絡(luò)模型中,如Alexnet 網(wǎng)絡(luò)中包含的計(jì)算量達(dá)到上億級(jí),單是乘法運(yùn)算就至少需要進(jìn)行7 億次。對(duì)于CNN的卷積層,每層的計(jì)算公式如式(5):
其中,w是權(quán)重矩陣,b為偏置,f是激活函數(shù),x是每一層的輸入,Y是每一層的輸出。
詳細(xì)來(lái)說(shuō),其中主要卷積運(yùn)算如下:
全部的n個(gè)輸入樣本為xi(i∈[1,n]),對(duì)應(yīng)的內(nèi)核權(quán)重為wi,j(i∈ [1,n],j∈[1,m]),相乘后可得到對(duì)應(yīng)的輸出w1,j x1+w2,j x2+…+wi,j xi+…+wn,j xn當(dāng)浮點(diǎn)數(shù)量化為低精度的定點(diǎn)數(shù)后,根據(jù)輸入的參數(shù)量化為使用Q格式的定點(diǎn)數(shù)據(jù)后,根據(jù)前后Q 值的變化,在計(jì)算完乘積之后,對(duì)結(jié)果進(jìn)行截?cái)嗯c舍入處理,得出最終結(jié)果。
定點(diǎn)數(shù)據(jù)的乘法偽代碼如下:
由偽代碼可知,首先將兩個(gè)輸入數(shù)據(jù)進(jìn)行相乘并將Q值相加,即結(jié)果中的小數(shù)部分位寬是輸入數(shù)據(jù)的小數(shù)位寬累加和,此時(shí)可得出結(jié)果的數(shù)據(jù)范圍,進(jìn)而確定Q值。然后將超出位寬的低位部分進(jìn)行截?cái)啵⑦M(jìn)行舍入處理。在數(shù)據(jù)截?cái)鄷r(shí)會(huì)產(chǎn)生誤差,但是由于截?cái)嗟氖菙?shù)據(jù)最低位部分,即小數(shù)部分最低位,帶來(lái)的誤差很小。
而卷積中的加法運(yùn)算原理與乘法不同。對(duì)于Q 值相同的定點(diǎn)數(shù),直接進(jìn)行運(yùn)算,結(jié)果的Q 值與加數(shù)一致。然而,當(dāng)兩個(gè)Q 值不同的定點(diǎn)數(shù)進(jìn)行運(yùn)算時(shí),需先將Q 較小的定點(diǎn)數(shù)進(jìn)行移位處理,直至兩加數(shù)Q 值一致,此時(shí)可直接執(zhí)行加法運(yùn)算。
在本設(shè)計(jì)中,原本需由浮點(diǎn)數(shù)執(zhí)行的卷積運(yùn)算轉(zhuǎn)換為量化后的定點(diǎn)數(shù)據(jù)來(lái)執(zhí)行,并將結(jié)果輸出。
從圖2可以看出,首先根據(jù)輸入數(shù)據(jù)可以得到結(jié)果的符號(hào)位。其次輸入數(shù)據(jù)均為符合IEEE-754標(biāo)準(zhǔn)的浮點(diǎn)數(shù),其中尾數(shù)部分給出了有效數(shù)字的位數(shù),因而決定了浮點(diǎn)數(shù)的表示精度。而階碼指明小數(shù)點(diǎn)在數(shù)據(jù)中的位置,整數(shù)部分位寬便可確定,同時(shí)決定了浮點(diǎn)數(shù)的數(shù)據(jù)范圍,因而確定了數(shù)據(jù)量化后最適合的Q 值,并做數(shù)據(jù)截?cái)嗪蛿?shù)據(jù)舍入處理,進(jìn)而使用Q格式完成參數(shù)的動(dòng)態(tài)低精度定點(diǎn)量化,將量化后的結(jié)果輸出。
圖2 動(dòng)態(tài)低精度量化單元原理圖
卷積網(wǎng)絡(luò)中包含大量的卷積運(yùn)算,從硬件層面講,卷積運(yùn)算分解下來(lái)即為連續(xù)的乘法和加法運(yùn)算,其中乘法運(yùn)算設(shè)計(jì)原理圖如圖3所示。
圖3 乘法單元設(shè)計(jì)原理圖
卷積層主要是由卷積核組成的,卷積核的作用主要是對(duì)神經(jīng)網(wǎng)絡(luò)中輸入的特征圖進(jìn)行特征提取,執(zhí)行對(duì)應(yīng)參數(shù)的卷積運(yùn)算[21-22]。在該部分的乘法單元設(shè)計(jì)中,將輸入的兩個(gè)參數(shù)送入乘法器中,首先可以根據(jù)輸入數(shù)據(jù)得到乘法運(yùn)算的結(jié)果,并確定符號(hào)位,然后根據(jù)兩個(gè)輸入數(shù)據(jù)的Q值及最小誤差量化算法的思想,確定結(jié)果的Q 格式表示,對(duì)結(jié)果進(jìn)行截?cái)嗖僮骱蜕崛胩幚恚c量化原理一致,得到最終的結(jié)果并輸出。另外,針對(duì)卷積運(yùn)算原理,提出并設(shè)計(jì)了矩陣運(yùn)算單元,使數(shù)據(jù)并行執(zhí)行乘法運(yùn)算,可提升整體性能。
一般而言,針對(duì)神經(jīng)網(wǎng)絡(luò)的卷積運(yùn)算加速的硬件設(shè)計(jì),重點(diǎn)要考慮運(yùn)算單元的并行性,如Alexnet 網(wǎng)絡(luò)模型,共包括8 層,其中有5 層為卷積層。然而,對(duì)于在嵌入式設(shè)備來(lái)講,完全實(shí)現(xiàn)卷積核之間與不同層神經(jīng)網(wǎng)絡(luò)的并行執(zhí)行幾乎是不可能的,本文主要針對(duì)卷積核內(nèi)的并行化執(zhí)行完成設(shè)計(jì)。圖4為矩陣卷積運(yùn)算設(shè)計(jì)架構(gòu),針對(duì)目前最常用的3×3 的卷積核設(shè)計(jì)了并行卷積運(yùn)算架構(gòu),輸入層是大小為13×13的神經(jīng)元矩陣。經(jīng)過(guò)量化后的結(jié)果按照一定順序存入存儲(chǔ)矩陣中,存儲(chǔ)單元中高位為量化后的定點(diǎn)數(shù),低位為對(duì)應(yīng)的Q 值,之后從存儲(chǔ)中取出對(duì)應(yīng)的數(shù)據(jù)送至卷積運(yùn)算單元的輸入端,經(jīng)邊界填充最后可得到169個(gè)神經(jīng)元輸出。
圖4 矩陣卷積運(yùn)算單元設(shè)計(jì)架構(gòu)
本設(shè)計(jì)可在單周期內(nèi)從對(duì)應(yīng)存儲(chǔ)中取出量化后的數(shù)據(jù)送入卷積運(yùn)算單元中,并行執(zhí)行9 次乘法操作,隨后將結(jié)果送入加法器,完成累加得到卷積結(jié)果。矩陣并行卷積運(yùn)算單元共包含了9個(gè)乘法單元,使用空間換取時(shí)間的思想,在不增加核心邏輯資源的前提下,適當(dāng)?shù)貙⒎謺r(shí)復(fù)用的電路進(jìn)行復(fù)制,在保證控制面積的前提下更好地提升性能。本設(shè)計(jì)需耗時(shí)169 個(gè)時(shí)鐘周期完成卷積運(yùn)算,有效地提升了運(yùn)算的效率。
圖5 量化卷積單元架構(gòu)
量化卷積單元整體架構(gòu)主要包括量化單元、存儲(chǔ)模塊以及可循環(huán)調(diào)用的并行卷積運(yùn)算單元,量化卷積單元整體架構(gòu)如圖5。
首先將網(wǎng)絡(luò)模型中的參數(shù)如神經(jīng)元的輸入、權(quán)重等進(jìn)行動(dòng)態(tài)低精度定點(diǎn)量化,即對(duì)數(shù)據(jù)進(jìn)行預(yù)處理操作,然后分別存入對(duì)應(yīng)的存儲(chǔ)單元中。在執(zhí)行卷積運(yùn)算時(shí),將數(shù)據(jù)分別從存儲(chǔ)中取出,送入卷積運(yùn)算單元,運(yùn)算完成后將結(jié)果輸出至存儲(chǔ)并進(jìn)行截?cái)嗪蜕崛胩幚恚h(huán)調(diào)用卷積運(yùn)算單元進(jìn)行計(jì)算。
本設(shè)計(jì)使用0.11 μm SMIC 工藝庫(kù)進(jìn)行綜合,綜合后的參數(shù)如表2所示。
表2 量化卷積單元參數(shù)表
本設(shè)計(jì)實(shí)現(xiàn)的功能為量化及卷積運(yùn)算,綜合后的量化與卷積單元面積為13 740門(mén),功耗大小為0.992 5 mW。在本設(shè)計(jì)中針對(duì)運(yùn)算加速做了相關(guān)的并行卷積運(yùn)算單元設(shè)計(jì),因此可有效提升卷積運(yùn)算的性能,并且后期經(jīng)過(guò)驗(yàn)證,本設(shè)計(jì)滿足每個(gè)關(guān)鍵路徑的時(shí)序要求。該性能參數(shù)表進(jìn)一步證明本設(shè)計(jì)適合使用在對(duì)實(shí)時(shí)性有要求的嵌入式設(shè)備中。
本設(shè)計(jì)在FPGA 平臺(tái)Stratix IV GX EP4SGX230進(jìn)行驗(yàn)證,并完成了結(jié)果準(zhǔn)確性對(duì)比。首先對(duì)原始的浮點(diǎn)數(shù)據(jù)不做量化處理,直接進(jìn)行卷積運(yùn)算,可得到當(dāng)前結(jié)果的準(zhǔn)確性。之后將原始的浮點(diǎn)數(shù)據(jù)分別進(jìn)行16 bit、8 bit 的固定精度量化,在16 bit 情況下量化為Q14 格式的數(shù)據(jù),8 bit情況下對(duì)權(quán)重和偏置量化為Q6格式數(shù)據(jù),將輸入輸出量化為Q8格式數(shù)據(jù),得出對(duì)應(yīng)結(jié)果。最后驗(yàn)證本設(shè)計(jì)中動(dòng)態(tài)多精度(Dynamic Multi-Precision,DMP)量化后卷積運(yùn)算的結(jié)果準(zhǔn)確性。結(jié)果準(zhǔn)確性對(duì)比如表3。
表3 結(jié)果準(zhǔn)確性對(duì)比
結(jié)果表明,直接使用浮點(diǎn)數(shù)據(jù)進(jìn)行卷積運(yùn)算的數(shù)據(jù)準(zhǔn)確性最高,然而分別對(duì)數(shù)據(jù)進(jìn)行16 bit和8 bit量化時(shí)發(fā)現(xiàn),量化后的數(shù)據(jù)位寬越大,準(zhǔn)確性越高。本設(shè)計(jì)中,對(duì)數(shù)據(jù)進(jìn)行16 bit 多精度量化時(shí),結(jié)果表明數(shù)據(jù)的準(zhǔn)確性達(dá)到了97.96%,由于有個(gè)別數(shù)據(jù)精度特別低,量化過(guò)程中的數(shù)據(jù)截?cái)鄷?huì)帶來(lái)一定的誤差,處于合理范圍內(nèi),不影響網(wǎng)絡(luò)推理的正常功能。
本文還分別與使用RISC-V處理器(E203)[23]、Cortex M4與Matlab模擬執(zhí)行卷積運(yùn)算的時(shí)間進(jìn)行對(duì)比。性能測(cè)試對(duì)比如表4。
表4 性能測(cè)試對(duì)比
在神經(jīng)網(wǎng)絡(luò)模型中,卷積層包含的運(yùn)算占了總體的90%以上。針對(duì)神經(jīng)網(wǎng)絡(luò)Alexnet 模型進(jìn)行性能驗(yàn)證,輸入神經(jīng)元數(shù)量為169 個(gè),即輸入數(shù)據(jù)的矩陣大小為13×13,卷積核大小為3×3,跨度為1,在不同平臺(tái)模擬卷積運(yùn)算。本設(shè)計(jì)中測(cè)試激勵(lì)模擬了169 組隨機(jī)數(shù)據(jù)進(jìn)行驗(yàn)證。結(jié)果表明,編寫(xiě)C++代碼軟件模擬實(shí)現(xiàn)卷積運(yùn)算,在CortexM4 開(kāi)發(fā)板進(jìn)行測(cè)試,參與運(yùn)算的為浮點(diǎn)數(shù)。在100 MHz 時(shí)鐘頻率下測(cè)得執(zhí)行時(shí)間為4.10 ms。由于RISC-V 處理器(E203)不支持浮點(diǎn)數(shù)據(jù),模擬相同數(shù)量的INT32數(shù)據(jù),經(jīng)驗(yàn)證得出在100 MHz時(shí)鐘下執(zhí)行卷積運(yùn)算時(shí)間為3.03 ms。在Matlab上調(diào)用卷積函數(shù)的方法,模擬相同數(shù)量的浮點(diǎn)數(shù)據(jù)執(zhí)行卷積運(yùn)算,測(cè)得執(zhí)行時(shí)間為230 ms,本設(shè)計(jì)中模擬給出同等數(shù)量的浮點(diǎn)數(shù)據(jù)量化后的INT16數(shù)據(jù),在100 MHz時(shí)鐘下執(zhí)行時(shí)間約為0.001 71 ms。經(jīng)對(duì)比證明了該設(shè)計(jì)可有效提升卷積運(yùn)算性能。
本文面向嵌入式平臺(tái)提出一種卷積神經(jīng)網(wǎng)絡(luò)硬件加速器的設(shè)計(jì)與實(shí)現(xiàn)方法,采用卷積加速模塊化和量化精度可配置的思想,針對(duì)神經(jīng)網(wǎng)絡(luò)推理加速設(shè)計(jì)了低精度動(dòng)態(tài)量化單元與矩陣卷積運(yùn)算架構(gòu),主要針對(duì)網(wǎng)絡(luò)模型的卷積運(yùn)算做加速。該設(shè)計(jì)使用16 位定點(diǎn)數(shù)據(jù)表示,內(nèi)存占用量和帶寬需求減半,數(shù)據(jù)精確度達(dá)到97.96%,對(duì)卷積網(wǎng)絡(luò)的正常功能影響較小,與二進(jìn)制設(shè)計(jì)相比,它具有更高的精度,性能相比軟件實(shí)現(xiàn)有大幅提升,相比CortexM4 執(zhí)行卷積運(yùn)算提升了90%以上,可有效加快卷積運(yùn)算執(zhí)行速度,適用于提高神經(jīng)網(wǎng)絡(luò)在嵌入式平臺(tái)的性能,為嵌入式卷積網(wǎng)絡(luò)推理加速提供了方法。后續(xù)工作中還需繼續(xù)深入研究,更好地實(shí)現(xiàn)卷積核間及層間的并行性,同時(shí)為移植到RISC-V 處理器中并完成指令集融合的協(xié)處理器做準(zhǔn)備。