張志超 王 劍 章隆兵 肖俊華
(*計(jì)算機(jī)體系結(jié)構(gòu)國家重點(diǎn)實(shí)驗(yàn)室(中國科學(xué)院計(jì)算技術(shù)研究所) 北京 100190)
(**中國科學(xué)院計(jì)算技術(shù)研究所 北京 100190)
(***中國科學(xué)院大學(xué) 北京 100049)
(****中國電子科技集團(tuán)公司第十五研究所 北京 100083)
以卷積神經(jīng)網(wǎng)絡(luò)(convolution neural network,CNN)為代表的深度學(xué)習(xí)技術(shù)廣泛應(yīng)用于圖像分類、目標(biāo)檢測等應(yīng)用中。遙感影像領(lǐng)域目標(biāo)檢測與識別應(yīng)用也廣泛應(yīng)用卷積神經(jīng)網(wǎng)絡(luò)技術(shù)。近年來深度學(xué)習(xí)的發(fā)展經(jīng)歷了由小模型[1]到大模型[2-3]、再由大模型到輕量型模型[4-6]的發(fā)展。然而深度卷積神經(jīng)網(wǎng)絡(luò)算法存在計(jì)算復(fù)雜度高、參數(shù)存儲量大等特點(diǎn),導(dǎo)致其在星載、機(jī)載等功耗受限環(huán)境下進(jìn)行目標(biāo)檢測處理運(yùn)算時(shí)間長、功耗大等問題,并且面向領(lǐng)域應(yīng)用的算法需要較高的目標(biāo)檢測準(zhǔn)確率。現(xiàn)有的卷積神經(jīng)網(wǎng)絡(luò)的加速研究包括參數(shù)量化[7-10]、輕量型網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)[4-6]、硬件結(jié)構(gòu)設(shè)計(jì)[11-12]等方法。
基于輕量型網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)[4-6]的方法展現(xiàn)了較高的準(zhǔn)確率,在嵌入式處理器上能夠達(dá)到近實(shí)時(shí)的處理性能,在圖形處理器(graphics processing unit,GPU)平臺處理性能高但功耗大。在星載、機(jī)載等數(shù)據(jù)產(chǎn)生終端,存在數(shù)據(jù)量大、平臺處理功耗受限等情況,需要結(jié)合現(xiàn)場可編程門陣列(field programmable gate array,FPGA)方法進(jìn)行浮點(diǎn)精度模型加速設(shè)計(jì),提升處理能力。
一般的目標(biāo)檢測模型采用浮點(diǎn)訓(xùn)練推理的方式使用,參數(shù)量化[7-9]的方法存在精度降低問題,需要特定的硬件結(jié)構(gòu)支撐量化計(jì)算來提升性能,并且對于緊湊小模型的量化收效甚微[10]。通用的基于FPGA 加速浮點(diǎn)CNN 模型[11,13]受限于通用模型復(fù)雜度高,基于乘累加的卷積計(jì)算方法存在達(dá)不到線速吞吐問題,造成加速效果有限,需要突破浮點(diǎn)乘累加造成的線速吞吐瓶頸,提升CNN 加速處理能力。
本文在研究了大量CNN 加速方法后,針對遙感影像廣域場景篩選機(jī)場目標(biāo)區(qū)域的垂直應(yīng)用需求,采取面向領(lǐng)域應(yīng)用定制輕量化CNN 目標(biāo)檢測模型,結(jié)合基于數(shù)據(jù)流調(diào)度的FPGA 加速浮點(diǎn)卷積神經(jīng)網(wǎng)絡(luò)的方法以及基于乘法矩陣與前向加法鏈的卷積計(jì)算陣列設(shè)計(jì),構(gòu)建軟硬件CNN 模型一致性的加速方案,解決了卷積計(jì)算中浮點(diǎn)加速線速吞吐的問題,達(dá)到了功耗受限條件下實(shí)時(shí)計(jì)算的需求,符合應(yīng)用要求的高準(zhǔn)確率,并且使得軟硬件開發(fā)去耦合,軟件人員能夠進(jìn)一步優(yōu)化模型以及研究模型的認(rèn)知不確定性[14]等問題,以提供更可信任的深度學(xué)習(xí)模型。
針對星載、機(jī)載等功耗受限數(shù)據(jù)產(chǎn)生終端進(jìn)行遙感影像機(jī)場目標(biāo)檢測的垂直應(yīng)用需求,需要在大尺度區(qū)域中選出感興趣區(qū)域?qū)δ繕?biāo)進(jìn)行識別,這種熱點(diǎn)區(qū)域的識別能夠顯著降低細(xì)粒度目標(biāo)識別的尺度范圍,進(jìn)一步縮小目標(biāo)識別的運(yùn)算開銷。面向機(jī)場目標(biāo)檢測的卷積網(wǎng)絡(luò)模型,采用基于LeNet-5[1]與Yolo-v2[15]啟發(fā)的網(wǎng)絡(luò)骨干結(jié)構(gòu)及目標(biāo)檢測策略設(shè)計(jì)目標(biāo)檢測網(wǎng)絡(luò)模型,利用當(dāng)前的小卷積核緊致模型的運(yùn)算量低的特點(diǎn),在解決目標(biāo)檢測識別準(zhǔn)確率基礎(chǔ)上,盡可能設(shè)計(jì)小的卷積網(wǎng)絡(luò)降低模型計(jì)算量需求,便于后續(xù)的基于FPGA 的處理加速。
針對從大區(qū)域遙感影像中篩選機(jī)場目標(biāo)區(qū)域的技術(shù)需求,分析出機(jī)場目標(biāo)于周圍環(huán)境特征明顯,該問題類似于MNIST 手寫數(shù)字識別問題。本文受LeNet-5 模型和Yolo-v2 目標(biāo)檢測模型的啟發(fā),自定義了一個(gè)10 層的輕量型目標(biāo)識別網(wǎng)絡(luò)用于篩選機(jī)場區(qū)域目標(biāo),進(jìn)而降低大區(qū)域衛(wèi)星影像中飛機(jī)目標(biāo)識別的計(jì)算量。該目標(biāo)識別網(wǎng)絡(luò)的檢測層利用了Yolo-v2 的候選款篩選算法,將這10 層卷積的輕量型命名為Conv10_Yolo。該目標(biāo)區(qū)域篩選算法的網(wǎng)絡(luò)結(jié)構(gòu)如圖1 所示,里面包含10 層卷積層和2 層池化層,該卷積網(wǎng)絡(luò)的輸入為128 ×128 像素的3 通道衛(wèi)星影像,輸出為4 ×4 ×30 維的目標(biāo)檢測向量。
圖1 基于CNN 的目標(biāo)區(qū)域選擇算法網(wǎng)絡(luò)結(jié)構(gòu)
具體的Conv10_Yolo 每層的卷積或池化參數(shù)配置如表1 所示,初始選用大卷積(4 ×4)來提取特征,利用卷積的步進(jìn)降低輸出維度,中間層主要采用2 ×2 卷積以及3 ×3 卷積進(jìn)行特征提取,后續(xù)層主要采用1 ×1 卷積與2 ×2 卷積進(jìn)行特征提取,檢測輸出層采用1 ×1 卷積輸出檢測目標(biāo)屬性信息。
表1 基于CNN 的目標(biāo)區(qū)域選擇算法網(wǎng)絡(luò)結(jié)構(gòu)
目標(biāo)檢測層采用1 ×1 卷積實(shí)現(xiàn),輸出維度為4×4 ×30 的檢測向量。該檢測層參考了Yolo-v2 的相對坐標(biāo)檢測思路,包含5 個(gè)候選框,每個(gè)候選款包含6 個(gè)目標(biāo)屬性,具體如圖2 所示。該檢測層輸出的坐標(biāo)為預(yù)測的候選款相對中心點(diǎn)坐標(biāo),具體坐標(biāo)解算參考Yolo-v2 的坐標(biāo)解算。候選框的預(yù)設(shè)值采用KNN 聚類方法,對訓(xùn)練數(shù)據(jù)中目標(biāo)尺寸太小的進(jìn)行維度聚類得到候選框的預(yù)設(shè)值,具體值為[1.13,1.92,1.70,2.04,1.99,0.98,2.28,1.73,2.70,2.69],共5 組x、y坐標(biāo)值。目標(biāo)檢測層卷積輸出為相對于候選框的偏移量,目標(biāo)框的解算按照Yolo-v2的解算思路進(jìn)行計(jì)算。
圖2 檢測層輸出向量維度分解
該部分分析面向目標(biāo)區(qū)域篩選的卷積神經(jīng)網(wǎng)絡(luò)快速識別算法的卷積網(wǎng)絡(luò)模型參數(shù)與計(jì)算復(fù)雜度。
通用的卷積參數(shù)計(jì)算如式(1)所示。
其中,IC(input channel)為輸入通道大小,OC(output channel)為輸出通道大小,k為卷積核尺寸。
卷積層計(jì)算乘累加數(shù)量如式(2)所示。
其中,OW(output width)為卷積計(jì)算輸出寬度,OH(output height)為卷積計(jì)算輸出高度。
卷積層計(jì)算的操作數(shù)通常有GOPs指標(biāo),該指標(biāo)將卷積乘法和加法分開計(jì)算,通常一個(gè)包含bias的卷積計(jì)算加法數(shù)量與乘法數(shù)量一致,具體如式(3)所示。
通過計(jì)算得出,該模型的權(quán)重總大小為1.85 MB,總乘累加操作數(shù)為0.044 GMAC,總卷積計(jì)算操作數(shù)為0.088 GOPs。由此可見,該檢測模型為一個(gè)深層輕量化的目標(biāo)檢測網(wǎng)絡(luò),適于在FPGA 上實(shí)現(xiàn)全浮點(diǎn)精度的卷積網(wǎng)絡(luò)運(yùn)算加速。
在FPGA 上加速目標(biāo)檢測模型,需要解決模型一致性問題,降低應(yīng)用移植的難度,保持模型檢測準(zhǔn)確率的一致性。采用基于數(shù)據(jù)流調(diào)度的浮點(diǎn)卷積神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)方法,使得卷積網(wǎng)絡(luò)的浮點(diǎn)參數(shù)權(quán)重保持在片上存儲,多層卷積網(wǎng)絡(luò)計(jì)算同時(shí)以流水線的方式在片上執(zhí)行,即解決了模型加速與能效比問題,又能符合加速模型與原始模型計(jì)算一致性的需求。
針對基于卷積神經(jīng)網(wǎng)絡(luò)的目標(biāo)區(qū)域篩選算法,設(shè)計(jì)基于數(shù)據(jù)流計(jì)算的卷積神經(jīng)網(wǎng)絡(luò)加速器。Xilinx UltraScale+系列新品的內(nèi)部物理結(jié)構(gòu)分布為3個(gè)超級邏輯區(qū)(super logic region,SLR),每個(gè)邏輯區(qū)覆蓋芯片內(nèi)部的一個(gè)Die,整顆芯片由3 顆Die 通過基底層互聯(lián)。
考慮邏輯分區(qū)問題,將整個(gè)數(shù)據(jù)流計(jì)算分為3大塊。第1 塊超級邏輯區(qū)(SLR0)覆蓋卷積網(wǎng)絡(luò)的前3 層卷積層計(jì)算,即Conv1、Conv2、Conv3 的計(jì)算;第2 塊超級邏輯區(qū)(SLR1)覆蓋中間3 層卷積層計(jì)算和2 層最大池化層計(jì)算,即Conv4、Mp4、Conv5、Mp5、Conv6 的計(jì)算;第3 塊超級邏輯區(qū)(SLR2)覆蓋后4 層卷積層計(jì)算,即Conv7、Conv8、Conv9 以及Conv10 的計(jì)算。
超級邏輯區(qū)之間通過Xilinx 堆疊硅片互聯(lián)(stacked silicon interconnect,SSI)技術(shù)互聯(lián),在超級邏輯區(qū)邊緣有特定的專用寄存器進(jìn)行跨邏輯區(qū)通信,基底層有超長線(super long line,SLL)來連接專用傳輸寄存器。超級邏輯區(qū)的內(nèi)部訪存和跨邏輯區(qū)通信需求,均通過SLL 互聯(lián)實(shí)現(xiàn)。具體的基于數(shù)據(jù)流計(jì)算的卷積神經(jīng)網(wǎng)絡(luò)加速總體架構(gòu)如圖3 所示。
圖3 基于數(shù)據(jù)流計(jì)算的CNN 加速總體架構(gòu)
通常的卷積層計(jì)算由卷積乘加計(jì)算、批歸一化處理以及非線性響應(yīng)等部分組成。在基于FPGA 的卷積加速設(shè)計(jì)中,設(shè)計(jì)一個(gè)大的卷積乘加矩陣是卷積計(jì)算性能的必要條件。在沒有硬核浮點(diǎn)支持的FPGA 中,如何設(shè)計(jì)一個(gè)保持線速處理的乘加矩陣也是一個(gè)難點(diǎn)。在基于數(shù)據(jù)流的FPGA 卷積計(jì)算單元里,卷積層的輸入調(diào)度、權(quán)重調(diào)度也必須達(dá)到卷積計(jì)算矩陣的線速輸入條件,這樣才能避免卷積計(jì)算矩陣空轉(zhuǎn),浪費(fèi)計(jì)算性能。本部分闡述基于數(shù)據(jù)流的卷積層計(jì)算,主要包括卷積層權(quán)重輸入、權(quán)重緩存、卷積輸入調(diào)度、卷積計(jì)算陣列、批歸一化處理、非線性響應(yīng)等部分。具體的基于數(shù)據(jù)流的卷積層初始化與計(jì)算流程如圖4 所示,其中權(quán)重初始化只在權(quán)重緩存初始化的時(shí)候運(yùn)行一次,后續(xù)的卷積計(jì)算不再需要從動態(tài)隨機(jī)存取存儲器(dynamic random access memory,DRAM)中調(diào)度緩存數(shù)據(jù),降低了存儲帶寬的開銷,可避免卷積計(jì)算陣列需要等待權(quán)重?cái)?shù)據(jù)。
圖4 卷積層初始化與計(jì)算流程
(1)卷積特征圖內(nèi)存表示
卷積輸入及輸出特征圖在內(nèi)存中維持“H×W×C”的內(nèi)存分布,卷積輸入及輸出特征圖在數(shù)據(jù)流中按照“H×W×C”的方式傳輸,即通道優(yōu)先(channel first)的方式傳輸。圖像與特征圖本質(zhì)上是一個(gè)三維矩陣,圖像一般具有RGB三維通道,特征圖的通道數(shù)為16~2048,如果把圖像或者特征圖的通道數(shù)看成一個(gè)像素點(diǎn)的屬性,則圖像的抽象表示可以維持一個(gè)“二維抽象”,具備寬×高的像素點(diǎn)集合,像素的屬性個(gè)數(shù)是可變的。后面的卷積計(jì)算就可以基于像素處理,圖像或者特征圖可以抽象為一個(gè)二維的處理過程。
進(jìn)一步把圖像或者特征圖的“H×W”個(gè)像素平鋪,則圖像或者特征圖可以進(jìn)一步維持一個(gè)“一維抽象”,即“H×W”行像素點(diǎn),這種表示不僅適合內(nèi)存的線性存儲,也適用于在數(shù)據(jù)流中傳輸圖像或者特征圖。具體的輸入圖像與特征圖的內(nèi)存表示如圖5所示。
圖5 卷積層輸入圖像與特征圖的內(nèi)存表示
后續(xù)的計(jì)算流程在輸入輸出上都維持這樣的“H×W×C”的內(nèi)存表示?;诮y(tǒng)一的內(nèi)存表示,多個(gè)卷積層計(jì)算可以通過先入先出隊(duì)列(first input first output,FIFO)互聯(lián)并協(xié)同計(jì)算,避免中間結(jié)果經(jīng)由內(nèi)存導(dǎo)入導(dǎo)出,消耗內(nèi)存帶寬,同時(shí)也浪費(fèi)一定量的卷積層計(jì)算周期。
(2)卷積層數(shù)據(jù)流調(diào)度
基于數(shù)據(jù)流的卷積計(jì)算要求輸入數(shù)據(jù)及權(quán)重都能夠達(dá)到線速吞吐,這樣卷積計(jì)算單元的流水周期不會出現(xiàn)空轉(zhuǎn),計(jì)算效率達(dá)到最高?;诰€速吞吐的數(shù)據(jù)流調(diào)度要求,設(shè)計(jì)多端口的權(quán)重緩存,能夠提供處理單元(process element,PE)組權(quán)重,每組權(quán)重有單指令多數(shù)據(jù)(single instruction multiple data,SIMD)個(gè)權(quán)重32 位浮點(diǎn)數(shù);設(shè)計(jì)多端口卷積輸入緩存,能夠提供SIMD個(gè)32 位浮點(diǎn)數(shù)特征圖輸入;同時(shí)引入與卷積輸入緩存Stride(卷積滑窗步進(jìn))行同等大小的輸入FIFO,與卷積輸入緩存構(gòu)成異構(gòu)“乒乓”緩存,去耦合上個(gè)階段的卷積計(jì)算輸出調(diào)度和本階段的卷積計(jì)算輸入調(diào)度。輸入特征圖的輸入寬度為上一層PE個(gè)數(shù)量的32 位浮點(diǎn)數(shù),通過輸入FIFO 轉(zhuǎn)換寬度為SIMD個(gè)32 位浮點(diǎn)數(shù)據(jù)。卷積計(jì)算單元的輸出為PE個(gè)32 位浮點(diǎn)數(shù)據(jù)計(jì)算輸出。具體的卷積層數(shù)據(jù)流調(diào)度如圖6 所示,實(shí)現(xiàn)了一組數(shù)據(jù)計(jì)算多個(gè)卷積輸出,利用了輸入數(shù)據(jù)的局部性。
圖6 卷積層數(shù)據(jù)流調(diào)度
(3)卷積層輸入緩存設(shè)計(jì)
卷積層輸入緩存與輸入FIFO 的大小一致,結(jié)構(gòu)不同,卷積層輸入緩存將“H×W×C”的輸入特征圖轉(zhuǎn)換為卷積核所需的“k×k×C”的輸入,通過在多組寄存器滑窗,為卷積計(jì)算陣列提供計(jì)算卷積所需的線性輸入。具體的卷積輸入緩存設(shè)計(jì)如圖7 所示。
圖7 卷積層輸入緩存設(shè)計(jì)
卷積層輸入緩存包括k+Stride行寄存器組,其中k為卷積核大小,Stride為卷積滑窗的步進(jìn)大小。每行寄存器緩存輸入特征圖多個(gè)通道一行的數(shù)據(jù),即“W×C”個(gè)數(shù)據(jù),W為輸入特征圖的寬度,IC為輸入特征圖的通道數(shù)。每個(gè)寄存器行都可以按照SIMD個(gè)浮點(diǎn)數(shù)的寬度輸出數(shù)據(jù),一個(gè)像素的多個(gè)通道數(shù)據(jù)按照SIMD的寬度分為b個(gè)Block,每個(gè)Block 按照順序放在寄存器行里。由于二維卷積的空間訪存特性,需要從多個(gè)寄存器行里順序讀取數(shù)據(jù),按照卷積核行列計(jì)算的要求順序輸出SIMD寬度的輸入特征圖數(shù)據(jù)流。
多個(gè)寄存器組分開存放,可以將卷積輸入特征圖的輸出調(diào)度和輸入調(diào)度分開,除了初始化讀入k行輸入特征圖像素,后續(xù)可以按照Stride行補(bǔ)充輸入特征圖數(shù)據(jù)。雖然訪問的同一個(gè)卷積輸入緩存,利用多行卷積輸入緩存寄存器,由此可以將輸入數(shù)據(jù)與輸出數(shù)據(jù)調(diào)取去耦合,避免數(shù)據(jù)依賴和數(shù)據(jù)污染,實(shí)現(xiàn)無鎖的數(shù)據(jù)輸入輸出同時(shí)調(diào)度,滿足卷積計(jì)算單元SIMD個(gè)浮點(diǎn)數(shù)據(jù)的輸出線速調(diào)度要求。
(4)卷積層權(quán)重緩存設(shè)計(jì)
針對在片上緩存該層卷積計(jì)算所需的全部卷積,并且權(quán)重緩存的輸出能按照卷積計(jì)算陣列“PE×SIMD”的計(jì)算模式輸出面向多個(gè)處理單元(PE)輸出每組SIMD個(gè)浮點(diǎn)權(quán)重?cái)?shù)據(jù)等要求,設(shè)計(jì)卷積層權(quán)重緩存。
卷積層參數(shù)按照式(4)維度順序進(jìn)行存放,其中PE為卷積計(jì)算單元的處理單元個(gè)數(shù),SIMD為每個(gè)卷積處理單元輸入數(shù)據(jù)的寬度,每個(gè)數(shù)據(jù)均為32位浮點(diǎn)數(shù)據(jù)。
卷積權(quán)重緩存T的計(jì)算如下:
其中,IC為卷積核輸入通道數(shù)量,OC為卷積核輸出通道數(shù)量,k為卷積核大小。
卷積層權(quán)重緩存具有PE組獨(dú)立的緩存行,每個(gè)行的輸出寬度為SIMD個(gè)浮點(diǎn)數(shù),由于卷積計(jì)算陣列的多個(gè)PE輸出為輸出特征圖的一個(gè)像素的連續(xù)屬性,故需要在權(quán)重緩存里將卷積權(quán)重按照多個(gè)PE行寄存器交叉存儲,保證輸出的PE組權(quán)重通過卷積計(jì)算陣列計(jì)算得到的是連續(xù)的輸出特征圖一個(gè)像素內(nèi)部的連續(xù)屬性值。具體的存放順序如圖8 所示。
圖8 卷積層權(quán)重緩存設(shè)計(jì)
(5)卷積陣列計(jì)算單元設(shè)計(jì)
針對卷積計(jì)算高吞吐量的計(jì)算需求,設(shè)計(jì)卷積計(jì)算陣列,每個(gè)時(shí)鐘周期能夠處理“PE×SIMD”個(gè)乘累加計(jì)算,其中PE為卷積陣列的行數(shù),SIMD為卷積輸入特征圖數(shù)據(jù)的個(gè)數(shù),輸出為PE個(gè)卷積計(jì)算輸出,PE個(gè)浮點(diǎn)數(shù)據(jù)屬于同一個(gè)輸出特征圖像素的連續(xù)屬性值。
通常卷積計(jì)算存在一個(gè)乘累加計(jì)算矩陣,基于定點(diǎn)數(shù)的累加計(jì)算,通過高級綜合工具調(diào)度出來的累加器延遲為1個(gè)clk,累加計(jì)算可以達(dá)到線速吞吐;而基于浮點(diǎn)數(shù)的累加計(jì)算,通過高級綜合工具調(diào)度出來的累加器延遲為4 個(gè)clk,吞吐達(dá)不到線速,嚴(yán)重影響整個(gè)卷積計(jì)算陣列的吞吐速率。具體的累加器性能分析如圖9 所示。
圖9 累加器性能分析
考慮浮點(diǎn)累加器調(diào)度延遲問題主要在與累加器輸出要反饋到累加器輸入上,這個(gè)延遲決定了累加器的吞吐速率,如果能夠打破累加器的后向反饋,則可以使累加器性能達(dá)到線速,進(jìn)而卷積計(jì)算陣列達(dá)到線速。
由于卷積的累加次數(shù)是固定的,且隨著每個(gè)卷積層參數(shù)而累加次數(shù)不同。基于數(shù)據(jù)流的卷積計(jì)算陣列支持面向不同的卷積層分別配置卷積計(jì)算參數(shù),包括卷積陣列大小、卷積累加的次數(shù),為此設(shè)計(jì)了一個(gè)基于前向累加鏈的卷積累加器。卷積計(jì)算單元的每個(gè)PE輸出SIMD個(gè)數(shù)據(jù),通過加法樹1 匯集成一個(gè)數(shù)據(jù)輸出,通過加法樹2、3 分別匯聚k個(gè)數(shù)累加,后續(xù)可以通過個(gè)加法器進(jìn)行后續(xù)累加(圖10)。基于前向加法鏈的卷積累加器共需N個(gè)加法器,計(jì)算公式如式(6)所示,ICF的計(jì)算公式如式(7)所示。
圖10 基于前向加法鏈的卷積累加器設(shè)計(jì)
由于累加矩陣可以在后續(xù)完成累加計(jì)算,故卷積陣列只需要實(shí)現(xiàn)為乘法陣列,具體的基于乘法矩陣與前向加法鏈的卷積計(jì)算陣列如圖11 所示,包含3 部分:(1)乘法矩陣,完成“PE×SIMD”個(gè)數(shù)的乘法運(yùn)算;(2)加法樹矩陣,將SIMD個(gè)數(shù)匯聚成一個(gè)數(shù);(3)加法鏈,完成同一個(gè)卷積計(jì)算的累加功能?;谇跋蚣臃ㄦ湹木矸e陣列設(shè)計(jì),打破了浮點(diǎn)數(shù)累加的后向反饋,不依賴于加法器的具體延遲,通過延長流水線的方式達(dá)到了卷積計(jì)算的線速累加和輸出。
圖11 基于乘法矩陣與前向加法鏈的卷積計(jì)算陣列
(6)批歸一化及非線性響應(yīng)設(shè)計(jì)
批歸一化及非線性響應(yīng)均為面向每個(gè)處理元素單獨(dú)處理,比較容易實(shí)現(xiàn)并行處理,多個(gè)并行處理之間不需要交互數(shù)據(jù),具體的批歸一化及非線性響應(yīng)設(shè)計(jì)如圖12 所示。
圖12 批歸一化與非線性響應(yīng)流程
批歸一化的計(jì)算如式(8)所示。
其中,alpha、gamma、mean以及std均為批歸一化參數(shù),可以從模型權(quán)重中獲取。
非線性響應(yīng)部分支持Leak ReLU 和ReLU 函數(shù),具體的計(jì)算公式如式(9)所示,Leak ReLU 的參數(shù)alpha一般為0.1,ReLU 的參數(shù)alpha為0。
池化層的輸入一般為上一層的卷積計(jì)算輸出,池化層的輸出為下一層卷積計(jì)算的輸入。基于數(shù)據(jù)流調(diào)度的池化層計(jì)算流程包括池化層輸入調(diào)度以及池化層計(jì)算單元兩部分。池化層計(jì)算的并行數(shù)PE與上一層卷積計(jì)算的PE保持一致。每個(gè)階段的數(shù)據(jù)流均為PE個(gè)浮點(diǎn)數(shù)據(jù)。輸入特征圖與輸出特征圖仍然維持“H×W×C”的數(shù)據(jù)抽象,便于后續(xù)通過流數(shù)據(jù)接口輸出給下一個(gè)卷積計(jì)算層。具體的池化層計(jì)算流程如圖13 所示。
圖13 池化層計(jì)算流程
(1)池化層計(jì)算單元設(shè)計(jì)
根據(jù)卷積模型計(jì)算的需要,本部分池化層的設(shè)計(jì)只支持最大值池化功能。池化層計(jì)算單元輸入為PE個(gè)卷積計(jì)算輸出,通過與池化層的中間結(jié)果寄存器進(jìn)行比較,如果比中間結(jié)果寄存器數(shù)據(jù)值大,則更新中間結(jié)果寄存器的存儲值。經(jīng)過一定次數(shù)的迭代,最終從中間結(jié)果寄存器輸出到輸出寄存器。具體的池化層計(jì)算單元如圖14 所示。
圖14 池化層計(jì)算單元
(2)池化層中間結(jié)果緩存設(shè)計(jì)
池化層中間結(jié)果緩存面向池化層的數(shù)據(jù)調(diào)度和中間結(jié)果緩存以及最終的池化輸出,需要設(shè)計(jì)一個(gè)面向輸入數(shù)據(jù)流的池化計(jì)算緩存。輸出調(diào)度不能中斷池化單元的正常計(jì)算流程,并且輸入與輸出同時(shí)維持統(tǒng)一的特征圖數(shù)據(jù)流格式。
池化計(jì)算一般為“k×k”的二維計(jì)算,而輸入特征圖數(shù)據(jù)是按照“H×W×C”的統(tǒng)一數(shù)據(jù)流格式輸出的,這就需要設(shè)計(jì)一個(gè)多行緩存,能夠無縫切換不同行的池化計(jì)算中間結(jié)果,且無需更改輸入數(shù)據(jù)的“通道優(yōu)先”的格式。
具體的池化層包含PE組緩存行,每行緩存有Pool_Dim個(gè)緩存塊,每個(gè)緩存塊有PE_Blocks個(gè)中間結(jié)果寄存器(見圖15)。PE_Blocks的計(jì)算如式(10)所示。計(jì)算不同行的池化過程,需要切換池化層的中間緩存,使得中間結(jié)果能夠存儲在合適的位置,PE行池化數(shù)據(jù)并行處理,處理完后輸出,寬度為PE個(gè)浮點(diǎn)數(shù)據(jù)流。
圖15 池化層中間結(jié)果緩存
由于該加速器采用了基于數(shù)據(jù)流調(diào)度的多層卷積網(wǎng)絡(luò)協(xié)同加速的模式構(gòu)建長流水線,獲得性能提升,因此每一個(gè)卷積模塊的配置,即PE、SIMD的選值,影響該層的計(jì)算能力。同時(shí)多層的計(jì)算能力要相匹配,使得多層的處理能力大致相當(dāng)而又避免過大的處理核由于流水線吞吐的限制,發(fā)揮不出應(yīng)有的性能。本部分通過分析模型計(jì)算硬件預(yù)估性能,結(jié)合HLS 高級綜合資源占用分析,選取性能最高的Conv10_Yolo 卷積加速器配置進(jìn)行分階段設(shè)計(jì),以適應(yīng)FPGA 芯片的分超級邏輯區(qū)放置資源。
Conv10_Yolo_FPS 2902 卷積網(wǎng)絡(luò)加速器配置如表2 所示,基于高級語言綜合(HLS)設(shè)計(jì)的處理速度達(dá)到了2902.56 fps,基于HLS 設(shè)計(jì)的硬件卷積處理資源性能達(dá)到了279.056 GFLOPS。
表2 Conv10_Yolo_FPS 2902 卷積網(wǎng)絡(luò)加速器配置
Conv10_Yolo 卷積網(wǎng)絡(luò)加速器使用HLS 形成處理核IP 以及Vivado 板卡仿真結(jié)合的方式獲得最終可執(zhí)行的比特流,Vivado _HLS 版本為2019.1。由于加速器核過大,超出了一個(gè)邏輯分區(qū)的可用資源總量,導(dǎo)致Vivado 后續(xù)的綜合實(shí)現(xiàn)的時(shí)序不能收斂,需要對加速器核進(jìn)行切分,分成3 個(gè)獨(dú)立的IP核分別進(jìn)行仿真分析,具體的資源占用對比如圖16所示。3 個(gè)階段的IP 資源占用均不超過一個(gè)邏輯分區(qū)的資源總量,其中資源占用最多的是Step1 的DSP 資源,達(dá)到了77%,各個(gè)階段IP 資源平均占用不超過52%,有利于后續(xù)的綜合實(shí)現(xiàn)時(shí)序收斂。
圖16 IP 核資源占用分析
Vivado 版本為2019.1,基于Vivado 仿真工具的Conv10_Yolo 卷積網(wǎng)絡(luò)加速器資源占用分析如表3所示。資源占用量最高的為DSP 資源,達(dá)到了55.92%,限制了加速器規(guī)模進(jìn)一步擴(kuò)大,具體的資源占比柱狀圖如圖17 所示。
表3 基于Vivado 的Conv10_Yolo_FPS 2902 卷積網(wǎng)絡(luò)加速器資源占用表
圖17 加速器資源占用分析
基于Vivado 仿真工具的Conv10_Yolo 卷積網(wǎng)絡(luò)加速器功耗分析如表4 所示,功耗為19.078 W。
表4 基于Vivado 的Conv10_Yolo_FPS 2902 卷積網(wǎng)絡(luò)加速器功耗分析
基于開源Google Earth 衛(wèi)星影像數(shù)據(jù),本文收集了全球多個(gè)國家多時(shí)相的機(jī)場影像作為訓(xùn)練數(shù)據(jù),采用人工標(biāo)注的方式在機(jī)場圖片中獲得機(jī)場目標(biāo)標(biāo)注信息,總共標(biāo)注了506 張128 ×128 像素尺寸的分辨率8 m 左右的機(jī)場目標(biāo)標(biāo)注數(shù)據(jù)集?;谠摂?shù)據(jù)集展開機(jī)場目標(biāo)篩選實(shí)驗(yàn)。
實(shí)驗(yàn)FPGA 硬件采用Xilinx VCU 1525 開發(fā)板卡進(jìn)行性能測試,在FPGA 平臺上達(dá)到了2802.08 fps 的處理速率,折合有效的吞吐量為247.496 GFLOPS,機(jī)場目標(biāo)識別平均準(zhǔn)確率達(dá)到97.59%。具體的測試結(jié)果如圖18 和圖19 所示,其中灰色框?yàn)槟繕?biāo)真實(shí)值,黑色框?yàn)闄z測結(jié)果,圖示結(jié)果顯示檢測機(jī)場的準(zhǔn)確率較高,達(dá)到了應(yīng)用的需求。
圖18 機(jī)場目標(biāo)識別結(jié)果1
圖19 機(jī)場目標(biāo)識別結(jié)果2
實(shí)驗(yàn)硬件配置為E5-2650-v4 CPU 以及Nvidia Titan X GPU,軟件配置為Ubuntu14.04,Cuda 版本為9.0.176,TensorFlow 版本為1.5.1,Keras 版本為2.2.4。訓(xùn)練參數(shù)Batch 為16,迭代次數(shù)為20 000 次,IOU閾值設(shè)置為0.3,框的概率閾值設(shè)置為0.3?;贕PU 平臺測試機(jī)場目標(biāo)識別能力,平均準(zhǔn)確率達(dá)到97.59%,基于GPU 的處理速度為126.01 fps。通過FPGA 平臺和GPU 平臺分別對Conv10_Yolo 卷積網(wǎng)絡(luò)加速器進(jìn)行性能測試,結(jié)果如表5 所示,該設(shè)計(jì)在FPGA 平臺上達(dá)到了2802.08 fps 的處理速率,處理速度達(dá)到了GPU 的22 倍,功耗低于GPU 處理平臺。與大模型[15-16]相比,該設(shè)計(jì)處理速度更快,能耗更低。
表5 與GPU 處理卷積計(jì)算性能對比
本文將Conv10_Yolo的性能與之前的工作對比,本文提出的Conv10_Yolo 加速器吞吐量達(dá)到了247.49 GFLOPS。文獻(xiàn)[12,17]的工作采用了基于硬核浮點(diǎn)計(jì)算單元的Intel Arria 10 器件,吞吐量較高,除了采用浮點(diǎn)硬核加速的工作,本文方法的運(yùn)算吞吐量達(dá)到了最高值,為247.49 GFLOPS;運(yùn)算效能也達(dá)到了最高值,為12.97 GFLOPS/W。相對于文獻(xiàn)[11]、文獻(xiàn)[18]、文獻(xiàn)[19]、文獻(xiàn)[20]的工作,本文方法使用更少的DSP 資源達(dá)到了更高的運(yùn)算吞吐量,有效解決了浮點(diǎn)卷積加速的線速瓶頸。實(shí)驗(yàn)數(shù)據(jù)表明,基于乘法矩陣與前向加法鏈的卷積計(jì)算陣列設(shè)計(jì),解決了浮點(diǎn)卷積乘累加造成的線速吞吐瓶頸,提升了浮點(diǎn)卷積網(wǎng)絡(luò)加速的處理速度與能效比,滿足了星載、機(jī)載等功耗受限條件下進(jìn)行高準(zhǔn)確率目標(biāo)檢測的功耗、加速吞吐量等要求。
表6 相關(guān)FPGA 浮點(diǎn)加速卷積網(wǎng)絡(luò)工作對比
本文面向遙感影像機(jī)場目標(biāo)識別應(yīng)用,定制了一個(gè)輕量化的目標(biāo)檢測網(wǎng)絡(luò),提出了基于乘法矩陣與前向加法鏈的卷積計(jì)算陣列設(shè)計(jì),解決了卷積加速的乘累加線速吞吐計(jì)算瓶頸。并通過基于FPGA的數(shù)據(jù)流調(diào)度技術(shù),對該檢測網(wǎng)絡(luò)的浮點(diǎn)模型進(jìn)行加速,達(dá)到了功耗受限環(huán)境下實(shí)時(shí)高準(zhǔn)確率的計(jì)算需求,同時(shí)解耦合了軟硬件協(xié)同加速的開發(fā)流程,降低了應(yīng)用開發(fā)人員利用FPGA 進(jìn)行加速計(jì)算的門檻。通過在Xilinx VCU 1525 開發(fā)板上構(gòu)建實(shí)現(xiàn)了浮點(diǎn)卷積目標(biāo)檢測網(wǎng)絡(luò),在機(jī)場目標(biāo)區(qū)域檢測應(yīng)用中平均準(zhǔn)確率為97.59%,目標(biāo)檢測處理速度為2802 fps,功耗為19.07 W,運(yùn)算性能為247.49 GFLOPS。實(shí)驗(yàn)結(jié)果表明,該方案達(dá)到了應(yīng)用需求的高準(zhǔn)確率,解決了浮點(diǎn)卷積加速的線速吞吐難點(diǎn),計(jì)算吞吐量以及計(jì)算能效比達(dá)到了最優(yōu),同時(shí)功耗滿足應(yīng)用環(huán)境的需求。下一步可以就相關(guān)場景的細(xì)粒度目標(biāo)識別加速問題進(jìn)行研究。