秦東輝 周 輝 趙雄波 柳 柱
1.北京航天自動控制研究所,北京100854 2.宇航智能控制技術國家級重點實驗室,北京100854
隨著計算機性能的不斷提升,以及學術界對機器學習領域研究的逐漸深入,卷積神經網絡(convolutional neural network,CNN)成為了近年以來熱門的機器學習算法之一,1989年LeCun在論述其網絡結構時首次使用了“卷積”一詞[1],“卷積神經網絡”也因此得名。CNN通過卷積和池化操作自動學習圖像在各個層次上的特征,這符合我們理解圖像的常識。人在認知圖像時是分層抽象的,首先理解的是顏色和亮度,然后是邊緣、角點、直線等局部細節特征,接下來是紋理、幾何形狀等更復雜的信息和結構,最后形成整個物體的概念[2]。CNN在早期被成功應用于手寫字符圖像識別。2012年更深層次的AlexNet網絡[3]取得成功,此后卷積神經網絡蓬勃發展,CNN在數字圖像處理領域取得了巨大的成功,從而掀起了深度學習在自然語言處理領域(Natural Language Processing, NLP)的狂潮,近年來卷積神經網絡,在視頻監控,機器視覺,模式識別,圖像搜索等領域得到了更為廣泛的應用[4-6]。
由于CNN中特定的計算方法,在通用處理器上運算效率較低,很難達到滿意的性能。事實上,CNN作為一種前饋網絡結構,層與層之間具有高度的獨立性:各層網絡計算獨立,層間無數據反饋。因此,CNN是一種高度并行的網絡結構,通用處理器為執行邏輯處理和事務處理而優化的特性并不適合用來挖掘CNN的并行性,基于軟件方式的CNN神經網絡在實時性和功耗方面都不能滿足實際應用中小型化、手持化的需求。當前的卷積神經網絡加速器研究主要是基于GPU,但由于GPU本身的高功耗問題,并不適合電池供電的嵌入式環境[7]。為了充分挖掘卷積神經網絡固有的可并行性,越來越多研究人員開始采用FPGA開發基于卷積神經網絡的應用,以獲得功耗和計算性能的最佳平衡。文獻[8-10]通過RTL語言完成了小型CNN網絡的硬件加速工作,使用FPGA在50~100Mhz的頻率下完成了約十余倍的性能提升,但是設計基于RTL級的FPGA加速器開發周期較長,尤其隨著近年來提出的新算法網絡逐漸加深,沿用傳統RTL語言進行加速的成本成倍增加,而使用高層次綜合(HLS)技術可以解決這些問題[11],通過HLS編譯器會自動將高級語言(如C / C ++)轉換為RTL級代碼,可以以較少的時間和成本設計硬件加速器,而由于軟硬件工作原理的區別,往往需要對C代碼進行一定的重構,例如,在本工程中,由于卷積操作對數據讀后寫(RAW)的依賴性,直接對算法進行硬件加速無法滿足期望的性能。本文采用重構算法循環次序的方案解決了RAW依賴問題,并且設計了內存I/O的優化方法及參數化的并行指令以滿足期望的性能。
本文使用了Hironsan于2016年提出的SensorNet,該卷積神經網絡結構如圖1所示,算法網絡由3個卷積層(Conv),3個池化層(Pool),1個維度轉化層(Flatten)層,1個全連接層(FC)組成,激勵層(Activation)均采用Relu函數。圖像經縮放處理至64*64*3像素,經該神經網絡計算后,輸出多個分類數值,通過SoftMax層確定識別概率,分類標簽的數量可根據訓練集不同進行配置,在本文中分類標簽數量為6,各層參數及計算量見表1。

圖1 圖像識別算法網絡結構
使用的片上系統(SoC)平臺包括Block RAM(BRAM),查找表(LUT),觸發器(FF)和數字信號處理器,稱為可編程邏輯(PL)以及基于四核ARM處理器的處理系統(PS),軟硬件功能劃分見圖2,網絡的卷積層、池化層、全連接層均使用SDSoC添加至FPGA中進行加速,ARM處理器包含預處理模塊和數據整理模塊,前者負責從SD卡讀取圖像、標簽、權重等數據,對數據進行預處理,并完成數據對PL端的寫入工作,后者整理PL端各層硬件計算時間,接收分類結果、計算標簽匹配數量,并將數據整合為報告寫入SD卡,實現了通過PS端對PL端的控制。

圖2 軟硬件結構劃分
FPGA在訪問外部存儲器時會有較大的延時,使用不合理的數據傳輸方法會對算法的性能造成較大影響。以卷積層為例,本文在PS 端和PL端使用流數據傳輸來減少延時。數據加載部分的相關編譯指令如下:

