胡航天,劉 凱,馬士超,郭子博
近些年,神經網絡算法廣泛應用于計算機視覺,語音文字識別等領域并展現出了優越的性能.在目標檢測、行為識別、語音識別等應用場景,神經網絡算法已經逐漸取代傳統算法成為主流算法.但在神經網絡算法帶來優越性能同時,其算法模型也有著更為龐大計算量和參數量,這也就給硬件平臺提出了挑戰.圖1比較了幾種經典DNN(深度神經網絡)使用相同數據集情況下的Top-1準確率和計算量和模型參數大小(圓面積大小表示)[1].

圖1 經典DNN模型性能指標Fig.1 Performance index of classic DNN model
由圖1可以看出,無論哪種網絡模型在計算量、模型參數量、推理準確性之間很難達到各項皆優.針對這個問題,選擇合適硬件計算平臺來進行神經網絡算法加速是當前人工智能領域熱點研究方向之一.
CPU平臺難以滿足結構復雜,計算量大模型的高性能計算,而GPU平臺并行計算能力強,可以提供較高算力,并且有眾多開發框架和開源庫支持,如TensorFlow[2],PyTorch[3]等.在神經網絡算法訓練和推理過程中都能起到有效加速.但CPU和GPU都有較高的功耗,在星載系統、無人駕駛等能效要求較高的場景下,無法發揮其性能.
FPGA高并行性、軟件可編程、功耗低等特性使其可以在星載場景下,提供低功耗且高性能算法加速.神經網絡模型由多層構成,層與層之間具有嚴格獨立性,這使得神經網絡模型可以用高并行結構進行運算,從而進一步發揮FPGA本身的并行優勢[4].
在FPGA加速方面,2016年亞利桑那州立大學Yufei Ma等人提出了一種基于FPGA的模塊化CNN(卷積神經網絡)加速結構[5],該結構將網絡拆分為CONV(卷積)、POOL(池化)、UPSAMPLE(上采樣)等操作單元,使用FPGA實現了AlexNet[6]和NIN CNN[7]網絡模型.2017年北京大學Xuechao Wei等人設計了一種基于脈動陣列技術的高吞吐率FPGA CNN推理加速結構[8],該結構可以在高資源利用率下實現更高的時鐘頻率,從而提升了吞吐率.2018年深鑒科技發布了基于Xilinx FPGA平臺的SDK端的深度學習開發工具包DNNDK (Deep Neural Network Development Kit,DNNDK)[9].使用該工具可快速的實現深度學習的硬件化,其利用的CNN剪枝技術可以在增加FPS的同時,將模型在FPGA上的性能優化5~50倍.2020年清華大學汪玉教授研究小組提出了通過多核硬件資源池、指令封裝、兩級靜態與動態編譯的方式分離任務,提供了針對于云端FPGA加速神經網絡的虛擬化解決方案[10].除此之外,在神經網絡硬件加速領域,也有公司設計專門用于深度學習的處理器.AI芯片領域的公司寒武紀將自主研發的AI指令集系統應用與硬件加速中,在2016年推出全球第一款商用終端智能處理器IP產品—Cambricon-1A[11].
在使用FPGA平臺進行體系結構設計以實現神經網絡模型時,資源占用一直是需要解決核心問題.如何在保證實現網絡模型結構前提下盡量少使用片上資源,如何降低各個模塊RTL代碼之間耦合性一直是設計過程中棘手的問題.本文將一種自主設計專用指令集應用在FPGA神經網絡加速器中,相較于平鋪式[12]設計加速方案大大降低了片上資源,同時有效降低了不同計算模塊耦合性,進而可以通過修改指令實現不同神經網絡模型.
對神經網絡架構進行分析,設計超長指令字由訪存指令和運算指令構成,如圖2所示,訪存指令用于和DDR數據交互及片上數據轉移,運算指令用于控制數據邏輯運算及條件轉移等.超長指令字設計采用定長操作碼和定長指令碼[14]的方式,使指令設計變得簡單,有利于指令的譯碼和后續執行.由于指令設計是順序執行,各條指令之間并不存在跳轉關系,因此指令地址碼中不存在下一條指令地址.

