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