#pragma SDS data mem_attribute(input_feature:PHYSICAL_CONTIGUOU)#pragma SDS data access_pattern(input_feature:SEQUENTIAL)#pragma SDS data zero_copy(input_feature)
SDS Data mem_attribute指令用于規定SDSoC編譯器在內存塊里為數組分配的存儲空間是物理上連續的。那么,SDSoC編譯器會在綜合中選擇AXI_DMA_Simple而不是AXI_DMA_SG,因為前者在傳輸物理上連續的內存時更小更快。
SDS data access_pattern用于規定數據訪問模式,因為卷積輸入中所有元素為流式訪問,而不是隨機訪問,如果訪問模式設置為SEQUENTIAL,則將生成流接口(例如ap_fifo)。否則,使用RANDOM訪問模式,將會生成一個RAM接口。
SDS data ZERO_COPY編譯指示意味著硬件通過AXI主總線接口直接從共享存儲器訪問數據。
同時使用上述3條編譯指示,可令編譯器使用在內存中連續分配存儲空間,并為參數合成AXI Master接口,減少數據傳輸延遲,提高處理性能,在本文中,輸入輸出圖像及權重偏置信息均通過此方式加載。
通過創建多組硬件邏輯的方式對算法中的循環進行展開。在本文中,改善卷積層的性能使用下述代碼的結構。將Input channel循環(第10行)完全展開,并行計算所有輸入層的權重乘積,作為一個獨立的處理單元(PE),將output channel(第7行)展開作為PE的并行數量,用來一次獲得多個輸出層的部分和,并且使用input channel作為最內層循環來簡化卷積層的硬件結構,以最小化單個PE核。
通過使用#pragma pipelining向硬件邏輯添加流水線功能以增加硬件吞吐量。某些循環疊放順序將會使多個操作同時嘗試訪問和更新同一個變量,從而產生RAW依賴關系,例如將kernel row或kernel col循環(第3,4行)位于output channel的正上方,則會對循環累加結果產生RAW依賴,使流水線啟動間隔(initiation interval)偏高,影響綜合性能。故如代碼段所示使用output col(第6行)作為output channel(第7行)正上方的循環,以消除輸出緩沖區的RAW依賴性。
將kernel row與kernel col作為外層循環,在卷積神經網絡的每個卷積層計算中不反復更新權重和偏置數據。在本文中,通過一次性將權重和偏置傳輸到片上緩沖區,用減少外部存儲器和PL之間的數據傳輸開銷來提高性能。

1: //load input feature map to on-chip buffer2://load weight & bias to on-chip buffer at 1st iteration3:for(i=0;i 采用設置中間變量的方式防止流水線出現RAW依賴(第7~10行),拆解語句使2*2最大池化塊通過3次二值比較的方式并行執行的方式(第11~13行),并在內層循環加入#pragma pipeline指令,使循環流水線展開,未添加流水線及添加流水線但啟動間隔不同的時序如圖3所示: 圖3 流水線指令展開 1://load conv_output data to on-chip buffer2:for(int ci=0;ci 在硬件實現中通過改變Input數組維度直接完成Flatten層的排列,其余部分優化方式與卷積層相似,在此不再贅述。 圖4 Flatten數組維度變化 我們使用Xilinx ZCU102嵌入式開發平臺以人臉識別為例進行實驗,ZCU102 PL端搭載了Zynq Ultra Scale XCZU9EG-2FFVB1156FPGA芯片,PS端為四核 ARM? Cortex-A53,數據為單精度浮點。ARM Cortex-A53的工作頻率為1200MHz,PL端的工作頻率為300MHz。使用視頻攝像頭采集到有標簽的5個人物各1000張照片、未添加標簽的其他人物1000張,共6000張照片,經過OpenCV截取人臉部分并縮放為64*64*3像素送至網絡進行訓練。另外,使用10組帶有標簽的照片,每組100張,共1000張測試該網絡的性能及準確率。 性能測試時,進行了6組實驗:使用單核ARM Cortex-A53處理方案;PL端頻率為300MHz,并行計算單元數量PE=2/4/8三組帶有時間信息返回的軟硬件協同方案;以及300MHz下PE=4/8,硬件加速單元整合為單一函數,且不帶有時間返回的2組軟硬件協同方案進行加速比較。從PL端逐層返回計算中間結果和時間信息會對各層性能產生一定影響。網絡各層運算速度統計及加速比見表2。 Zynq Ultra Scale XCZU9EG計算資源豐富,包 括:18K大小的Block RAM 1824個,查找表(LUT)274080個,觸發器(FF)548160個和數字信號處理器2520個。5組進行硬件加速的實驗資源使用情況如表3所示: 表3 不同參數配置下硬件資源使用情況 表2 不同參數配置下的網絡性能(單位:ms/百張) 實驗結果表明,各組軟硬件協同設計方案(2~6組)功率相似,故僅對第1組Cortex-A53軟件實現方案與第6組協同設計方案進行功率與功耗性能分析。 圖4 各負載下開發板平均功率(單位:W) 圖5 每百張圖片開發板功耗(單位:J) 使用SDSoC對一種基于卷積神經網絡的人臉識別算法的所有網絡層進行了硬件加速設計,通過對PE單元并行化設計和存儲器的I/O優化,提高了計算性能減小了外部存儲器的訪問。實驗結果表明,提出的軟硬件協同設計方案的性能遠高于單獨使用ARM Cortex-A53軟件設計方案,在精度一致的情況下,加速比可達143,節約了88倍功耗。2.4 池化層優化


2.5 全連接層優化

3 實驗結果分析
3.1 網絡加速性能比較
3.2 硬件資源使用情況


3.3 功耗性能比較


4 結論