胡航天,劉 凱,馬士超,郭子博
近些年,神經(jīng)網(wǎng)絡(luò)算法廣泛應(yīng)用于計算機(jī)視覺,語音文字識別等領(lǐng)域并展現(xiàn)出了優(yōu)越的性能.在目標(biāo)檢測、行為識別、語音識別等應(yīng)用場景,神經(jīng)網(wǎng)絡(luò)算法已經(jīng)逐漸取代傳統(tǒng)算法成為主流算法.但在神經(jīng)網(wǎng)絡(luò)算法帶來優(yōu)越性能同時,其算法模型也有著更為龐大計算量和參數(shù)量,這也就給硬件平臺提出了挑戰(zhàn).圖1比較了幾種經(jīng)典DNN(深度神經(jīng)網(wǎng)絡(luò))使用相同數(shù)據(jù)集情況下的Top-1準(zhǔn)確率和計算量和模型參數(shù)大小(圓面積大小表示)[1].
圖1 經(jīng)典DNN模型性能指標(biāo)Fig.1 Performance index of classic DNN model
由圖1可以看出,無論哪種網(wǎng)絡(luò)模型在計算量、模型參數(shù)量、推理準(zhǔn)確性之間很難達(dá)到各項(xiàng)皆優(yōu).針對這個問題,選擇合適硬件計算平臺來進(jìn)行神經(jīng)網(wǎng)絡(luò)算法加速是當(dāng)前人工智能領(lǐng)域熱點(diǎn)研究方向之一.
CPU平臺難以滿足結(jié)構(gòu)復(fù)雜,計算量大模型的高性能計算,而GPU平臺并行計算能力強(qiáng),可以提供較高算力,并且有眾多開發(fā)框架和開源庫支持,如TensorFlow[2],PyTorch[3]等.在神經(jīng)網(wǎng)絡(luò)算法訓(xùn)練和推理過程中都能起到有效加速.但CPU和GPU都有較高的功耗,在星載系統(tǒng)、無人駕駛等能效要求較高的場景下,無法發(fā)揮其性能.
FPGA高并行性、軟件可編程、功耗低等特性使其可以在星載場景下,提供低功耗且高性能算法加速.神經(jīng)網(wǎng)絡(luò)模型由多層構(gòu)成,層與層之間具有嚴(yán)格獨(dú)立性,這使得神經(jīng)網(wǎng)絡(luò)模型可以用高并行結(jié)構(gòu)進(jìn)行運(yùn)算,從而進(jìn)一步發(fā)揮FPGA本身的并行優(yōu)勢[4].
在FPGA加速方面,2016年亞利桑那州立大學(xué)Yufei Ma等人提出了一種基于FPGA的模塊化CNN(卷積神經(jīng)網(wǎng)絡(luò))加速結(jié)構(gòu)[5],該結(jié)構(gòu)將網(wǎng)絡(luò)拆分為CONV(卷積)、POOL(池化)、UPSAMPLE(上采樣)等操作單元,使用FPGA實(shí)現(xiàn)了AlexNet[6]和NIN CNN[7]網(wǎng)絡(luò)模型.2017年北京大學(xué)Xuechao Wei等人設(shè)計了一種基于脈動陣列技術(shù)的高吞吐率FPGA CNN推理加速結(jié)構(gòu)[8],該結(jié)構(gòu)可以在高資源利用率下實(shí)現(xiàn)更高的時鐘頻率,從而提升了吞吐率.2018年深鑒科技發(fā)布了基于Xilinx FPGA平臺的SDK端的深度學(xué)習(xí)開發(fā)工具包DNNDK (Deep Neural Network Development Kit,DNNDK)[9].使用該工具可快速的實(shí)現(xiàn)深度學(xué)習(xí)的硬件化,其利用的CNN剪枝技術(shù)可以在增加FPS的同時,將模型在FPGA上的性能優(yōu)化5~50倍.2020年清華大學(xué)汪玉教授研究小組提出了通過多核硬件資源池、指令封裝、兩級靜態(tài)與動態(tài)編譯的方式分離任務(wù),提供了針對于云端FPGA加速神經(jīng)網(wǎng)絡(luò)的虛擬化解決方案[10].除此之外,在神經(jīng)網(wǎng)絡(luò)硬件加速領(lǐng)域,也有公司設(shè)計專門用于深度學(xué)習(xí)的處理器.AI芯片領(lǐng)域的公司寒武紀(jì)將自主研發(fā)的AI指令集系統(tǒng)應(yīng)用與硬件加速中,在2016年推出全球第一款商用終端智能處理器IP產(chǎn)品—Cambricon-1A[11].
在使用FPGA平臺進(jìn)行體系結(jié)構(gòu)設(shè)計以實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)模型時,資源占用一直是需要解決核心問題.如何在保證實(shí)現(xiàn)網(wǎng)絡(luò)模型結(jié)構(gòu)前提下盡量少使用片上資源,如何降低各個模塊RTL代碼之間耦合性一直是設(shè)計過程中棘手的問題.本文將一種自主設(shè)計專用指令集應(yīng)用在FPGA神經(jīng)網(wǎng)絡(luò)加速器中,相較于平鋪式[12]設(shè)計加速方案大大降低了片上資源,同時有效降低了不同計算模塊耦合性,進(jìn)而可以通過修改指令實(shí)現(xiàn)不同神經(jīng)網(wǎng)絡(luò)模型.
對神經(jīng)網(wǎng)絡(luò)架構(gòu)進(jìn)行分析,設(shè)計超長指令字由訪存指令和運(yùn)算指令構(gòu)成,如圖2所示,訪存指令用于和DDR數(shù)據(jù)交互及片上數(shù)據(jù)轉(zhuǎn)移,運(yùn)算指令用于控制數(shù)據(jù)邏輯運(yùn)算及條件轉(zhuǎn)移等.超長指令字設(shè)計采用定長操作碼和定長指令碼[14]的方式,使指令設(shè)計變得簡單,有利于指令的譯碼和后續(xù)執(zhí)行.由于指令設(shè)計是順序執(zhí)行,各條指令之間并不存在跳轉(zhuǎn)關(guān)系,因此指令地址碼中不存在下一條指令地址.
圖2 超長指令字設(shè)計Fig.2 The design of VLIW
1.1.1 訪存指令
由圖2可得基本訪存指令由操作碼、源操作數(shù)和目的操作數(shù)三部分組成,根據(jù)其操作的數(shù)據(jù)存儲的位置,訪存指令分為兩種,即外存交互指令和片上數(shù)據(jù)轉(zhuǎn)移指令.
(1)外存交互指令:對處于外存數(shù)據(jù)存儲器進(jìn)行讀寫操作,其源操作數(shù)和目的操作數(shù)分別在外存和片上;
(2)片上數(shù)據(jù)轉(zhuǎn)移指令:負(fù)責(zé)對片上數(shù)據(jù)存儲器進(jìn)行操作,即各個模塊間數(shù)據(jù)轉(zhuǎn)送.根據(jù)是否滿足條件,片上數(shù)據(jù)轉(zhuǎn)移指令又分為條件轉(zhuǎn)移指令和無條件轉(zhuǎn)移指令.
為了避免訪問其他存儲產(chǎn)生沖突,數(shù)據(jù)寄存器尋址方式方式采用立即尋址,直接將操作數(shù)放在指令中;同時為了保證處理速度,每一條指令只在取數(shù)據(jù)和寫回時訪問外存,各個模塊數(shù)據(jù)處理的中間值存于片上,減少訪問外存消耗時間.
1.1.2 運(yùn)算指令
運(yùn)算指令只由操作碼構(gòu)成,運(yùn)算指令根據(jù)其功能也分為兩種,即數(shù)據(jù)邏輯運(yùn)算指令和條件執(zhí)行指令.
(1)數(shù)據(jù)邏輯運(yùn)算指令:完成一個或兩個數(shù)算術(shù)邏輯計算.
(2)條件執(zhí)行指令:完成對執(zhí)行條件的判斷,滿足條件時,執(zhí)行某些特定的模塊,否則不執(zhí)行這些模塊.
圖3為一種應(yīng)用于基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)加速器的指令集邏輯架構(gòu).FPGA通過調(diào)整內(nèi)部邏輯運(yùn)行來實(shí)現(xiàn)各種功能,指令集由FPGA內(nèi)部邏輯實(shí)現(xiàn)和控制.指令集架構(gòu)由指令寄存器、指令解釋器、指令轉(zhuǎn)發(fā)模塊、內(nèi)存管理單元、和多個執(zhí)行模塊構(gòu)成.指令解釋器通過調(diào)配各個部分交替運(yùn)行來實(shí)現(xiàn)指令的翻譯及分發(fā)工作,從而實(shí)現(xiàn)調(diào)用不同的模塊實(shí)現(xiàn)不同的功能,如圖4所示.
圖3 一種應(yīng)用于基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)加速器的指令集邏輯架構(gòu)Fig.3 Application of special command set in neural network accelerator based on FPGA
圖4 指令集架構(gòu)框架Fig.4 The framework of VLIW
1.2.1 指令寄存器
指令寄存器是通過例化FPGA內(nèi)部的嵌入式塊RAM而形成的指令存儲單元,指令順序存放于指令寄存器中,上一條指令執(zhí)行完時根據(jù)執(zhí)行解釋器是否收到完成信號來判斷可否從指令寄存器中順序取下一條指令.
1.2.2 指令解釋器
指令解釋器與指令寄存器和指令轉(zhuǎn)發(fā)模塊直接交互,是整個指令集架構(gòu)的核心.從指令寄存器中取出指令被拆分并送往指令拆分解釋器的不同單元,即訪存指令送往訪存指令處理單元,運(yùn)算指令被送往運(yùn)算指令處理單元.
訪存指令處理單元將解釋的訪存指令送往內(nèi)存管理單元,由內(nèi)存管理單元對片上或外存數(shù)據(jù)進(jìn)行讀寫操作,由于一條指令中有多個訪存指令,因此內(nèi)存管理單元執(zhí)行順序?yàn)樵L存指令處理單元解釋先后順序.運(yùn)算指令處理單元將解釋的運(yùn)算指令送往指令轉(zhuǎn)發(fā)單元,由指令轉(zhuǎn)發(fā)單元調(diào)配各個執(zhí)行模塊工作.
1.2.3 指令轉(zhuǎn)發(fā)模塊
由于每個執(zhí)行模塊和指令解釋器都是獨(dú)立交互,因此指令轉(zhuǎn)發(fā)單元存在于每一個指令模塊和指令解釋模塊之間,負(fù)責(zé)轉(zhuǎn)發(fā)兩者之間的握手信號及運(yùn)算指令,三者的工作模式采用idledonefinish方式,如圖5所示.
圖5 Idledonefinish工作模式Fig.5 Idledonefinish working modes
圖5所示的工作流程如下:
(1)執(zhí)行模塊處于空閑狀態(tài)且運(yùn)算指令解釋完畢,此時模塊處于idle狀態(tài),為可接受指令狀態(tài).
(2)指令解釋模塊發(fā)送計算指令并由指令轉(zhuǎn)發(fā)模塊轉(zhuǎn)發(fā)到執(zhí)行模塊,執(zhí)行模塊接受到指令開始運(yùn)行并跳出idle狀態(tài),并在指令執(zhí)行完畢后向指令轉(zhuǎn)發(fā)模塊發(fā)送done信號.
(3)指令轉(zhuǎn)發(fā)模塊收到done信號并轉(zhuǎn)發(fā)給指令解釋器,指令解釋器收到done信號并發(fā)送done_ack信號.
(4)指令解釋器接收到done_ack信號并轉(zhuǎn)發(fā)給指令轉(zhuǎn)發(fā)模塊,指令執(zhí)行模塊接收done_ack后發(fā)出finish信號,通知指令解釋器功能已全部執(zhí)行完畢.
(5)指令轉(zhuǎn)發(fā)模塊收到finish信號轉(zhuǎn)發(fā)到指令解釋器,指令解釋器接受finish后發(fā)出finish_ack并于指令轉(zhuǎn)發(fā)模塊轉(zhuǎn)發(fā)到執(zhí)行模塊,執(zhí)行模塊在接收到finish_ack信號后轉(zhuǎn)為idle狀態(tài),等待下一條指令運(yùn)行.
由于運(yùn)算指令幾乎同時解釋完畢并送出,各個模塊也在同一時間接收到運(yùn)算指令,但由于數(shù)據(jù)流限制,每個模塊必須接收到指令并且接收到上一個模塊輸出的數(shù)據(jù)才能滿足執(zhí)行的條件,可實(shí)現(xiàn)模塊間串行的目的.
1.2.4 內(nèi)存管理單元
內(nèi)存管理單元主要用于片上模塊與內(nèi)存的交互,歸納來說,本設(shè)計的內(nèi)存管理單元負(fù)責(zé)如下功能:
(1)將指令中地址映射為片上或片下物理地址.
(2)提供硬件機(jī)制的內(nèi)存訪問授權(quán)
由于片上寄存器和DDR已經(jīng)通過AXI[16]總線統(tǒng)一編址,因此內(nèi)存管理單元可以通過AXI總線將一個內(nèi)存地址搬到另一個內(nèi)存地址.內(nèi)存管理單元不負(fù)責(zé)將內(nèi)存中的數(shù)據(jù)讀出并輸出給其它模塊,這是由于片上寄存器已經(jīng)額外引出了native read port端口,其它模塊可以直接讀取其中數(shù)據(jù).整個設(shè)計方案進(jìn)行計算時,數(shù)據(jù)是已經(jīng)緩存在片上RAM的,而不是直接從DDR取數(shù)參與計算的.
1.2.5 執(zhí)行模塊
執(zhí)行模塊是將原神經(jīng)網(wǎng)絡(luò)不同層間相似功能單獨(dú)編寫成的一個可執(zhí)行塊,在每層運(yùn)行時只需實(shí)例化便可,采用模塊化的方式,可以大大減少開發(fā)的時間和消耗的資源.
指令流水線由取指、譯碼、執(zhí)行、寫回、取下一條指令五部分組成,如圖6所示.
圖6 指令流水線Fig.6 Instruction pipeline
圖6所示的工作流程如下:
(1)取指階段:根據(jù)指令解釋器中計數(shù)器的值從指令寄存器對應(yīng)位置取出指令并送往指令解釋器.
(2)譯碼階段:指令解釋器將取出的指令拆分并根據(jù)指令類型分發(fā)到不同執(zhí)行模塊.
(3)執(zhí)行階段:各個執(zhí)行模塊接收到解釋完的指令并等待上一個模塊數(shù)據(jù),接收到數(shù)據(jù)后模塊運(yùn)行.
(4)寫回階段:所有計算模塊運(yùn)行完后的數(shù)據(jù)送入寫回模塊,寫回模塊在指令的調(diào)度下執(zhí)行寫回操作,將計算結(jié)果寫回片上或者外存.
(5)取下一條指令:每一個執(zhí)行模塊工作完畢向指令解釋模塊返回finish信號,當(dāng)指令解釋模塊收到所有模塊finish時,指令解釋模塊中計數(shù)器加一,取下一條指令.
以用于目標(biāo)檢測的YOLOV3-Tiny網(wǎng)絡(luò)模型為例,其網(wǎng)絡(luò)結(jié)構(gòu)如圖7所示,YOLOV3-Tiny共有23層網(wǎng)絡(luò)層,其中16和23層為YOLO層,其他層為conv(卷積)、pool(池化)和upsample(上采樣),其網(wǎng)絡(luò)在YOLOV3網(wǎng)絡(luò)的基礎(chǔ)上去掉了一些特征層,只保留了兩個獨(dú)立的預(yù)測分支,相較于YOLOV3網(wǎng)絡(luò),YOLOV3-Tiny在損失可接受精度的情況下,檢測速度得到提升.
該神經(jīng)網(wǎng)絡(luò)模型在FPGA上實(shí)現(xiàn)主要操作為Convolution(卷積),Pooling(池化),Upsample (上采樣).各主要操作如表1所示.其中可以看出卷積操作次數(shù)最多,而利用FPGA進(jìn)行算法加速,最為重要就是利用FPGA的計算資源并行化計算多通道卷積.目前FPGA內(nèi)部都包含了大量DSP硬核資源(在一個指令周期內(nèi)可完成一次乘法和一次加法的芯片),利用DSP陣列可以高速并行計算卷積的乘加操作.
在使用FPGA平臺實(shí)現(xiàn)該神經(jīng)網(wǎng)絡(luò)模型加速時,采用平鋪式設(shè)計方案需要實(shí)例化大量的計算資源和存儲資源,而采用指令集架構(gòu)可通過不同的指令選擇執(zhí)行模塊是否工作,使用這種方式可以很大程度下復(fù)用各個執(zhí)行模塊,降低片上資源的使用.
圖7 YOLOV3-Tiny網(wǎng)絡(luò)結(jié)構(gòu)Fig.7 YOLOV3-Tiny network
表1 YOLOV3-Tiny網(wǎng)絡(luò)主要操作Tab.1 YOLOV3-Tiny network main operation
本文以卷積層操作使用16*32的高速DSP陣列實(shí)現(xiàn)為例,采用16bit量化和指令控制式加速方案在Xilinx XCVU9P FPGA使用的主要片上資源如表2而所示.根據(jù)實(shí)例化執(zhí)行模塊個數(shù),本文估算了平鋪式加速方案的資源消耗如表2所示,兩種方案的資源消耗對比如圖8所示(為了對比清晰,LUT、LUTRAM、FF資源數(shù)量縮小了100倍).
可以看出,使用平鋪式設(shè)計方案會消耗大量片上資源,甚至對于復(fù)雜網(wǎng)絡(luò)模型單一FPGA的資源無法滿足設(shè)計需求,且數(shù)據(jù)流相對固定,不能靈活的適應(yīng)不同的網(wǎng)絡(luò)模型,而采用指令控制的方案可以不僅提高了模塊的復(fù)用性,可通過修改指令的方式靈活適應(yīng)各種網(wǎng)絡(luò)模型,且可以節(jié)省50%片上資源,實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)算法在FPGA上低功耗的加速.
精度檢測采用的數(shù)據(jù)集為SAR圖像船舶檢測數(shù)據(jù)集,數(shù)據(jù)集來源于102張Gaofen-3 圖片和108張Sentinel-1圖片,含有43819張船舶切片,包含的船舶數(shù)目為59535,所有切片尺寸固定,為256*256,三通道,24位圖像深度,標(biāo)注文件提供相應(yīng)圖像的長寬尺寸、標(biāo)注目標(biāo)的類別以及標(biāo)注矩形框的位置.
平鋪式的YOLOV3-Tiny網(wǎng)絡(luò)AP(平均正確率)為0.8,而指令控制式的YOLOV3-Tiny網(wǎng)絡(luò)AP(平均正確率)為0.78,在沒有精度損失的情況下,在相同的硬件環(huán)境中,指令控制式網(wǎng)絡(luò)的GOPs為傳統(tǒng)平鋪式網(wǎng)絡(luò)的4倍.
表2 兩種方案使用資源情況Tab.2 Resource usage
圖8 資源消耗對比圖Fig.8 Comparison chart of resource consumption
為應(yīng)對在基于FPGA的神經(jīng)網(wǎng)絡(luò)加速器的硬件結(jié)構(gòu)設(shè)計中,片上資源消耗大、各執(zhí)行模塊耦合性高等問題,本文設(shè)計實(shí)現(xiàn)了一套專用指令集.在硬件條件相同情況下,相較傳統(tǒng)平鋪式方案,應(yīng)用該指令集的方案可使GOPs提升4倍,資源消耗降低50%,驗(yàn)證了專用指令集可降低各執(zhí)行模塊之間的耦合性,并能切實(shí)減少在神經(jīng)網(wǎng)絡(luò)硬件加速結(jié)構(gòu)設(shè)計時FPGA片上資源的使用.