肖 奇,程利甫,蔣仁興,柳宜川,王 琴
(1.上海交通大學(xué)電子信息與電氣工程學(xué)院,上海 200240;2.上海航天電子技術(shù)研究所,上海 201109)
目標檢測網(wǎng)絡(luò)是卷積神經(jīng)網(wǎng)絡(luò)的一個重要分支,可以對圖像中的特定目標進行檢測、定位。近年來檢測速度和準確度最好的目標檢測網(wǎng)絡(luò)是2018年REDMON提出的YOLOv3(You Only Look Once version 3)網(wǎng)絡(luò)模型[1]。YOLOv3網(wǎng)絡(luò)在軍事[2]、遙感[3]、工業(yè)[4]等領(lǐng)域得到廣泛應(yīng)用,與傳統(tǒng)目標檢測方法相比更先進、更高效。
要使目標檢測網(wǎng)絡(luò)發(fā)揮出優(yōu)勢,必須脫離高性能電腦,使其能夠在終端設(shè)備上運行。設(shè)計并實現(xiàn)一款高性能、低功耗的CNN加速器,是目標檢測網(wǎng)絡(luò)在終端設(shè)備高效運行的基礎(chǔ)。FPGA具有可編程、低功耗、重構(gòu)成本低的優(yōu)點,基于FPGA可以快速、靈活地開發(fā)CNN加速器。
CNN加速器的設(shè)計核心在于運算單元并行度的提升和數(shù)據(jù)流的優(yōu)化。文獻[5]基于網(wǎng)絡(luò)壓縮的思想,對算法模型反復(fù)試驗,得到了輕量化的CNN模型,避免了頻繁的片外訪存,降低了加速器的功耗。但網(wǎng)絡(luò)壓縮的方法會造成算法精度降低,且更換算法模型后,需重新訓(xùn)練。文獻[6]基于經(jīng)典的Winograd算法,對YOLO網(wǎng)絡(luò)進行了循環(huán)迭代優(yōu)化,在FPGA上的峰值性能可達到200GOPS,GOPS表示運算能力為每秒十億次運算數(shù)(Giga Operations Per Second,GOPS)。但該方案通用性不高,更換應(yīng)用場景后,可能需要重新優(yōu)化網(wǎng)絡(luò)算法。文獻[7]基于高層次綜合(High-Level Synthesis,HLS)工具實現(xiàn)CNN加速器,采用C語言完成代碼編寫,將FPGA上的嵌入式處理器作為系統(tǒng)主控,搭建出完整的加速器系統(tǒng)。但HLS工具編寫的加速器對FPGA的硬件使用效率偏低,限制了加速器的性能提升。
本文面向衛(wèi)星遙感圖像的船艦?zāi)繕藱z測,設(shè)計了一款基于FPGA的CNN加速器。為了保證加速器的通用性,提出了一種高效的卷積并行運算架構(gòu),支持不同計算資源下并行度的靈活調(diào)整。借鑒指令集的設(shè)計思想,加速器的基本運算模塊可配置,最大限度地保證了硬件的通用性。針對CNN的圖像、權(quán)重數(shù)據(jù)存儲需求,設(shè)計了陣列式數(shù)據(jù)存儲單元,支持不同并行度的數(shù)據(jù)輸入和輸出?;诟呒壙蓴U展接口(Advanced eXtensible Interface,AXI)設(shè)計了加速器的頂層接口,使加速器便于移植到片上系統(tǒng)(System on Chip,SoC)。最后,將CNN加速器移植到FPGA上開展性能驗證,并與同類研究進行比較。
YOLOv3-Tiny網(wǎng)絡(luò)是YOLOv3網(wǎng)絡(luò)的簡化版本,識別精度略微降低,但得到了10倍以上的效率提升,其結(jié)構(gòu)如圖1所示。網(wǎng)絡(luò)主體包含13個卷積層、6個池化層、3個路由層和1個融合層。路由層、融合層能夠?qū)崿F(xiàn)不同尺度圖像的拼接、融合,以提升對不同尺度目標的檢測效果。卷積層的運算量占網(wǎng)絡(luò)總運算量的90%以上。因此,CNN加速器的核心功能是高效完成卷積層的加速。
圖1 YOLOv3-Tiny網(wǎng)絡(luò)的結(jié)構(gòu)
CNN的卷積運算可表示為
式中:y為卷積核內(nèi)所有乘積求和,再經(jīng)過非線性變換的結(jié)果;f(·)為非線性激活函數(shù);w為卷積核的權(quán)重;x為圖像的像素點;K為卷積核的邊長;(i,j)為卷積核窗口內(nèi)的像素點坐標索引。整個卷積層包含多個通道,不同通道的卷積結(jié)果進一步求和,最后添加偏置,得到輸出特征圖的一個像素點。完整的卷積層結(jié)構(gòu)如圖2所示。
圖2 卷積層的運算過程
對于輸入特征圖,卷積核會按一定順序遍歷整張圖片,在每個位置都做一次卷積運算,得到一個卷積結(jié)果。將卷積層不同輸入特征圖上相同位置產(chǎn)生的卷積結(jié)果進一步累加,最后再添加非線性參數(shù)(偏置),即得到輸出特征圖的一個像素點。該過程多次迭代,即可計算得到所有的輸出特征圖。
在加速器設(shè)計上,本文將算法優(yōu)化與硬件設(shè)計緊密結(jié)合。算法層面,對原版YOLOv3-Tiny網(wǎng)絡(luò)進行結(jié)構(gòu)調(diào)整,使網(wǎng)絡(luò)的運算功能可以完全由硬件描述語言(Hardware Description Language,HDL)實現(xiàn)。硬件層面,基于Verilog HDL實現(xiàn)卷積、池化等運算的加速模塊,并盡可能充分利用FPGA的BRAM資源,實現(xiàn)片上數(shù)據(jù)存儲。由文獻[8]可知,8 bits數(shù)據(jù)能夠滿足CNN推斷的精度要求。因此,本文對圖像數(shù)據(jù)和網(wǎng)絡(luò)參數(shù)(權(quán)重和偏置)均采用8 bits定點量化。網(wǎng)絡(luò)整體采用逐層運算的方式,中間層的結(jié)果緩存在片上,待網(wǎng)絡(luò)的輸出層計算完畢,將結(jié)果寫入片外存儲器。
YOLOv3-Tiny的特殊運算層為路由層、融合層和圖像上采樣層。路由層的結(jié)果緩存在片上的BRAM中;融合層通過調(diào)度路由層的地址映射實現(xiàn);上采樣層通過額外的控制單元實現(xiàn)。這樣,整個CNN加速器都能基于FPGA實現(xiàn),使加速器保持統(tǒng)一的架構(gòu)風(fēng)格,保證運算的高效。
加速器的總體架構(gòu)如圖3所示。加速器的主體為兩套同時工作的加速器并行單元,共包含128個卷積模塊。權(quán)重緩存單元通過AXI接口向外部的雙倍速率同步動態(tài)隨機存儲器(Double Data Rate Synchronous Dynamic Random Access Memory,DDRSDRAM,以下簡稱 DDR)讀取權(quán)重,而偏置數(shù)據(jù)量較小,故全部存儲在片上。片上數(shù)據(jù)緩存單元基于BRAM實現(xiàn),緩存卷積層和路由層的運算結(jié)果(特征圖數(shù)據(jù)),并為下一層的計算提供數(shù)據(jù)來源。原始圖像通過AXI接口輸入,輸出層的結(jié)果通過AXI接口輸出到DDR。CNN逐層運算控制單元采用狀態(tài)機實現(xiàn),將CNN每一層的運算模式進行參數(shù)化配置。一層運算啟動之前,控制單元對每一級子模塊的狀態(tài)寄存器進行配置,并啟動運算;一層運算完成后,控制單元重新配置所有子模塊,并開啟下一層的運算。
圖3 加速器的總體架構(gòu)
CNN加速器運算單元的內(nèi)部并行結(jié)構(gòu)如圖4所示。
圖4 CNN加速器并行單元架構(gòu)
圖4中,8卷積并行運算單元(以下簡稱8卷積單元)為核心運算模塊;通道互連單元負責(zé)改變數(shù)據(jù)流向;加法樹實現(xiàn)不同輸入通道數(shù)據(jù)的逐級累加;累加單元用來緩存、累加卷積單元輸出的中間特征圖,當輸出通道累加完成時,將結(jié)果傳遞到下一級;激活單元實現(xiàn)非線性函數(shù)運算;池化單元采用2×2最大池化;中間層輸出緩沖單元和路由層輸出緩沖單元負責(zé)輸出數(shù)據(jù)的轉(zhuǎn)換,將8個8 bits的數(shù)據(jù)合并為一個64 bits的數(shù)據(jù),然后輸出到片上數(shù)據(jù)緩存單元;輸出并行調(diào)節(jié)單元用來改變輸出通道的并行度。累加單元和池化單元均支持旁路,以兼容CNN不同層的運算模式。這一設(shè)計方案具有良好的通用性,能夠很好地支持YOLOv3-Tiny網(wǎng)絡(luò)每一層的運算。表1列舉了加速器可支持的所有運算模式。
表1 加速器支持的運算模式
累加單元需要消耗BRAM資源,為了降低BRAM開銷,將YOLOv3-Tiny網(wǎng)絡(luò)的前兩層設(shè)置為輸出優(yōu)先,輸入通道完全展開,從而避免大尺寸特征圖的片上累加。這樣,每個累加單元僅消耗1塊4 kB的BRAM。
路由層輸出的特征圖將緩存到專用的路由層緩存單元(內(nèi)嵌于圖3中的片上數(shù)據(jù)緩存單元),該單元還同時集成了路由層和上采樣層的功能。
卷積單元的基本結(jié)構(gòu)如圖5所示,主要包括卷積時序控制單元、卷積核緩存單元、3×3乘法運算陣列和行緩存單元。卷積核緩存單元負責(zé)向乘法單元提供權(quán)重。3×3乘法運算陣列由9個乘法單元組成,每個乘法單元包含1個具有使能信號的乘法器和1個數(shù)據(jù)寄存器。行緩存單元用于實現(xiàn)數(shù)據(jù)的復(fù)用。卷積時序控制單元主要負責(zé)控制9個乘法單元的使能信號,實現(xiàn)卷積時序的精確控制。
圖5 卷積單元的結(jié)構(gòu)
采用行緩存的結(jié)構(gòu),可避免圖像數(shù)據(jù)的重復(fù)輸入,且每個周期只需輸入一個像素值,極大地降低了對輸入帶寬的需求。當行緩存填滿后,卷積運算開始,9個乘法單元并行工作,計算一個3×3卷積核中的乘法,所得乘積并行輸出至下一級的加法樹。
在計算1×1卷積時,將9個乘法單元中的8個開啟,每個乘法單元計算一個卷積核。需要注意,在計算3×3卷積時,9個乘法單元的輸出需要累加到一起,而在1×1卷積中,8個乘法單元的輸出不具有相關(guān)性,即每個結(jié)果對應(yīng)一個獨立的輸出通道。因此,在進行結(jié)果累加前,應(yīng)對數(shù)據(jù)流向進行合理選擇。
圖4中的8卷積單元包含8個并行工作的卷積單元、8個加法樹和1個通道互連單元,其內(nèi)部結(jié)構(gòu)如圖6所示。在計算1×1卷積時,每個卷積單元會輸出8個輸出通道的部分和。因此設(shè)計8個卷積單元并行工作,每個卷積單元計算不同的輸入特征圖,通過權(quán)重重排,使8個卷積單元的輸出映射到8個輸出通道,這樣便可以跨單元將卷積單元的輸出結(jié)果相加。
圖6 8卷積單元的結(jié)構(gòu)
圖6和圖4中的通道互連單元在功能上是相同的,區(qū)別只在于兩側(cè)互連的通道數(shù)目。圖4中是8×8通道映射到8×8通道,而圖6中是9×8通道映射到9×8通道?;ミB單元的輸入輸出關(guān)系可以表示為
式中:y表示通道互連單元的輸出;x表示通道互連單元的輸入;(i,j)表示卷積單元和加法樹的互連通道編號。以圖6的通道互連單元為例,卷積單元1的輸出通道編號為x11~x19,卷積單元2的輸出通道編號為x21~x29,其余編號可類推,加法樹輸入通道編號方式與卷積單元的輸出通道一致。
本文充分利用FPGA的BRAM存儲資源,根據(jù)加速器的運算需求,設(shè)計了多種緩存單元。下面主要對中間層緩存單元、路由層緩存單元、輸出層緩存單元和權(quán)重緩存單元作詳細介紹。
(1)中間層緩存單元
中間層緩存單元是所有緩存單元中最主要、讀寫最頻繁的單元,其硬件結(jié)構(gòu)如圖7所示。
圖7 中間層緩存單元的結(jié)構(gòu)
中間層緩存單元的核心部件為BRAM陣列,每個陣列由64塊BRAM組成,將它們劃分為4列,每列16塊,每塊BRAM對應(yīng)加速器的一個輸出通道。在數(shù)據(jù)緩存階段,只有一列BRAM工作,通過控制單元調(diào)度,使CNN一層的輸出特征圖均勻存儲在陣列中。在數(shù)據(jù)讀出階段,根據(jù)加速器輸入并行度的需求,讀取若干BRAM中的數(shù)據(jù),參與后續(xù)運算。這樣的陣列設(shè)計能夠很好地滿足不同卷積層的輸入并行度需求和輸出存儲需求,使每一層都能高效運算。如:計算1×1卷積時,加速器的輸入并行度需求為64,則控制64塊BRAM同時向加速器提供數(shù)據(jù);計算3×3卷積時,若輸入并行度需求為16,則由控制單元調(diào)度,從一列BRAM(16塊)中讀取數(shù)據(jù)。
中間層緩存單元整體采用了乒乓式結(jié)構(gòu),一個陣列緩存加速器的輸出結(jié)果,另一個陣列向加速器提供數(shù)據(jù),避免了數(shù)據(jù)讀寫的沖突。
(2)路由層緩存單元
路由層緩存單元用于緩存YOLOv3-Tiny網(wǎng)絡(luò)中3個路由層的輸出,主要由讀寫控制單元和16塊BRAM組成。圖1中,路由層2經(jīng)過卷積層和上采樣層處理后得到路由層3,然后與路由層1進行融合。因此,將需要進行融合的兩個路由層緩存到連續(xù)的BRAM存儲空間,稍后輸出時即可完成融合。
為了降低路由層的存儲開銷,在BRAM中只存儲路由層2經(jīng)過卷積運算后的結(jié)果(8×8大小的特征圖)。在輸出時,采用上采樣單元實現(xiàn)上采樣層的功能,使加速器接收到16×16大小的特征圖。具體方法為:對原始圖像的每一行,每隔兩個周期,從BRAM中讀出一個像素點,但輸出端的有效信號維持兩個周期,使得加速器重復(fù)接收兩個相同的像素。同時,采用先入先出隊列(First In First Out,F(xiàn)IFO)緩存上采樣后的一行圖像數(shù)據(jù),原始數(shù)據(jù)的一行讀取完畢后,BRAM暫停輸出,將FIFO中的數(shù)據(jù)發(fā)送給加速器。圖8為上采樣單元的結(jié)構(gòu)。
圖8 上采樣單元的結(jié)構(gòu)
(3)輸出層緩存單元
本文采用的面向艦船檢測的YOLOv3-Tiny網(wǎng)絡(luò)包含兩個輸出層,每個輸出層有21個輸出通道。21個輸出通道可分為3組,每組的7個通道可劃分為若干個7維向量,即預(yù)測框?;谳敵鰯?shù)據(jù)的特點,設(shè)計了輸出層緩存單元,如圖9所示。其中,每塊BRAM存儲一組輸出通道的所有預(yù)測框,完成后,該單元會通過AXI接口將數(shù)據(jù)寫回DDR,交由其他單元作進一步處理。
圖9 輸出層緩存單元的結(jié)構(gòu)
(4)權(quán)重緩存單元
在CNN推斷過程中,參與加速器運算的權(quán)重需要不斷更新。引入權(quán)重緩存單元,可以使加速器在運算過程中及時更新權(quán)重。權(quán)重緩存單元的結(jié)構(gòu)如圖10所示。
圖10 權(quán)重緩存單元的結(jié)構(gòu)
權(quán)重緩存單元同樣采用了乒乓式結(jié)構(gòu),一塊緩存向加速器輸出權(quán)重,另一塊將DDR預(yù)取來的權(quán)重保存下來。一塊緩存中的權(quán)重讀取完畢后,兩塊緩存的功能交換。同時,權(quán)重緩存單元通過AXI接口向DDR發(fā)送讀請求,讀入下一批權(quán)重。讀取權(quán)重采用AXI協(xié)議的猝發(fā)讀寫功能,一次讀入45 kb的權(quán)重數(shù)據(jù)。每當加速器完成一張?zhí)卣鲌D的運算,權(quán)重緩存單元就將新的一批權(quán)重發(fā)送給加速器,保證加速器有持續(xù)的權(quán)重來源。
在算法訓(xùn)練完成后,需要確定CNN在加速器上的映射方案,并將訓(xùn)練好的權(quán)重進行重排序。這樣,權(quán)重緩存單元只需按照既定的程序工作,每次預(yù)取固定批次的權(quán)重,便可保證權(quán)重與加速器的計算時序相匹配。
本文基于FPGA搭建了卷積神經(jīng)網(wǎng)絡(luò)加速器的實驗系統(tǒng),將加速器掛載到AXI總線,并集成主控處理器、直接存儲器訪問(Direct Memory Access,DMA)單元、DDR控制器、閃存等模塊。系統(tǒng)結(jié)構(gòu)如圖11所示。啟動階段,主控處理器調(diào)用DMA,將閃存中的圖像、權(quán)重等數(shù)據(jù)上載到DDR。然后,將第一張艦船圖像輸入到加速器中,同時加速器預(yù)取第一批權(quán)重和偏置。之后,主控處理器啟動加速器,加速器開始工作。加速器輸出結(jié)果的處理由電腦完成。
圖11 CNN加速器實驗系統(tǒng)的結(jié)構(gòu)
將3.1節(jié)設(shè)計的實驗系統(tǒng)移植到Xilinx KC705 FPGA平臺,經(jīng)過軟件綜合,加速器可穩(wěn)定工作在100 MHz時鐘下,功耗為2.5 W,平均吞吐率達到217 GOPS。
采用包含艦船信息的衛(wèi)星遙感圖像對加速器進行測試。結(jié)果表明,遙感圖像中的艦船目標能夠被正確識別,如圖12所示。
圖12 加速器進行艦船檢測的結(jié)果展示
經(jīng)過測試,加速器推斷一張尺寸為256×256的艦船遙感圖像,耗時9.50 ms,對于連續(xù)遙感圖像的檢測速率可達105幀/秒。
將加速器的性能指標與同類研究進行對比,評估加速器的性能,結(jié)果如表2所示。
表2 與同類設(shè)計比較結(jié)果
對比可知,本文設(shè)計的神經(jīng)網(wǎng)絡(luò)加速器功耗較低,能效比較高,運算能力能夠滿足圖像實時檢測的要求。
本文面向衛(wèi)星圖像實時船艦?zāi)繕藱z測的應(yīng)用,設(shè)計并實現(xiàn)了基于FPGA平臺的通用卷積神經(jīng)網(wǎng)絡(luò)加速器?;谀繕藱z測網(wǎng)絡(luò)YOLOv3-Tiny設(shè)計了最優(yōu)的卷積運算并行架構(gòu),并充分利用FPGA的硬件資源,設(shè)計了高效的數(shù)據(jù)存儲單元和權(quán)重緩存單元,最終實現(xiàn)了一款基于AXI接口的高能效CNN加速器。該加速器移植到FPGA平臺后,經(jīng)測試驗證,工作頻率達100 MHz,平均吞吐率達到217 GOPS,功耗僅為2.5 W,能效比達86.8 GOPS/W,對連續(xù)遙感圖像的檢測速率達到105幀/秒,滿足實時目標檢測的需求。