圖2 超長指令字設計Fig.2 The design of VLIW
1.1.1 訪存指令
由圖2可得基本訪存指令由操作碼、源操作數和目的操作數三部分組成,根據其操作的數據存儲的位置,訪存指令分為兩種,即外存交互指令和片上數據轉移指令.
(1)外存交互指令:對處于外存數據存儲器進行讀寫操作,其源操作數和目的操作數分別在外存和片上;
(2)片上數據轉移指令:負責對片上數據存儲器進行操作,即各個模塊間數據轉送.根據是否滿足條件,片上數據轉移指令又分為條件轉移指令和無條件轉移指令.
為了避免訪問其他存儲產生沖突,數據寄存器尋址方式方式采用立即尋址,直接將操作數放在指令中;同時為了保證處理速度,每一條指令只在取數據和寫回時訪問外存,各個模塊數據處理的中間值存于片上,減少訪問外存消耗時間.
1.1.2 運算指令
運算指令只由操作碼構成,運算指令根據其功能也分為兩種,即數據邏輯運算指令和條件執行指令.
(1)數據邏輯運算指令:完成一個或兩個數算術邏輯計算.
(2)條件執行指令:完成對執行條件的判斷,滿足條件時,執行某些特定的模塊,否則不執行這些模塊.
圖3為一種應用于基于FPGA的卷積神經網絡加速器的指令集邏輯架構.FPGA通過調整內部邏輯運行來實現各種功能,指令集由FPGA內部邏輯實現和控制.指令集架構由指令寄存器、指令解釋器、指令轉發模塊、內存管理單元、和多個執行模塊構成.指令解釋器通過調配各個部分交替運行來實現指令的翻譯及分發工作,從而實現調用不同的模塊實現不同的功能,如圖4所示.

圖3 一種應用于基于FPGA的卷積神經網絡加速器的指令集邏輯架構Fig.3 Application of special command set in neural network accelerator based on FPGA

圖4 指令集架構框架Fig.4 The framework of VLIW
1.2.1 指令寄存器
指令寄存器是通過例化FPGA內部的嵌入式塊RAM而形成的指令存儲單元,指令順序存放于指令寄存器中,上一條指令執行完時根據執行解釋器是否收到完成信號來判斷可否從指令寄存器中順序取下一條指令.
1.2.2 指令解釋器
指令解釋器與指令寄存器和指令轉發模塊直接交互,是整個指令集架構的核心.從指令寄存器中取出指令被拆分并送往指令拆分解釋器的不同單元,即訪存指令送往訪存指令處理單元,運算指令被送往運算指令處理單元.
訪存指令處理單元將解釋的訪存指令送往內存管理單元,由內存管理單元對片上或外存數據進行讀寫操作,由于一條指令中有多個訪存指令,因此內存管理單元執行順序為訪存指令處理單元解釋先后順序.運算指令處理單元將解釋的運算指令送往指令轉發單元,由指令轉發單元調配各個執行模塊工作.
1.2.3 指令轉發模塊
由于每個執行模塊和指令解釋器都是獨立交互,因此指令轉發單元存在于每一個指令模塊和指令解釋模塊之間,負責轉發兩者之間的握手信號及運算指令,三者的工作模式采用idledonefinish方式,如圖5所示.

圖5 Idledonefinish工作模式Fig.5 Idledonefinish working modes
圖5所示的工作流程如下:
(1)執行模塊處于空閑狀態且運算指令解釋完畢,此時模塊處于idle狀態,為可接受指令狀態.
(2)指令解釋模塊發送計算指令并由指令轉發模塊轉發到執行模塊,執行模塊接受到指令開始運行并跳出idle狀態,并在指令執行完畢后向指令轉發模塊發送done信號.
(3)指令轉發模塊收到done信號并轉發給指令解釋器,指令解釋器收到done信號并發送done_ack信號.
(4)指令解釋器接收到done_ack信號并轉發給指令轉發模塊,指令執行模塊接收done_ack后發出finish信號,通知指令解釋器功能已全部執行完畢.
(5)指令轉發模塊收到finish信號轉發到指令解釋器,指令解釋器接受finish后發出finish_ack并于指令轉發模塊轉發到執行模塊,執行模塊在接收到finish_ack信號后轉為idle狀態,等待下一條指令運行.
由于運算指令幾乎同時解釋完畢并送出,各個模塊也在同一時間接收到運算指令,但由于數據流限制,每個模塊必須接收到指令并且接收到上一個模塊輸出的數據才能滿足執行的條件,可實現模塊間串行的目的.
1.2.4 內存管理單元
內存管理單元主要用于片上模塊與內存的交互,歸納來說,本設計的內存管理單元負責如下功能:
(1)將指令中地址映射為片上或片下物理地址.
(2)提供硬件機制的內存訪問授權
由于片上寄存器和DDR已經通過AXI[16]總線統一編址,因此內存管理單元可以通過AXI總線將一個內存地址搬到另一個內存地址.內存管理單元不負責將內存中的數據讀出并輸出給其它模塊,這是由于片上寄存器已經額外引出了native read port端口,其它模塊可以直接讀取其中數據.整個設計方案進行計算時,數據是已經緩存在片上RAM的,而不是直接從DDR取數參與計算的.
1.2.5 執行模塊
執行模塊是將原神經網絡不同層間相似功能單獨編寫成的一個可執行塊,在每層運行時只需實例化便可,采用模塊化的方式,可以大大減少開發的時間和消耗的資源.
指令流水線由取指、譯碼、執行、寫回、取下一條指令五部分組成,如圖6所示.

