陳 朋 陳慶清 王海霞 張怡龍 劉義鵬 梁榮華
(*浙江工業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 杭州 310000) (**浙江工業(yè)大學(xué)信息工程學(xué)院 杭州 310000)
近年來,由于卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)的結(jié)構(gòu)層次越來越深,在圖像分類、目標(biāo)檢測、目標(biāo)跟蹤[1]等計(jì)算機(jī)視覺領(lǐng)域都得到了廣泛的應(yīng)用,但高計(jì)算復(fù)雜度和大內(nèi)存占用是硬件加速的瓶頸,需要開發(fā)更高效的硬件加速解決方案來驅(qū)動實(shí)時應(yīng)用程序[2]。Li等人[3]提出了基于GPU的大規(guī)模遞歸神經(jīng)網(wǎng)絡(luò)的高效實(shí)現(xiàn)。Li等人[4]分析了GPU加速器潛在的性能瓶頸。隨著CNN模型越來越大、越來越深,CNN加速器需要更多的計(jì)算操作和數(shù)據(jù)訪問,雖然GPU具有強(qiáng)大的計(jì)算能力,但也存在著功耗較高、體積較大和成本較高等問題。
現(xiàn)場可編程門陣列(field programmable gate arrang, FPGA)具有大量陣列形式邏輯、運(yùn)算單元,在尺寸、功耗和并行運(yùn)算方面都比GPU有優(yōu)勢[5],具有高性能、低功耗、使用靈活方便等優(yōu)點(diǎn)[6]。傳統(tǒng)構(gòu)造FPGA的卷積神經(jīng)網(wǎng)絡(luò)的方式是基于寄存器傳輸級(register transfer level,RTL)描述語言設(shè)計(jì)的。郭曉丹等人[7]在FPGA上實(shí)現(xiàn)了單比特BP人工神經(jīng)網(wǎng)絡(luò),采用了低環(huán)路延遲加法器、混合信號乘法器來減少硬件消耗,提高運(yùn)算精度。Han等人[8]在FPGA平臺上設(shè)計(jì)的網(wǎng)絡(luò)加速器,其能源效率是CPU的40倍,GPU的11.5倍。林軍等人[9]提出了基于數(shù)據(jù)流水線的資源管理,馮煜晶等人[10]針對流水線停頓提出了動態(tài)指令調(diào)度機(jī)制。Li等人[11]采用流水線結(jié)構(gòu)達(dá)到565.94 GOP/s和391 fps的峰值性能。但傳統(tǒng)的基于RTL設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò)仍然具有流程復(fù)雜、周期較長和優(yōu)化空間較小等問題[12]。Ma等人[13,14]基于RTL設(shè)計(jì)了可擴(kuò)展的自動編譯器,但仍然無法避免流程復(fù)雜、周期較長等問題。
在其他基于FPGA的CNN加速器的設(shè)計(jì)方法中,使用基于高層次綜合(high-level synthesis,HLS)工具可以將高級編程語言直接轉(zhuǎn)化為硬件描述語言(hardware description language,HDL),并且對所生成的硬件結(jié)構(gòu)可以通過插入優(yōu)化指令進(jìn)行優(yōu)化,其中包括映射硬件寄存器、循環(huán)、接口等操作[15]。Zhang等人[16]通過HLS工具,使得基于FPGA的加速器的速度是NVIDIA K80的4.75倍。盧治等人[17]使用HLS工具證明了FPGA平臺在不同的網(wǎng)絡(luò)模型下效能遠(yuǎn)高于GPU平臺。由此可見,HLS工具設(shè)計(jì)的FPGA神經(jīng)網(wǎng)絡(luò)加速器同樣具有良好的性能,而且在設(shè)計(jì)周期上遠(yuǎn)遠(yuǎn)短于傳統(tǒng)方法,具有良好的可擴(kuò)展性。
另一方面,在數(shù)據(jù)規(guī)模較大的分類場景下,并不需要網(wǎng)絡(luò)的高精度,需要的是更高實(shí)時性。在FPGA上,實(shí)現(xiàn)定點(diǎn)運(yùn)算的效率比浮點(diǎn)運(yùn)算高得多。Gysel等人[18]和Qiu等人[19]分別在GPU平臺和基于RTL設(shè)計(jì)的FPGA平臺提出動態(tài)定點(diǎn)數(shù)據(jù)量化方法,并且Qiu等人[19]只引入了0.4%的精度損失,實(shí)現(xiàn)了4.45 fps的幀率。在可接受的精度損失的條件下,對FPGA卷積加速器采用定點(diǎn)設(shè)計(jì),可以有效減少硬件開銷,從而提升加速器的性能。
綜上所述,本文提出改進(jìn)動態(tài)配置的FPGA卷積神經(jīng)網(wǎng)絡(luò)加速器的優(yōu)化方法。該方法采用C++作為編程語言,將加速器任務(wù)劃分到處理器系統(tǒng)與可編程邏輯上。處理器系統(tǒng)上使用基于模塊復(fù)用的流水線方式,多個模塊之間通過片內(nèi)總線實(shí)現(xiàn)高速互連。在可編程邏輯上將引入分割參數(shù),使用HLS工具設(shè)計(jì)具有可擴(kuò)展性卷積加速器并實(shí)現(xiàn)其功能。同時采用8-16位動態(tài)定點(diǎn)方案,將浮點(diǎn)數(shù)據(jù)改為動態(tài)定點(diǎn)數(shù)據(jù),引入量化參數(shù),以適配不同網(wǎng)絡(luò)層量化配置。本文將ImageNet數(shù)據(jù)庫作為數(shù)據(jù)集,在FPGA上搭建了CNN網(wǎng)絡(luò)加速器,驗(yàn)證了方法的有效性。本文的主要工作如下。
(1) 引入分割參數(shù)后,以流水線的方式將網(wǎng)絡(luò)中相同層進(jìn)行模塊復(fù)用來實(shí)現(xiàn)并行工作,并建立沖突解決機(jī)制來解決輸入數(shù)據(jù)的競爭問題。
(2) 根據(jù)FPGA的計(jì)算特性,采用動態(tài)定點(diǎn)數(shù)據(jù)量化方法,將浮點(diǎn)數(shù)據(jù)改為動態(tài)定點(diǎn)數(shù)據(jù)。并在HLS工具設(shè)計(jì)過程中引入量化參數(shù),以適配不同網(wǎng)絡(luò)層量化配置。
本文對優(yōu)化對象進(jìn)行劃分,將不同的優(yōu)化對象分別劃分到處理器系統(tǒng)(processing system,PS)與可編程邏輯(programmable logic,PL)上,優(yōu)化示意圖如圖1所示。在PS部分上實(shí)現(xiàn)基于流水線結(jié)構(gòu)的層間模塊復(fù)用,并建立對應(yīng)的沖突處理機(jī)制來解決復(fù)用造成的信號沖突;在PL部分上利用HLS工具設(shè)計(jì)優(yōu)化卷積加速器,通過仿真報(bào)告來驗(yàn)證資源占用比。完成設(shè)計(jì)后,對整個系統(tǒng)進(jìn)行聯(lián)合仿真,驗(yàn)證結(jié)果的準(zhǔn)確性,通過實(shí)驗(yàn)來驗(yàn)證設(shè)計(jì)方法的有效性。
圖1 優(yōu)化示意圖
卷積神經(jīng)網(wǎng)絡(luò)的特征提取階段往往由多個計(jì)算層組成,例如AlexNet網(wǎng)絡(luò),它的特征提取階段可以由5個卷積層和3個池化層組成。卷積運(yùn)算如圖2所示。卷積層接收特征圖作為輸入,每個輸入特征圖通過卷積核映射生成輸出特性,輸出特征圖將形成下一個卷積層的輸入特征圖集。N表示特征圖的個數(shù),W和H分別表示輸入特征圖的寬與高,K×K表示卷積核的窗口大小,S(通常小于K)表示窗口的平移步長,M表示輸出特征圖的個數(shù)和卷積核的個數(shù),C和R分別表示輸出特征圖的寬與高。
圖2 卷積運(yùn)算示意圖
池化層的目標(biāo)是減少前一個卷積層產(chǎn)生的數(shù)據(jù)的大小,同時保持最相關(guān)的特性。實(shí)際上,池化層通常插入到2個卷積層之間。因?yàn)榫矸e層和池化層擁有相似的內(nèi)存訪問模式,因此它們在本文中使用相同的內(nèi)存和優(yōu)化設(shè)計(jì)方案,可以用式(1)表達(dá)。其中OUT表示輸出特征圖,W表示權(quán)重系數(shù),IN表示輸入特征圖。
×INti,S×row+i,S×col+j
(1)
在一般情況下,卷積神經(jīng)網(wǎng)絡(luò)所處理的輸入集輸出集均為3維數(shù)據(jù),需要和各個層的卷積核大小和步長一起作為函數(shù)變量進(jìn)行傳遞。但如果循環(huán)內(nèi)含有變量,就不能利用HLS工具的循環(huán)展開、循環(huán)流水線等優(yōu)化方式進(jìn)行優(yōu)化。
為了提高數(shù)據(jù)處理的并行度,引入
在卷積層加速器進(jìn)行高層次綜合之前,需要確定分割參數(shù)
(2)
對于大規(guī)模的應(yīng)用場景,圖像數(shù)據(jù)往往是具有連續(xù)性的。根據(jù)CNN數(shù)據(jù)處理特性,可知CNN內(nèi)部的數(shù)據(jù)處理過程是依照不同處理層順序進(jìn)行的,即網(wǎng)絡(luò)中前后相鄰的層之間,數(shù)據(jù)具有依賴關(guān)系,無法進(jìn)行并行處理。對于GPU來說,卷積神經(jīng)網(wǎng)絡(luò)的每一層輸入都是上一層的輸出,層間的數(shù)據(jù)關(guān)系緊密相關(guān),是一種串行結(jié)構(gòu),無法做到層間并行運(yùn)算。相比于GPU,F(xiàn)PGA的硬件結(jié)構(gòu)可以采用流水線結(jié)構(gòu),用以減少運(yùn)算的時間開銷,提高資源利用率。
本文中的流水線由多個卷積神經(jīng)網(wǎng)絡(luò)的層級結(jié)構(gòu)組成。由于流水線中的不同層級模塊具有不同的計(jì)算時間,計(jì)算周期最長的層級模塊是流水線中瓶頸段,實(shí)際加速比也由瓶頸段所決定的。實(shí)際加速比S如式(3)所示:
(3)
在資源約束情況下,想要保持卷積神經(jīng)網(wǎng)絡(luò)良好的計(jì)算性能,需要充分考慮其并行運(yùn)算的情況。由于相鄰層之間具有數(shù)據(jù)依賴關(guān)系,其數(shù)據(jù)處理無法并行進(jìn)行,為達(dá)到對資源的高效利用,本文采用各個不同網(wǎng)絡(luò)層間模塊復(fù)用的方案,如圖3所示,以實(shí)現(xiàn)對硬件資源的節(jié)約并提高單個加速器的計(jì)算效能。即其中所有卷積層采用同一個卷積加速器進(jìn)行計(jì)算,所有池化層采用同一個池化層加速器進(jìn)行處理,所有全連接層采用同一個全連接層加速器進(jìn)行處理。
圖3 網(wǎng)絡(luò)層間模塊復(fù)用示意圖
模塊復(fù)用的關(guān)鍵在于解決輸入數(shù)據(jù)的競爭問題。模塊重用之前,各個模塊的輸入和輸出是相互獨(dú)立的。模塊重用之后,多個輸入需要整合成一個輸入,重用模塊的輸出是根據(jù)輸入選擇的。t時刻多個輸入數(shù)據(jù)的沖突信號C是由輸入數(shù)據(jù)的有效信號V組成的,如式(4)所示,其中v表示輸入數(shù)據(jù)個數(shù)。
(4)
如果重用模塊在t時刻檢測到?jīng)_突(C≥1),就需要建立沖突解決機(jī)制來避免沖突。我們通過增加流水線cache的方式,避免數(shù)據(jù)同時到達(dá)重用模塊的輸入端口。具體操作是在后一個模塊數(shù)據(jù)輸入前增加FIFO來緩存輸入數(shù)據(jù),直到?jīng)_突解決。
對于流水線中的第k個模塊,它在t時刻輸入信號Vα如式(5)所示。當(dāng)Vα=0時,說明輸入無效。當(dāng)Vα>0時,則說明輸入有效。
(5)
在增加了x級的cache后,模塊的流水線在t時刻輸入信號Vβ如式(6)所示,此時沖突信號C如式(7)所示。其中Vx表示在增加了x級的cache后,重用模塊的輸入數(shù)據(jù)的有效信號。
(6)
(7)
卷積神經(jīng)網(wǎng)絡(luò)的復(fù)雜性集中在兩部分,卷積層中存在著大量的運(yùn)算,而網(wǎng)絡(luò)權(quán)重通常集中于全連接層。例如AlexNet,超過90%的運(yùn)算集中在卷積層,超過90%的網(wǎng)絡(luò)權(quán)值集中在全連接層中,如圖4所示。
圖4 AlexNet中不同層的運(yùn)算次數(shù)和權(quán)重?cái)?shù)
傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)模型在CPU和GPU的訓(xùn)練過程中得到的都是32位的浮點(diǎn)型數(shù)據(jù),但是在測試或者分類階段,并不需要這樣的高精度。FPGA卷積神經(jīng)網(wǎng)絡(luò)加速器的設(shè)計(jì)目標(biāo)是以最高性能實(shí)現(xiàn)最佳精度。在Zhang等人[20]的工作中,實(shí)現(xiàn)模型采用32位的浮點(diǎn)型數(shù)據(jù)進(jìn)行計(jì)算。然而在FPGA上,實(shí)現(xiàn)定點(diǎn)運(yùn)算的效率比浮點(diǎn)運(yùn)算高得多[21]。在盡可能不影響精度的前提下,如果將網(wǎng)絡(luò)進(jìn)行量化,使用定點(diǎn)運(yùn)算來代替浮點(diǎn)運(yùn)算,直接降低存儲需求以及存儲傳輸所消耗的能量,從而提升加速器的性能。網(wǎng)絡(luò)的準(zhǔn)確性往往取決于用于表示特征圖和訓(xùn)練參數(shù)的精度參數(shù),需要合理的量化參數(shù)來保證模型量化后的網(wǎng)絡(luò)準(zhǔn)確性。
對傳統(tǒng)的靜態(tài)定點(diǎn)方案而言,只能滿足大部分的權(quán)重取值范圍,而動態(tài)定點(diǎn)方案可以通過調(diào)整數(shù)據(jù)格式來滿足不同網(wǎng)絡(luò)層的精度需求。在動態(tài)定點(diǎn)方案中,每個數(shù)字都可以用式(8)表示:
(8)
其中B表示位寬,S表示符號位,F(xiàn)表示小數(shù)長度,x表示當(dāng)前位的值。動態(tài)精度量化與靜態(tài)精度量化不同之處在于FL對于不同網(wǎng)絡(luò)層的特征圖集是動態(tài)的,而在一個圖層中是靜態(tài)的,這樣做是為了將每個網(wǎng)絡(luò)層的誤差最小化。
由于動態(tài)定點(diǎn)中每個網(wǎng)絡(luò)層的量化參數(shù)各有差異,特別是針對層間模塊復(fù)用的情況,因此在使用HLS工具設(shè)計(jì)網(wǎng)絡(luò)層加速器時,需引入量化參數(shù)
在完成訓(xùn)練之后需要對網(wǎng)絡(luò)進(jìn)行量化來獲取量化參數(shù),并根據(jù)網(wǎng)絡(luò)精度變化來選取最優(yōu)的量化參數(shù)。在選取量化參數(shù)時應(yīng)滿足式(9)的條件:
F=argmin∑|R-RB,F|
(9)
其中,R為訓(xùn)練時得到的定點(diǎn)數(shù)據(jù),RB,F為給定條件下的定點(diǎn)格式。
本文實(shí)驗(yàn)采用了Xilinx公司的Xilinx SDSoC 2017.4軟件環(huán)境進(jìn)行硬件開發(fā),使用的硬件平臺為該公司的ZCU102開發(fā)板,其芯片型號為ZU9EG,使用的工作頻率為200 MHz,采用了8-16位動態(tài)定點(diǎn)方案。實(shí)驗(yàn)采用的數(shù)據(jù)集為ImageNet數(shù)據(jù)集,對比的GPU平臺為NVIDIA公司的TITAN-X,本實(shí)驗(yàn)測試的網(wǎng)絡(luò)結(jié)構(gòu)為AlexNet網(wǎng)絡(luò)和VGG網(wǎng)絡(luò)。
卷積層加速器內(nèi)部的乘加運(yùn)算需調(diào)用數(shù)字信號處理器(digital signal processor, DSP)來進(jìn)行,在本文中,對卷積操作的循環(huán)進(jìn)行了展開,卷積層加速器所消耗的DSP數(shù)量與循環(huán)分割參數(shù)Tm和Tn的關(guān)系如圖5所示,可見卷積層加速器的DSP的消耗量與分割參數(shù)Tm×Tn呈線性關(guān)系,循環(huán)展開越大,DSP消耗量也越大。
卷積層加速器內(nèi)部的片上緩存主要是調(diào)用雙極隨機(jī)存取存儲器(bipolar random access memory, BRAM)來進(jìn)行存儲的,在本文中卷積層加速器所消耗的BRAM與循環(huán)分割參數(shù)Tr和Tc的關(guān)系如圖6所示,可見BRAM的消耗量與分割參數(shù)Tr×Tc基本呈線性關(guān)系,便于之后的拓展設(shè)計(jì)。
AlexNet網(wǎng)絡(luò)和VGG網(wǎng)絡(luò)在動態(tài)定點(diǎn)量化前后的Top-1和Top-5的準(zhǔn)確率如表1所示。AlexNet網(wǎng)絡(luò)量化前后Top-1和Top-5的精度損失為0.4%和0.14%,VGG網(wǎng)絡(luò)量化前后Top-1和Top-5的精度損失為0.63%和0.53%,與其他加速算法的精度損失對比如表2所示。Naveen等人[22]和Wei等人[23]采用8-16位定點(diǎn),Zhang等人[24]采用16位定點(diǎn),其算法精度損失均在1%~2%左右。而本文采用的8-16位動態(tài)定點(diǎn)設(shè)計(jì)方案在此基礎(chǔ)上將精度損失減小至0.63%。
圖5 不同參數(shù)配置下的DSP消耗量
圖6 不同參數(shù)配置下的BRAM消耗量表1 量化前后網(wǎng)絡(luò)模型精度比較
準(zhǔn)確率32位浮點(diǎn)Top-1Top-58-16位動態(tài)定點(diǎn)Top-1Top-5AlexNet63.87%85.39%63.47%85.25%VGG71.59%90.07%70.96%89.54%
表2 不同加速器的精度損失比較
利用循環(huán)展開、流水線等HLS工具的優(yōu)化技術(shù)進(jìn)行網(wǎng)絡(luò)加速,表3顯示了優(yōu)化前后的單張圖片運(yùn)行時間和資源占用比。DSP的資源比優(yōu)化前增加7.2倍,其余資源也有增加,但都未超過系統(tǒng)所提供的硬件資源上限,同時運(yùn)算速度提升了295.7倍。在應(yīng)用層間模塊復(fù)用后,硬件資源基本沒有變動,但平均計(jì)算時間僅是原來的20%。
表3 優(yōu)化前后運(yùn)算時間、資源占用對比
針對AlexNet網(wǎng)絡(luò)結(jié)構(gòu),應(yīng)用本文的優(yōu)化配置后,對其性能及功耗進(jìn)行測量,并將結(jié)果與其他優(yōu)化方法比較,其對比結(jié)果如表4所示。在TIAN-X上每幅圖的計(jì)算時間為1.93 ms,本文每幅圖的計(jì)算時間為3.44 ms,是TIAN-X的1.78倍,但在TIAN-X上每幅圖所需功耗為0.511 J,本文每幅圖所需功耗僅需0.078 J,其計(jì)算能效達(dá)到了GPU的7.2倍,并且FPGA的便攜性遠(yuǎn)遠(yuǎn)高于GPU。Zhang等人[20]使用HLS工具,提出了基于循環(huán)迭代之間的數(shù)據(jù)共享關(guān)系的循環(huán)分割與重排。本文在此基礎(chǔ)上進(jìn)行8-16位的動態(tài)定點(diǎn)量化,并引入了基于流水線層間模塊復(fù)用,將計(jì)算速度提高了6.2倍,同時也優(yōu)于文獻(xiàn)[22]基于OpenCL的開發(fā)方式。文獻(xiàn)[9]基于RTL設(shè)計(jì),用流水線結(jié)構(gòu)來增加吞吐量,達(dá)到了391 fps的峰值性能。雖然Li等人[9]設(shè)計(jì)的加速器速度更快,但由于功耗更大,其計(jì)算能效和本文的方法幾乎相同,且開發(fā)周期較長,應(yīng)對不同網(wǎng)絡(luò)結(jié)構(gòu)的可擴(kuò)展性不強(qiáng)。
針對VGG網(wǎng)絡(luò)結(jié)構(gòu)的性能比較如表5所示,在TIAN-X上每幅圖的計(jì)算時間為6.60 ms,本文每幅圖的計(jì)算時間為18.37 ms,計(jì)算能效達(dá)到了GPU的3.89倍。文獻(xiàn)[23]采用的是脈動陣列的高通量CNN設(shè)計(jì),每幅圖的計(jì)算時間為26.85 ms。文獻(xiàn)[25]針對卷積循環(huán)的內(nèi)存訪問和數(shù)據(jù)移動進(jìn)行了定量分析和優(yōu)化,每幅圖的計(jì)算時間分別為47.97 ms。文獻(xiàn)[24]使用RTL提出了一個深度流水線的多FPGA架構(gòu)。而本文結(jié)合了循環(huán)迭代優(yōu)化和流水線優(yōu)化,提高了計(jì)算速度的優(yōu)化上限,把計(jì)算速度提高了至少2倍。
表4 AlexNet網(wǎng)絡(luò)加速器的性能比較
表5 VGG網(wǎng)絡(luò)加速器的性能比較
本文利用HLS工具的可擴(kuò)展性,提出了一種改進(jìn)動態(tài)配置的FPGA卷積神經(jīng)網(wǎng)絡(luò)加速器的優(yōu)化方法。引入循環(huán)分割參數(shù),設(shè)計(jì)了具有可擴(kuò)展性的卷積加速器。將網(wǎng)絡(luò)層通過復(fù)用模塊,組合成流水線的工作方式,采用8-16位動態(tài)定點(diǎn)方案。在Xilinx的ZCU102開發(fā)板上實(shí)現(xiàn)了AlexNet網(wǎng)絡(luò)和VGG網(wǎng)絡(luò)。在最大精度損失0.63%的條件下,將加速器性能分別從46.3 fps和37.2 fps提高到了290.7 fps和54.4 fps,計(jì)算能效分別達(dá)到了TITAN-X的1.78倍和3.89倍。實(shí)驗(yàn)結(jié)果表明,本文所提出的改進(jìn)動態(tài)配置的FPGA卷積神經(jīng)網(wǎng)絡(luò)加速器的優(yōu)化方法,在計(jì)算能效上優(yōu)于GPU Titan-X,滿足了計(jì)算實(shí)時性的要求,同時也解決了功耗和體積問題。