何家俊,蘇成悅,羅榮芳,施振華,陳堆鈺,羅俊豐
(廣東工業(yè)大學(xué) 物理與光電工程學(xué)院,廣州 510006)
卷積神經(jīng)網(wǎng)絡(luò)(CNN)在圖像處理分類(lèi)、目標(biāo)檢測(cè)等卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用上有了較大的突破[1]。隨著多種深層次卷積神經(jīng)網(wǎng)絡(luò)的提出[2],卷積神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu)深度和網(wǎng)絡(luò)層中參數(shù)量以及計(jì)算量也隨之不斷提高。將CNN在有限資源的嵌入式設(shè)備中計(jì)算資源高效得部署成為非常有意義的研究。
許多研究人員在優(yōu)化神經(jīng)網(wǎng)絡(luò)中計(jì)算性能[3],提高外部?jī)?nèi)存訪問(wèn)效率方面提出了很多CNN硬件加速的方案,在實(shí)現(xiàn)方面只是考慮到小型網(wǎng)絡(luò)的加速實(shí)現(xiàn),對(duì)于大型網(wǎng)絡(luò)的實(shí)現(xiàn)都缺乏有效的方案[4-6]。且多數(shù)網(wǎng)絡(luò)加速只針對(duì)于卷積運(yùn)算優(yōu)化,少數(shù)網(wǎng)絡(luò)在加速網(wǎng)絡(luò)時(shí)針對(duì)網(wǎng)絡(luò)全連接的優(yōu)化[7],全連接的優(yōu)化對(duì)于網(wǎng)絡(luò)的參數(shù)影響[8]也占據(jù)著主要的位置。在推理方面提出了很多量化方案[9],采用的量化方案多數(shù)為定點(diǎn)數(shù)量化,在數(shù)據(jù)跨度比較大的情況下,采集的數(shù)據(jù)量不足導(dǎo)致?lián)p失率增加,降低算法識(shí)別率[10]。常用的動(dòng)態(tài)量化推理INT8是通過(guò)人工設(shè)置值域范圍,不能有效地確定推理量化范圍[11]。取值范圍過(guò)大,會(huì)過(guò)度采集量化數(shù)據(jù),不能有效地抵抗異常參數(shù)數(shù)據(jù)導(dǎo)致量化結(jié)果與原函數(shù)偏差過(guò)大。取值范圍過(guò)小,會(huì)導(dǎo)致數(shù)據(jù)采集不完整,也不能有效地量化擬合原始數(shù)據(jù)。
提出了一種結(jié)合DBSCAN密度聚類(lèi)算法[12]的INT8動(dòng)態(tài)量化推理算法,根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)特性實(shí)現(xiàn)網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化,設(shè)計(jì)一個(gè)基于多個(gè)CNN計(jì)算核心的硬件架構(gòu),優(yōu)化加速器的內(nèi)存訪問(wèn)速率、資源使用以及卷積神經(jīng)網(wǎng)絡(luò)計(jì)算效果,并以LetNet-5,VGG-16以及Resnet-50算法為例部署至FPGA平臺(tái)進(jìn)行驗(yàn)證。
CNN是由許多運(yùn)算模塊層組成,有卷積運(yùn)算的功能模塊層,激活數(shù)值功能模塊層,最大值池化數(shù)值功能模塊層和數(shù)據(jù)全連接運(yùn)算功能模塊層。CNN會(huì)由輸入圖像數(shù)據(jù)到第一層功能模塊層開(kāi)始,通過(guò)運(yùn)算獲得新的多通道圖像特征數(shù)據(jù)并依次進(jìn)行下一層功能模塊層的操作,每層的卷積層可以用下式表達(dá):
(1)
其中:j表示輸入特征值,i表示輸出特征值,nin和nout分別表示輸入和輸出的數(shù)量,gi,j應(yīng)用于第j輸入特征值和第i輸出特征值的卷積核。激活層是選取特征值中大于零的數(shù)值,每層的激活計(jì)算層可以用下式表達(dá):
(2)
最大值池化層是選取一個(gè)區(qū)域內(nèi)最大的值作為輸出特征值可以表示為:
(3)
其中:p是池化層內(nèi)核的大小。這種非線性向下采樣不僅減少了特征數(shù)的數(shù)量大小和后續(xù)計(jì)算功能模塊的計(jì)算量,而且還可以提供一種形式的平移不變性,在不改變數(shù)據(jù)特性的情況下減少數(shù)據(jù)量。全連接層可以表示為:
fout=Wfin+b
(4)
其中:W是輸入輸出變化矩陣,b是偏移參數(shù)。在卷積運(yùn)算后通常會(huì)使用激活運(yùn)算層模塊和池化運(yùn)算模塊層去除多余參數(shù)降低參數(shù)量。經(jīng)過(guò)一次或多次的卷積激活、池化操作,數(shù)據(jù)以及降低并提取到一定的程度,接下來(lái)會(huì)使用全連接模塊功能層使得數(shù)據(jù)相互通過(guò)權(quán)重參數(shù)和偏移參數(shù)算得結(jié)果并將其求和。
上述算法可以看出,卷積神經(jīng)網(wǎng)絡(luò)需要大量的乘法和加法運(yùn)算。通過(guò)電路的形式并考慮FPGA可并行可串行的特性設(shè)計(jì)出算法需要做出相對(duì)應(yīng)的分析,其中卷積運(yùn)算需要考慮卷積核心的移動(dòng)方法,以及不同深度神經(jīng)網(wǎng)絡(luò)算法中有不同的卷積層數(shù)、不同的卷積核數(shù)、輸入通道數(shù)和輸出通道數(shù)。需要設(shè)計(jì)出合理的數(shù)據(jù)緩存區(qū)提前將數(shù)據(jù)保存起來(lái)再進(jìn)行卷積操作。在池化層和激活層不需要用到乘法器和加法器,但是用到比較器,且比較的范圍不只是在同一行。
文中選用的3個(gè)網(wǎng)絡(luò)分別LetNet-5網(wǎng)絡(luò)兩個(gè)卷積網(wǎng)絡(luò)以及兩個(gè)全連接網(wǎng)絡(luò)的,略深層網(wǎng)絡(luò)的13層卷積網(wǎng)絡(luò)和3層全連接網(wǎng)絡(luò)的VGG-16,以及包含49層全連接網(wǎng)絡(luò)和1層全連接網(wǎng)絡(luò)的Resnet-50。
由圖1可以看出LeNet-5無(wú)論是參數(shù)量還是計(jì)算量都是最少的,而其余兩個(gè)網(wǎng)絡(luò),VGG-16和Resnet-50的MACC卷積計(jì)算量以及全連接計(jì)算量和網(wǎng)絡(luò)的卷積參數(shù)和全連接參數(shù)量都不小。圖1和圖2分別對(duì)網(wǎng)絡(luò)中主要算子的參數(shù)分布和網(wǎng)絡(luò)中主要的計(jì)算量分布進(jìn)行了統(tǒng)計(jì)。
圖1 各網(wǎng)絡(luò)的參數(shù)總量(M)
圖2 各網(wǎng)絡(luò)參數(shù)的MACC計(jì)算總量(GFLOPs)
從圖1可以看出VGG-16卷積算子權(quán)重參數(shù)少于Resnet-50的權(quán)重參數(shù) ,而在全連接計(jì)算算子參數(shù)的總量中,VGG-16的算子參數(shù)遠(yuǎn)遠(yuǎn)多于Resnet-50的全部算子參數(shù)的總和,而且LeNet-5和VGG-16網(wǎng)絡(luò)中全連接參數(shù)總量分別是卷積參數(shù)總量的12.5倍和8倍。
從圖2可以看出每個(gè)神經(jīng)網(wǎng)絡(luò)的計(jì)算量都集中在卷積算子層,LeNet-5、VGG-16、Resnet-50中卷積計(jì)算分別為全連接計(jì)算的4.77倍,1.25倍和1 935倍,所有在卷積層中計(jì)算優(yōu)化對(duì)整個(gè)CNN加速系統(tǒng)的影響占比更大。要做到優(yōu)化好CNN加速系統(tǒng)模塊,需要結(jié)合優(yōu)化VGG-16這種需要優(yōu)化大量全連接計(jì)算和ResNet-50這種需要大量卷積計(jì)算的特性,將全連接層可以看作是一個(gè)特殊的點(diǎn)乘運(yùn)算,根據(jù)不同神經(jīng)網(wǎng)絡(luò)的特性設(shè)計(jì)一個(gè)專用的神經(jīng)網(wǎng)絡(luò)加速器尤為重要。
目前大部分CNN的研究部署和訓(xùn)練都選擇了GPU平臺(tái),平臺(tái)對(duì)FP32浮點(diǎn)型數(shù)據(jù)計(jì)算提供了很好的并行運(yùn)算開(kāi)發(fā)生態(tài)有利于做大數(shù)據(jù)的圖像識(shí)別訓(xùn)練,但是GPU其高功耗的特性導(dǎo)致其不能成為便攜式移動(dòng)設(shè)備的最優(yōu)選擇平臺(tái)。FPGA同時(shí)擁有并行運(yùn)算能力以及低功耗特性,并且具有靈活的結(jié)構(gòu)為移動(dòng)設(shè)備部署CNN提供了有效的解決方案[13]。CNN前推過(guò)程如圖3表示。
圖3 卷積神經(jīng)網(wǎng)絡(luò)前推過(guò)程
卷積神經(jīng)網(wǎng)絡(luò)需要大量的乘法和加法運(yùn)算。通過(guò)電路的形式并融合FPGA擁有并行和串行的特性設(shè)計(jì)出算法需要做出相對(duì)應(yīng)的分析,卷積運(yùn)算需要考慮卷積核心的移動(dòng)方法,以及考慮到不同的深度神經(jīng)網(wǎng)絡(luò)算法不同的卷積層數(shù)中有不同的卷積核數(shù)、輸入通道數(shù)和輸出通道數(shù)。需要設(shè)計(jì)出合理的數(shù)據(jù)緩存區(qū)需要提前將數(shù)據(jù)保存起來(lái)再進(jìn)行卷積操作。池化層和激活層由比較器組成為主,且比較的范圍不只是在同一行,如2×2的池化核需要第一行的圖像數(shù)據(jù)與第二行的圖像數(shù)據(jù)作對(duì)比,在電路設(shè)計(jì)上需要設(shè)計(jì)好緩沖區(qū),保存第一行數(shù)據(jù)并且通過(guò)第二行數(shù)據(jù)輸入后作對(duì)比。全連接層則只需要在其他計(jì)算完成后得到的數(shù)據(jù)輸出的時(shí)候乘上權(quán)重和加上偏移值。訓(xùn)練過(guò)程如圖4表示。
圖4 深度網(wǎng)絡(luò)訓(xùn)練流程圖
深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練需要構(gòu)建訓(xùn)練網(wǎng)絡(luò),預(yù)設(shè)訓(xùn)練次數(shù)(EPOCH),打亂數(shù)據(jù)集,劃分訓(xùn)練集和驗(yàn)證集。接下來(lái)設(shè)置每次訓(xùn)練所抓取的數(shù)據(jù)樣本數(shù)量(BATCH SIZE)和學(xué)習(xí)率(LR),這兩個(gè)參數(shù)影響深度學(xué)習(xí)的速度和識(shí)別率。獲取訓(xùn)練集中圖像數(shù)據(jù),并使用歸一化處理。將數(shù)據(jù)傳入到構(gòu)建好的訓(xùn)練網(wǎng)絡(luò),獲得識(shí)別結(jié)果。將結(jié)果通過(guò)與標(biāo)識(shí)好的結(jié)果做一個(gè)損失函數(shù)計(jì)算,再更新網(wǎng)絡(luò)中的參數(shù)。重復(fù)第三步當(dāng)經(jīng)過(guò)EPOCH次訓(xùn)練后得到訓(xùn)練參數(shù)和識(shí)別率。
基于深度卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練數(shù)據(jù)量龐大而且只需要訓(xùn)練一次的原因,使用可以高速且具有豐富深度學(xué)習(xí)開(kāi)發(fā)方案的GPU平臺(tái)成為首選。訓(xùn)練不需要考慮功耗問(wèn)題,通過(guò)GPU訓(xùn)練出來(lái)的模型參數(shù)做處理后,部署到基于FPGA平臺(tái)的CNN加速器當(dāng)中。
CNN加速研究中,常用的方法是通過(guò)壓縮神經(jīng)網(wǎng)絡(luò)模型的方法達(dá)到縮小模型中數(shù)據(jù)體積大小和降低硬件的資源使用的效果,使得算法運(yùn)算速率增加以及運(yùn)行算法設(shè)備的功耗減少[14]。
通過(guò)將數(shù)據(jù)運(yùn)算位數(shù)刪減降低數(shù)據(jù)精度,有效地提高運(yùn)算速度和降低功耗。使用在大規(guī)模的圖像分類(lèi)中,最為先進(jìn)的CNN模型具有較深的網(wǎng)絡(luò)層數(shù)和大量的神經(jīng)網(wǎng)絡(luò)權(quán)重參數(shù)和偏移參數(shù)。大量參數(shù)只能存儲(chǔ)在外部存儲(chǔ)器當(dāng)中,運(yùn)行算法時(shí)需要從外部參數(shù)讀取并使用計(jì)算,加速性能需要和存儲(chǔ)器讀寫(xiě)的速度做匹配,在加速性能遠(yuǎn)大于儲(chǔ)存器讀寫(xiě)速率的情況下,存儲(chǔ)器的讀寫(xiě)帶寬也就是儲(chǔ)存器每次讀寫(xiě)數(shù)據(jù)量的大小以及讀寫(xiě)速率成為了CNN加速的性能瓶頸[15]。
在FP32類(lèi)型的數(shù)據(jù)下深度神經(jīng)網(wǎng)絡(luò)的參數(shù)都會(huì)集中在一個(gè)值域區(qū)間[16],使得FP32大部分的數(shù)據(jù)段都是處于空閑狀態(tài),這時(shí)可以通過(guò)有效截取數(shù)據(jù)段來(lái)使得參數(shù)數(shù)據(jù)壓縮,那么就可以得到一個(gè)量化的參數(shù)模型,如圖5是LeNet-5訓(xùn)練后的參數(shù)分布數(shù)據(jù)圖。
圖5 LeNet-5參數(shù)數(shù)據(jù)分布
從圖5(a)和圖5(b)可以得到神經(jīng)網(wǎng)絡(luò)的權(quán)重參數(shù)主要分布和偏移量參數(shù)主要分布在一定范圍,我們可以合理地設(shè)置區(qū)間為這個(gè)綜合范圍的最大值和最小值映射到INT8類(lèi)型數(shù)據(jù)的最大值和最小值,其中相差間隔很小的數(shù)據(jù)會(huì)合并映射到一個(gè)數(shù)值。
在FP32轉(zhuǎn)向INT8的過(guò)程中需要去除小數(shù)點(diǎn)后的數(shù),需要在映射到8位數(shù)據(jù)后進(jìn)行舍入的操作。當(dāng)存在少量遠(yuǎn)大于或小于大量數(shù)值參數(shù)的異常參數(shù),則異常參數(shù)會(huì)影響整個(gè)量化過(guò)程,大量的正常參數(shù)才是在圖像識(shí)別運(yùn)算中起著重要的權(quán)重作用,合并到同一數(shù)值當(dāng)中,減少了兩個(gè)區(qū)域甚至多個(gè)區(qū)域中數(shù)據(jù)的可比性。合理選擇量化的值域顯得尤其重要。
2.1.1 量化FP32至INT8實(shí)現(xiàn)的計(jì)算公式
從輸入圖像數(shù)據(jù)轉(zhuǎn)換成量化圖像數(shù)據(jù)公式如下:
(5)
其中:Xf為輸入圖片特征數(shù),Xq為Xf量化后的圖片特征數(shù),Sx為圖片特征數(shù)量化放縮因子,Zx為圖片特征數(shù)量化偏移值。量化放縮因子是通過(guò)輸入數(shù)據(jù)的值域范圍和需要量化的范圍做一個(gè)比例計(jì)算,公式如下:
(6)
式(5)Zx是通過(guò)放縮因子,量化結(jié)果以及原數(shù)據(jù)做一個(gè)偏移計(jì)算獲取,公式如下:
(7)
同理權(quán)重的參數(shù)量化如同輸入圖像特征數(shù)的量化,給出的3個(gè)公式如下所示:
(8)
(9)
(10)
其中:Wf為輸入權(quán)重參數(shù),Wq為Wf量化后的權(quán)重參數(shù),Sw為權(quán)重參數(shù)量化放縮因子,Zw為權(quán)重參數(shù)量量化偏移值。量化計(jì)算使用在深度網(wǎng)絡(luò)訓(xùn)練后得到參數(shù)進(jìn)行量化推理調(diào)整。
2.1.2 量化中舍入公式:
量化中的舍入公式使用了隨機(jī)離散舍入函數(shù)方法[17],我們可以定義為:
(11)
在CNN量化中,使用四舍五入的round方法會(huì)產(chǎn)生一定的誤差,在大量的卷積運(yùn)算會(huì)使得這種誤差放大,導(dǎo)致圖像識(shí)別的準(zhǔn)確率降低。隨機(jī)離散舍入函數(shù)方法中,采用隨機(jī)因子,使得函數(shù)期望為x。有助于在量化過(guò)程中舍入后減少誤差,減少算法損失率。
2.1.3 DBSCAN聚類(lèi)算法
DBSCAN是基于密度的分類(lèi)算法。算法通過(guò)設(shè)置中心點(diǎn)直徑范圍,和中心直徑范圍內(nèi)數(shù)據(jù)量遍歷出數(shù)據(jù)中心點(diǎn)的位置。將與中心相連的點(diǎn)位數(shù)據(jù)收集到同一數(shù)據(jù)集中,生成多個(gè)數(shù)據(jù)集。通過(guò)刪除含有數(shù)據(jù)少的中心數(shù)據(jù)團(tuán),獲取存在大量數(shù)據(jù)的中心數(shù)據(jù)團(tuán),從而確定量化參數(shù)大致分布區(qū)域,截取數(shù)據(jù)的值域區(qū)間,提高量化后與量化前的相似度。如圖6是LeNet-5的兩個(gè)卷積層量化前后對(duì)比圖。
圖6 卷積參數(shù)DBSCAN聚類(lèi)算法處理數(shù)據(jù)圖
從圖6(a)以及圖6(c)可以看出在訓(xùn)練后的卷積參數(shù)會(huì)出現(xiàn)異常數(shù)據(jù)。異常數(shù)據(jù)會(huì)導(dǎo)致在設(shè)置INT8推理的閾值過(guò)大,大部分的參數(shù)分布在0.1與0.2之間,如圖4(a)出現(xiàn)了最大值9,若設(shè)置9為量化最大值則會(huì)出現(xiàn)0.2到9之間存在大部分不占據(jù)參數(shù)的空間稀釋原本參數(shù)分布區(qū)域的精度參數(shù)從而導(dǎo)致量化后結(jié)果與原函數(shù)的相似度降低。
從圖6(b)以及圖6(d)可以看出經(jīng)過(guò)DBSCAN聚類(lèi)算法處理后相對(duì)于處理前的數(shù)據(jù)減少了很多異常數(shù)據(jù),顯示聚集密度大得數(shù)據(jù)集,可以直接截取數(shù)據(jù)集的最大值和最小值通過(guò)公式(6)計(jì)算出量化放縮因子,極大地去除異常數(shù)據(jù),可以通過(guò)算法處理使得數(shù)據(jù)參數(shù)有效得并量化貼合,可以明顯有效得去除了數(shù)據(jù)毛刺,有助于數(shù)據(jù)量化。
LeNet-5和VGG-16等深度神經(jīng)網(wǎng)絡(luò)中會(huì)存在多個(gè)全連接,全連接可以看作是兩個(gè)矩陣的相乘,將第一層全連接的權(quán)重參數(shù)等價(jià)于W,第一層偏移量等價(jià)于B得到公式如下:
(12)
第一層全連接層的結(jié)果等價(jià)于H可以得到:
H=[h1h2…h(huán)m]T=W*X+B
(13)
其中:n為全連接輸入數(shù),m為輸出通道數(shù),h為全連接結(jié)果,x為輸入特征值,w為權(quán)重參數(shù),b為偏移參數(shù)。同理可將第二層全連接的權(quán)重參數(shù)等價(jià)于U,第二層全連接的偏移參數(shù)等價(jià)于D:
(14)
得到第二層全連接最后結(jié)果FC,公式如下:
FC=[fc1fc2…fck]T=U*H+D
(15)
其中:k為輸出通道數(shù),fc為全連接結(jié)果。若用式(13)的全連接帶入到式(15)中的H中,可以將(13)、(15)兩式融合成一式:
FC=U*(W*X+B)+D
(16)
將(16)中括號(hào)拆開(kāi),使第二層全連接權(quán)重參數(shù)與第一層全連接權(quán)重參數(shù)結(jié)合成為總的全連接權(quán)重參數(shù),使第二層全連接參數(shù)結(jié)合第一層全連接偏移參數(shù)再加上第二層全連接偏移參數(shù)得到總的全連接的偏移參數(shù),新成立的全連接權(quán)重矩陣和偏移矩陣分別是:
Wn=U*W
(17)
Bn=U*B+D
(18)
融合后全連接可以簡(jiǎn)單描述為:
F=Wn*X+Bn
(19)
選用LeNet-5和VGG-16全連接融合效果對(duì)比如表1所示。
表1 全連接層融合對(duì)比效果
可以看出LeNet-5 和 VGG-16在全連接融合后MACC計(jì)算總量的壓縮率分別為52.9%和3.3%,全連接參數(shù)總量的壓縮率分別為52.6%和3.3%。
擁有少量全連接參數(shù)和計(jì)算量的LeNet-5網(wǎng)絡(luò)擁有很好的壓縮效果。針對(duì)VGG-16全連接計(jì)算量占據(jù)大量參數(shù)和計(jì)算的特性,VGG-16在向前推算的參數(shù)量和計(jì)算量在全連接層融合壓縮起到了明顯的效果。
使用GPU平臺(tái)進(jìn)行Fashion MNIST(FM)和CIFAR-10(CR)的數(shù)據(jù)集的訓(xùn)練并獲取各網(wǎng)絡(luò)模型參數(shù),將參數(shù)進(jìn)行量化數(shù)據(jù)分析和融合全連接參數(shù)等操作得到最后使用到FPGA平臺(tái)上CNN加速系統(tǒng)中。
基于以上量化理論,CNN加速系統(tǒng)需要考慮CNN網(wǎng)絡(luò)在卷積運(yùn)算的運(yùn)算速率。CNN卷積網(wǎng)絡(luò)數(shù)據(jù)在并行運(yùn)算中表現(xiàn)較好,在設(shè)計(jì)加速電路中需要運(yùn)用并行的電路設(shè)計(jì)。
通過(guò)對(duì)網(wǎng)絡(luò)的分析,系統(tǒng)同時(shí)需要多個(gè)模塊組合并按順序執(zhí)行計(jì)算。運(yùn)用多個(gè)計(jì)算核心的方法組合加速系統(tǒng),通過(guò)控制系統(tǒng)控制執(zhí)行順序可以靈活地調(diào)用硬件資源完成CNN深度加速。FPGA設(shè)計(jì)的CNN推理加速器模塊設(shè)計(jì)如圖7所示。
圖7 深度神經(jīng)網(wǎng)絡(luò)推理加速器
加速器主要包含了片上系統(tǒng)控制中心模塊、內(nèi)存緩存模塊、深度神經(jīng)網(wǎng)絡(luò)計(jì)算單元核心模塊、單元核心控制仲裁模塊和輸入輸出模塊。使用C++代碼實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),通過(guò)系統(tǒng)控制中心模塊調(diào)度內(nèi)存緩存模塊,將權(quán)重?cái)?shù)據(jù)和偏移數(shù)據(jù)與圖像數(shù)據(jù)以及神經(jīng)網(wǎng)絡(luò)單元核心的參數(shù)通過(guò)DMA傳輸進(jìn)入深度神經(jīng)網(wǎng)絡(luò)計(jì)算模塊中進(jìn)行前推計(jì)算,最后輸出數(shù)據(jù)返回到系統(tǒng)控制中心,完成整個(gè)深度神經(jīng)網(wǎng)絡(luò)加速過(guò)程。
片上內(nèi)存主要保存了當(dāng)前神經(jīng)網(wǎng)絡(luò)的權(quán)重?cái)?shù)據(jù)和偏移數(shù)據(jù),數(shù)據(jù)傳入神經(jīng)網(wǎng)絡(luò)模塊傳輸設(shè)計(jì)如圖8所示。
圖8 神經(jīng)網(wǎng)絡(luò)模塊傳輸圖
考慮到卷積操作多數(shù)是以3×3的卷積核結(jié)構(gòu)對(duì)特征圖進(jìn)行滑動(dòng)操作,固神經(jīng)網(wǎng)絡(luò)模塊數(shù)據(jù)首先讀取數(shù)據(jù)的前三行,新的數(shù)據(jù)行替換舊的數(shù)據(jù)行。第一次卷積需要等待三次數(shù)據(jù)的讀取,后續(xù)數(shù)據(jù)可以直接替換舊數(shù)據(jù)進(jìn)行卷積,當(dāng)此次卷積實(shí)現(xiàn)了輸入特征數(shù)據(jù)面積數(shù)且沒(méi)有新的數(shù)據(jù)輸入時(shí)完成卷積并輸出空閑狀態(tài)。
上述電路實(shí)現(xiàn)卷積的運(yùn)算讀取內(nèi)存中數(shù)據(jù)[18],每次時(shí)鐘只需要讀取一個(gè)數(shù)據(jù)量即可,并使用了流水線設(shè)計(jì)實(shí)現(xiàn)了加法樹(shù)和乘法的功能優(yōu)化了內(nèi)存讀寫(xiě)效率和在很短的等待時(shí)間內(nèi)執(zhí)行多條運(yùn)行命令,提高了卷積計(jì)算的速度。
計(jì)算單元核心模塊是加速器的主要模塊,其中有量化模塊(Quantization)、控制模塊(CORE CONTORL)、深度神經(jīng)網(wǎng)絡(luò)算子等計(jì)算模塊,其結(jié)構(gòu)如圖9所示。
圖9 神經(jīng)網(wǎng)絡(luò)計(jì)算單元核心模塊
量化模塊(Quantization)中隨機(jī)數(shù)使用的是LFSR隨機(jī)數(shù)產(chǎn)生電路生成隨機(jī)因子作用于離散舍入計(jì)算得到量化放縮因子。模塊輸入數(shù)據(jù)后經(jīng)過(guò)量化處理,將FP32數(shù)據(jù)乘以量化放縮因子并加上量化偏移值,得到最后的INT8數(shù)據(jù),在卷積和全連接的計(jì)算中使用INT8計(jì)算,不需要使用浮點(diǎn)型的運(yùn)算電路,減少加速系統(tǒng)對(duì)DSP使用的同時(shí)減少運(yùn)算數(shù)據(jù)的位數(shù)達(dá)到電路系統(tǒng)在運(yùn)行時(shí)降低功耗降低計(jì)算量。
控制模塊(CORE CONTORL)通過(guò)代碼控制圖像數(shù)據(jù)輸入到指定算子開(kāi)始執(zhí)行運(yùn)算,并通過(guò)指定算子運(yùn)行結(jié)束后輸出結(jié)果,比如只需要數(shù)據(jù)從卷積計(jì)算到全連接,則控制使能卷積并輸入數(shù)據(jù),控制選擇器將全連接的數(shù)據(jù)和計(jì)算完成標(biāo)志輸出結(jié)果(Result)。深度神經(jīng)網(wǎng)絡(luò)算子模塊中的算子由卷積到全連接串聯(lián)而成的計(jì)算模塊,順序是由卷積到全連接的計(jì)算順序,因?yàn)槊總€(gè)模塊之間都是通過(guò)先入先出隊(duì)列模塊FIFO(First Input First Output)做中間層銜接,每個(gè)模塊之間的輸入數(shù)據(jù)和輸出數(shù)據(jù)都是規(guī)定為一個(gè)有利于每個(gè)模塊間交叉銜接。
深度神經(jīng)網(wǎng)絡(luò)算子模塊中的算子由卷積到全連接串聯(lián)而成的計(jì)算模塊,順序是由卷積到全連接的計(jì)算順序,因?yàn)槊總€(gè)模塊之間都是通過(guò)先入先出隊(duì)列模塊FIFO(First Input First Output)做中間層銜接,每個(gè)模塊之間的輸入數(shù)據(jù)和輸出數(shù)據(jù)都是規(guī)定為一個(gè)有利于每個(gè)模塊間交叉銜接。卷積計(jì)算模塊如圖10表示。
圖10 卷積模塊設(shè)計(jì)
卷積計(jì)算模塊的設(shè)計(jì)是由加法樹(shù)和9個(gè)乘法器組成,由數(shù)據(jù)輸入完成后將輸入數(shù)據(jù)用乘法器相乘得到第一層數(shù)據(jù),再通過(guò)加法器將數(shù)據(jù)相加得到第二層數(shù)據(jù),進(jìn)而再進(jìn)行三次相加和兩次數(shù)據(jù)平移,最后結(jié)果由最后兩個(gè)數(shù)據(jù)相加得到。
激活層是當(dāng)卷積數(shù)據(jù)輸出時(shí)通過(guò)比較器與8位數(shù)據(jù)127值作對(duì)比,若比127大則可以認(rèn)為在算法中大于0輸出原值,若小于127則在算法中認(rèn)為小于0輸出數(shù)據(jù)0。
全連接層則是通過(guò)一個(gè)乘法器和一個(gè)加法器,實(shí)現(xiàn)單個(gè)數(shù)據(jù)通過(guò)FIFO輸入后進(jìn)行全連接的運(yùn)算后通過(guò)FIFO輸出。
控制模塊里面包含了多個(gè)單元核心仲裁器,每個(gè)仲裁核心會(huì)將處理數(shù)據(jù)優(yōu)先級(jí)通過(guò)優(yōu)先分配算法分配給空閑的神經(jīng)網(wǎng)絡(luò)運(yùn)算單元核心進(jìn)行卷積神經(jīng)網(wǎng)絡(luò)的運(yùn)算,結(jié)構(gòu)如圖11所示。
圖11 仲裁模塊結(jié)構(gòu)
當(dāng)數(shù)據(jù)傳入時(shí),控制模塊會(huì)查看當(dāng)前空閑的神經(jīng)網(wǎng)絡(luò)單元核心算子,若當(dāng)前仲裁卷積神經(jīng)網(wǎng)絡(luò)算子都處于繁忙階段,則會(huì)將消息傳輸?shù)较乱粋€(gè)仲裁中,仲裁都處于繁忙階段的情況下,則當(dāng)前計(jì)算直接跳過(guò),當(dāng)一個(gè)神經(jīng)網(wǎng)絡(luò)算子完成當(dāng)此計(jì)算,會(huì)將數(shù)據(jù)發(fā)到下一個(gè)神經(jīng)網(wǎng)絡(luò)算子,且讓仲裁控制器控制當(dāng)前數(shù)據(jù)是否要繼續(xù)計(jì)算或再傳送到下一個(gè)節(jié)點(diǎn)。通過(guò)將數(shù)據(jù)同時(shí)發(fā)送到多個(gè)子仲裁模塊,實(shí)現(xiàn)數(shù)據(jù)并行運(yùn)算。卷積運(yùn)算中需要運(yùn)算多個(gè)輸出通道,可以按FPGA平臺(tái)性能合理執(zhí)行單次最大并行運(yùn)算核心或通過(guò)自定義計(jì)時(shí)器和有限狀態(tài)機(jī)FSM(Finite State Machine)控制數(shù)據(jù)的再傳輸和再計(jì)算實(shí)現(xiàn)單個(gè)計(jì)算核心組的多次使用。
利用GPU平臺(tái)以及Pytorch軟件框架可以有效地對(duì)深度卷積神經(jīng)網(wǎng)絡(luò)模型進(jìn)行大規(guī)模的數(shù)據(jù)集訓(xùn)練,其中數(shù)據(jù)集使用了Fashion MNIST(FM)和CIFAR-10(CR)為數(shù)據(jù)集 。
因?yàn)橐?jì)算在量化深度網(wǎng)絡(luò)結(jié)構(gòu)在網(wǎng)絡(luò)計(jì)算量和網(wǎng)絡(luò)參數(shù)的壓縮率與識(shí)別效果,需要在平臺(tái)上記錄不同網(wǎng)絡(luò)、不同數(shù)據(jù)集、不同前推運(yùn)算的條件下記錄相關(guān)參數(shù)。通過(guò)計(jì)算量化前LeNet-5、VGG-16和ResNet-50的網(wǎng)絡(luò)大小與量化后網(wǎng)絡(luò)的面積計(jì)算壓縮率,壓縮效果和量化網(wǎng)絡(luò)對(duì)數(shù)據(jù)集的識(shí)別效果見(jiàn)表2和表3。
表2 量化面積
表3 量化精度
可以看到LeNet-5的網(wǎng)絡(luò)大小在量化前是1.66 M,量化網(wǎng)絡(luò)后大小變成了0.41,壓縮率為24.6%,因?yàn)長(zhǎng)etNet-5網(wǎng)絡(luò)有兩層卷積層數(shù)和兩層全連接層,通過(guò)量化計(jì)算參數(shù)數(shù)據(jù),壓縮卷積層中占大量計(jì)算的數(shù)據(jù)位數(shù),由原來(lái)的FP32變成INT8在數(shù)據(jù)上減少了75%的位數(shù)據(jù),在卷積層方面的壓縮效果明顯。通過(guò)融合全連接層,LetNet-5本來(lái)由原來(lái)的兩層全連接網(wǎng)絡(luò),融合成一層全連接網(wǎng)絡(luò),在計(jì)算全連接上不僅在量化中減少了大量的數(shù)據(jù),在全連接上減少了實(shí)際運(yùn)算次數(shù),達(dá)到明顯的壓縮效果。
從表中得知VGG-16網(wǎng)絡(luò)的壓縮效果是最明顯的。由于VGG-16的全連接層的數(shù)據(jù)量大部分占據(jù)在全連接層,全連接層的層數(shù)是3個(gè)網(wǎng)絡(luò)中層數(shù)最多的,在全精度的情況下VGG-16的網(wǎng)絡(luò)大小是527 M而其中全連接的占比可以達(dá)到89%即469.3 M,全連接融合有效的將中間的全連接層數(shù)運(yùn)算過(guò)程融合在了一起,將全連接的大小壓縮到了15.55 M。因?yàn)槿B接層的數(shù)量對(duì)準(zhǔn)確率有一定的影響,但是全連接層的融合是經(jīng)過(guò)訓(xùn)練后合并而成的,不會(huì)影響訓(xùn)練后用于前推的神經(jīng)網(wǎng)絡(luò)算法。
表中ResNet-50的壓縮效果與LeNet-5的壓縮效果相似。在ResNet-50中不只是在計(jì)算上,在層數(shù)上都是以卷積計(jì)算占據(jù)主要部分,并且全連接層只有一層,融合全連接的方法在ResNet-50中不起作用。ResNet-50中占據(jù)主要壓縮優(yōu)化效果的是由量化參數(shù)起作用,可以將原來(lái)98.1 M的網(wǎng)絡(luò)大小壓縮到24 M,優(yōu)化方案適應(yīng)于ResNet-50。
從表3可以看到量化后的網(wǎng)絡(luò)在在識(shí)別準(zhǔn)確率上都維持在1%以下的損失率。表明了在通過(guò)有效去除異常數(shù)據(jù)量化擬合和融合全連接層的方法可以有效地降低深度神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)大小而不會(huì)有過(guò)大的損失率,量化推理方案是有助于降低深度神經(jīng)網(wǎng)絡(luò)的復(fù)雜性并有助于降低電路設(shè)計(jì)相關(guān)深度神經(jīng)網(wǎng)絡(luò)算法電路的復(fù)雜性。
通過(guò)訓(xùn)練后的網(wǎng)絡(luò)模型,在GPU平臺(tái)下運(yùn)行FP32全精度的識(shí)別Fashion MNIST(FM)和CIFAR-10(CR)的驗(yàn)證集測(cè)試并記錄準(zhǔn)確率。獲取GPU平臺(tái)下,網(wǎng)絡(luò)訓(xùn)練模型中的參數(shù),使用C++語(yǔ)言搭建前推深度計(jì)算網(wǎng)絡(luò)模型,輸入驗(yàn)證集。將編譯好的bitstream文件導(dǎo)入到FPGA開(kāi)發(fā)板中,可以得到加速器利用資源情況見(jiàn)表4。
表4 加速器資源利用
本設(shè)計(jì)因?yàn)槭褂昧硕鄠€(gè)深度神經(jīng)網(wǎng)絡(luò)計(jì)算單元核心模塊,在一定程度上使用更多通道的并行運(yùn)算上在,并且在經(jīng)過(guò)推理量化后的計(jì)算不需要使用大量的DSP功能進(jìn)行計(jì)算,本設(shè)計(jì)的CNN加速系統(tǒng)在計(jì)算性能上相比于其他同為8位計(jì)算的FPGA實(shí)現(xiàn)由較大的提升,其中峰值154.95 GOPS,性能提高了2倍,詳細(xì)對(duì)比見(jiàn)表5。
表5 加速器對(duì)比效果
為了提高硬件移動(dòng)設(shè)備上實(shí)現(xiàn)卷積深度神經(jīng)網(wǎng)絡(luò)(CNN)的運(yùn)行性能和降低算法運(yùn)算給設(shè)備帶來(lái)的功耗問(wèn)題,通過(guò)對(duì)CNN的網(wǎng)絡(luò)結(jié)構(gòu)以及計(jì)算流程特性,設(shè)計(jì)出使用DBSCAN聚類(lèi)算法實(shí)現(xiàn)量化值域截取有效得截取INT8推理算法的閾值,改變閾值選取方法以及全連接融合減少具有大量全連接層的深度網(wǎng)絡(luò)數(shù)據(jù)量,并針對(duì)FPGA硬件和深度神經(jīng)網(wǎng)絡(luò)運(yùn)算特性,設(shè)計(jì)出多個(gè)深度神經(jīng)網(wǎng)絡(luò)計(jì)算單元核心模塊加速器。在Fashion MNIST(FM)和CIFAR-10(CR)的驗(yàn)證集上進(jìn)行了性能測(cè)試。實(shí)驗(yàn)結(jié)果表示,在量化后的神經(jīng)網(wǎng)絡(luò)中,損失率在1%以內(nèi),LeNet-5、VGG-16和ResNet-50壓縮分別為原來(lái)的24.6%,13.3%和24.4%,設(shè)計(jì)的加速器最高性能可以達(dá)到154.95GOPS,提高了2倍。