圖6 指令流水線Fig.6 Instruction pipeline
圖6所示的工作流程如下:
(1)取指階段:根據指令解釋器中計數器的值從指令寄存器對應位置取出指令并送往指令解釋器.
(2)譯碼階段:指令解釋器將取出的指令拆分并根據指令類型分發到不同執行模塊.
(3)執行階段:各個執行模塊接收到解釋完的指令并等待上一個模塊數據,接收到數據后模塊運行.
(4)寫回階段:所有計算模塊運行完后的數據送入寫回模塊,寫回模塊在指令的調度下執行寫回操作,將計算結果寫回片上或者外存.
(5)取下一條指令:每一個執行模塊工作完畢向指令解釋模塊返回finish信號,當指令解釋模塊收到所有模塊finish時,指令解釋模塊中計數器加一,取下一條指令.
以用于目標檢測的YOLOV3-Tiny網絡模型為例,其網絡結構如圖7所示,YOLOV3-Tiny共有23層網絡層,其中16和23層為YOLO層,其他層為conv(卷積)、pool(池化)和upsample(上采樣),其網絡在YOLOV3網絡的基礎上去掉了一些特征層,只保留了兩個獨立的預測分支,相較于YOLOV3網絡,YOLOV3-Tiny在損失可接受精度的情況下,檢測速度得到提升.
該神經網絡模型在FPGA上實現主要操作為Convolution(卷積),Pooling(池化),Upsample (上采樣).各主要操作如表1所示.其中可以看出卷積操作次數最多,而利用FPGA進行算法加速,最為重要就是利用FPGA的計算資源并行化計算多通道卷積.目前FPGA內部都包含了大量DSP硬核資源(在一個指令周期內可完成一次乘法和一次加法的芯片),利用DSP陣列可以高速并行計算卷積的乘加操作.
在使用FPGA平臺實現該神經網絡模型加速時,采用平鋪式設計方案需要實例化大量的計算資源和存儲資源,而采用指令集架構可通過不同的指令選擇執行模塊是否工作,使用這種方式可以很大程度下復用各個執行模塊,降低片上資源的使用.

圖7 YOLOV3-Tiny網絡結構Fig.7 YOLOV3-Tiny network

表1 YOLOV3-Tiny網絡主要操作Tab.1 YOLOV3-Tiny network main operation
本文以卷積層操作使用16*32的高速DSP陣列實現為例,采用16bit量化和指令控制式加速方案在Xilinx XCVU9P FPGA使用的主要片上資源如表2而所示.根據實例化執行模塊個數,本文估算了平鋪式加速方案的資源消耗如表2所示,兩種方案的資源消耗對比如圖8所示(為了對比清晰,LUT、LUTRAM、FF資源數量縮小了100倍).
可以看出,使用平鋪式設計方案會消耗大量片上資源,甚至對于復雜網絡模型單一FPGA的資源無法滿足設計需求,且數據流相對固定,不能靈活的適應不同的網絡模型,而采用指令控制的方案可以不僅提高了模塊的復用性,可通過修改指令的方式靈活適應各種網絡模型,且可以節省50%片上資源,實現神經網絡算法在FPGA上低功耗的加速.
精度檢測采用的數據集為SAR圖像船舶檢測數據集,數據集來源于102張Gaofen-3 圖片和108張Sentinel-1圖片,含有43819張船舶切片,包含的船舶數目為59535,所有切片尺寸固定,為256*256,三通道,24位圖像深度,標注文件提供相應圖像的長寬尺寸、標注目標的類別以及標注矩形框的位置.
平鋪式的YOLOV3-Tiny網絡AP(平均正確率)為0.8,而指令控制式的YOLOV3-Tiny網絡AP(平均正確率)為0.78,在沒有精度損失的情況下,在相同的硬件環境中,指令控制式網絡的GOPs為傳統平鋪式網絡的4倍.

表2 兩種方案使用資源情況Tab.2 Resource usage

圖8 資源消耗對比圖Fig.8 Comparison chart of resource consumption
為應對在基于FPGA的神經網絡加速器的硬件結構設計中,片上資源消耗大、各執行模塊耦合性高等問題,本文設計實現了一套專用指令集.在硬件條件相同情況下,相較傳統平鋪式方案,應用該指令集的方案可使GOPs提升4倍,資源消耗降低50%,驗證了專用指令集可降低各執行模塊之間的耦合性,并能切實減少在神經網絡硬件加速結構設計時FPGA片上資源的使用.