史興強(qiáng),強(qiáng)小燕,鞏 凱,邢夢菲
(中國電子科技集團(tuán)第五十八研究所,江蘇 無錫 214035)
圖像語義分割是將圖像的每個像素分類為一個實例[1]。該技術(shù)是場景理解的基礎(chǔ)性技術(shù)[2],在自動駕駛[3-5]、人機(jī)交互[6]、計算攝影[7]、圖像搜索引擎[8]以及醫(yī)學(xué)圖像研究[9-11]中起到重要作用。隨著深度學(xué)習(xí)發(fā)展,基于CNN 的圖像語義分割方法逐漸成為圖像語義分割的主流[12]。
圖像語義分割在嵌入式邊緣端有著廣闊的應(yīng)用前景,但是嵌入式邊緣設(shè)備的處理核心多是基于精簡指令集的微處理器,由于順序數(shù)據(jù)處理方式的限制,使得網(wǎng)絡(luò)中的計算無法高效并行完成。為了提升網(wǎng)絡(luò)在嵌入式邊緣端處理效率,在嵌入式邊緣端對CNN 進(jìn)行加速的研究受到廣泛關(guān)注,出現(xiàn)了大量基于高性能計算處理器的網(wǎng)絡(luò)加速方法[13-16]。其中,F(xiàn)PGA 由于內(nèi)部包含有大量的可編程邏輯資源,可以構(gòu)建高并行的計算結(jié)構(gòu),在較低工作時鐘頻率下仍能實現(xiàn)較高的算法處理速度,可以滿足功耗受限的嵌入式邊緣端應(yīng)用的需求,成為嵌入式邊緣端網(wǎng)絡(luò)推理加速的主流硬件加速器之一。但是,當(dāng)前基于FPGA 的深度學(xué)習(xí)推理加速方法主要面向以單一標(biāo)準(zhǔn)卷積構(gòu)建的神經(jīng)網(wǎng)絡(luò),而為了提升語義分割的精度以及減少語義分割的計算量,出現(xiàn)了空洞卷積、點(diǎn)卷積、深度卷積和標(biāo)準(zhǔn)卷積等多種卷積運(yùn)算,需要設(shè)計能夠支持多種類型卷積的加速器。
針對以上問題,本文提出一種基于FPGA 的多類型卷積加速器設(shè)計方法,并通過對不同并行度和不同計算結(jié)構(gòu)的加速器進(jìn)行對比實驗,驗證加速器設(shè)計方法的有效性。
空洞卷積、點(diǎn)卷積、深度卷積和標(biāo)準(zhǔn)卷積是當(dāng)前主流的基本卷積運(yùn)算。在本文設(shè)計的加速器所支持的卷積中,點(diǎn)卷積的卷積核尺寸和卷積步長恒定為1;其余卷積的卷積核尺寸為3,卷積步長為1 或者2。
點(diǎn)卷積的一個輸出通道計算過程如圖1 所示。
圖1 點(diǎn)卷積計算示意圖
標(biāo)準(zhǔn)卷積的一個輸出通道計算過程如圖2 所示。
圖2 標(biāo)準(zhǔn)卷積計算示意圖
空洞卷積在輸入通道上的計算過程如圖3 所示。左下角黑色正方形中的數(shù)值會與右上角的正方形中的9 個數(shù)值對應(yīng)相乘,膨脹率則是用于表征兩黑色正方形間距離的參數(shù)。由于加入膨脹率后的計算在行和列上不再連續(xù),為了保證特征不丟失,一般空洞卷積的步長為1。
圖3 空洞卷積計算示意圖
深度卷積在各個通道上進(jìn)行獨(dú)立計算,卷積結(jié)果直接用于對應(yīng)的輸出通道,其計算過程如圖4 所示。
圖4 深度卷積計算示意圖
多類型卷積加速器的結(jié)構(gòu)如圖5 所示。加速器結(jié)構(gòu)主要包括四部分:DDR、BRAM、存儲模塊和計算模塊。DDR 是加速器的片外存儲器,用于存儲待處理的圖片數(shù)據(jù)和網(wǎng)絡(luò)中的權(quán)重數(shù)據(jù)、參數(shù)數(shù)據(jù)以及加速器的配置數(shù)據(jù)。BRAM 是加速器的片上存儲器,用于存儲中間特征圖以及一層卷積運(yùn)算的權(quán)重數(shù)據(jù)和參數(shù)數(shù)據(jù),BRAM 與DDR 間通過AXI(Advanced eXtensible Interface)協(xié)議實現(xiàn)片上和片外的數(shù)據(jù)交互。計算模塊是加速器的運(yùn)算核心,其主要通過并行的處理單元(Processing Element,PE)和累加器(Accumulator)完成卷積運(yùn)算,并對卷積運(yùn)算后的BN 和ReLU 相關(guān)運(yùn)算提供支持。存儲模塊位于片上BRAM 與計算模塊之間,進(jìn)行數(shù)據(jù)的讀寫和搬運(yùn)。
圖5 加速器結(jié)構(gòu)示意圖
計算模塊采用了多PE 并行的設(shè)計方法,多個PE 間使用相同的輸入特征圖數(shù)據(jù)和對應(yīng)輸入通道的不同輸出通道權(quán)重數(shù)據(jù)。PE 計算完成的數(shù)據(jù)會作為累加器的輸入,累加器用于不同輸入通道的PE 計算結(jié)果的求和,對于不需要輸入通道求和的深度卷積,累加器則直接將PE 的結(jié)果輸出。BN 和ReLU 用于執(zhí)行卷積層后的批歸一化和激活操作,可以通過配置選擇執(zhí)行和不執(zhí)行。ReLU 的輸出結(jié)果作為輸出特征圖直接寫入片上BRAM,用于下一次卷積計算。
從點(diǎn)卷積、標(biāo)準(zhǔn)卷積、空洞卷積和深度卷積的計算原理可以看到,卷積核的尺寸只有1 和3 兩種,根據(jù)卷積核尺寸,卷積運(yùn)算可以拆分為兩種基本計算單元:1×1 計算單元和3×3 計算單元。本文針對卷積運(yùn)算的兩種基本運(yùn)算單元設(shè)計了兩種PE。
PE1 用于點(diǎn)卷積的并行運(yùn)算,其結(jié)構(gòu)如圖6 所示。
圖6 PE1 結(jié)構(gòu)示意圖
PE2 用于卷積核尺寸為3 的卷積的并行運(yùn)算,其結(jié)構(gòu)如圖7 所示。PE2 執(zhí)行標(biāo)準(zhǔn)卷積、空洞卷積和深度卷積中最基本的3×3 計算單元。
圖7 PE2 結(jié)構(gòu)示意圖
存儲模塊主要用于減少數(shù)據(jù)傳輸?shù)牡却龝r延和存儲加速器的配置信息。存儲模塊主要包括Input Buffer、Weight Buffer、Parameters Buffer 和Config Buffer。其中Config Buffer 用于存儲加速器的配置信息,通過AXI 協(xié)議可以從片外的DDR 中將卷積計算的配置信息寫入Config Buffer,然后Config Buffer 根據(jù)配置信息對Input Buffer、Weight Buffer 和Parameters Buffer 的數(shù)據(jù)讀取方式以及計算模塊的計算模式進(jìn)行配置。存儲模塊中的Input Buffer 和Weight Buffer 從片上BRAM 中讀取計算模塊需要的數(shù)據(jù),然后將數(shù)據(jù)搬運(yùn)給計算模塊進(jìn)行計算。由于BRAM 帶寬的限制,Input Buffer 和Weight Buffer 會以串行的方式從BRAM 讀取數(shù)據(jù),然后并行地將數(shù)據(jù)傳給計算模塊。Input Buffer 一次會讀取累加器完成輸入通道上求和所需要的全部輸入通道數(shù)據(jù),然后一次傳送一個輸入通道,分批次將全部輸入通道的數(shù)據(jù)傳送給PE;Weight Buffer 也會讀取多個輸出通道上全部輸入通道的權(quán)重數(shù)據(jù),同樣分批次傳送給PE。當(dāng)卷積核在輸入特征圖的行和列上滑動時,Input Buffer 中的數(shù)據(jù)需要隨著行和列的變化不斷更新,而Weight Buffer 中的數(shù)據(jù)則可以保持不變。Input Buffer 中的數(shù)據(jù)更新時,部分?jǐn)?shù)據(jù)可以重復(fù)使用,以標(biāo)準(zhǔn)卷積為例,Input Buffer的數(shù)據(jù)更新如圖8 所示。
圖8 Input Buffer 數(shù)據(jù)更新
圖8 展示了一個M通道的特征圖,完整的特征圖存儲在片上BRAM 中,而Input Buffer 存儲的數(shù)據(jù)為M個通道的Block 數(shù)據(jù),Input Buffer 一次可以將一個Block的數(shù)據(jù)傳輸給計算模塊中全部的PE,實現(xiàn)多個輸出通道的卷積核對同一個卷積窗口內(nèi)的特征圖的同時處理,通過對特征圖數(shù)據(jù)進(jìn)行重復(fù)利用提高處理效率。對于步長為1 的標(biāo)準(zhǔn)卷積,Block1 和Block2 存在6 個數(shù)據(jù)的重疊,從Block1 更新到Block2,只需要從BRAM 中讀取3 個新數(shù)據(jù),此時Weight Buffer 中的權(quán)重數(shù)據(jù)可以保持不變,不需要從BRAM 中讀取新的權(quán)重數(shù)據(jù)。對于深度卷積,其Input Buffer 與標(biāo)準(zhǔn)卷積的功能一致,可以采用相同的設(shè)計方法。對于空洞卷積,兩相鄰的Block 間無數(shù)據(jù)重疊,不能像標(biāo)準(zhǔn)卷積一樣重用數(shù)據(jù),但是空洞卷積為了保證輸出尺寸與輸入尺寸一致需要進(jìn)行大量的補(bǔ)零工作,可以通過Input Buffer 對輸入特征圖四周的零值進(jìn)行復(fù)用,減少數(shù)據(jù)讀寫時間。而對于點(diǎn)卷積,不存在數(shù)據(jù)的重疊,也不存在大量重復(fù)出現(xiàn)的零,因此Input Buffer 每次更新需要重新讀取數(shù)據(jù),無數(shù)據(jù)的重用。
為驗證本文所提卷積加速器結(jié)構(gòu)對于四種不同類型卷積的并行計算加速能力,通過對四種類型卷積分別設(shè)計不同的數(shù)據(jù)傳輸結(jié)構(gòu)與并行度,測試不同結(jié)構(gòu)設(shè)置下卷積加速器的處理速度與片上計算及緩存資源情況。
選擇常見的尺寸為64 通道、32 行、32 列的特征圖作為加速器的輸入。采用3 種方法對不同類型卷積設(shè)計加速器結(jié)構(gòu),分別為PE 直接從BRAM 中讀寫數(shù)據(jù),讀寫以及計算之間PIPELINE 設(shè)計,以及在PIPELINE 設(shè)計的基礎(chǔ)上在PE 和BRAM 之間加入了Buffer。此外,采用內(nèi)部x個PE 并行的加速器進(jìn)行實驗,以下稱為并行度x,通過調(diào)整x的值來驗證加速器中PE 單元的個數(shù)對計算時延的影響,由于FPGA 片上DSP 資源數(shù)量的限制,選取并行度為1、2、4 的加速器進(jìn)行對比試驗。
本文所設(shè)計的多類型卷積并行計算單元總共有兩種,一種是用于1×1 計算單元的PE1,另一種是用于3×3計算單元的PE2。兩種計算單元的資源占用和處理時延如表1 所示。
表1 計算單元資源占用和處理時延
表1 中可以看到,PE1 的延遲為6 個時鐘周期,PE2的延遲為38 個時鐘周期,PE2 與PE1 相比增加了求和的過程,PE1 的輸出結(jié)果即為乘法計算的結(jié)果,內(nèi)部乘法計算完全并行,需要的資源相對較多,處理速度也相對較快,PE2 輸出結(jié)果需要對乘法計算結(jié)果求和,內(nèi)部乘法計算部分并行,需要資源相對較少,處理速度相對較慢。
本文設(shè)計的加速器采用了多PE 并行的計算結(jié)構(gòu),不同的PE 并行度的加速器的資源占用情況如表2所示。
表2 不同并行度加速器資源占用對比
從表2 中可以看到,并行度提高,PE 的數(shù)量會增多,需要的存儲和計算資源也更多。
在卷積步長為1,卷積計算后統(tǒng)一執(zhí)行BN 和ReLU操作的條件下,不同結(jié)構(gòu)以及不同并行度加速器的點(diǎn)卷積、標(biāo)準(zhǔn)卷積、深度卷積以及空洞率為4 的空洞卷積的處理時延如表3 所示。
表3 卷積處理時延對比
表3 中給出了三種加速器結(jié)構(gòu)在三種并行度下四種卷積的計算時延,三種加速器結(jié)構(gòu)分別對應(yīng)卷積1、卷積2 和卷積3。卷積1 對應(yīng)加速器結(jié)構(gòu)為PE 直接從BRAM中讀寫數(shù)據(jù),1 并行度的卷積1 為不進(jìn)行任何專用結(jié)構(gòu)設(shè)計的加速器,卷積2 在卷積1 的基礎(chǔ)上進(jìn)行了PIPELINE 設(shè)計,從表中的數(shù)據(jù)可以看到加入PIPELINE設(shè)計后,時延都得到了大幅度衰減,卷積3 為本文采用的加速器結(jié)構(gòu),其在PIPELINE 設(shè)計的基礎(chǔ)上在PE 和BRAM 之間加入了Buffer,減少PE 對BRAM 的訪問次數(shù),從表中可以看到除了并行度4 的點(diǎn)卷積之外,卷積3的時延均小于卷積1 和卷積2。采用卷積3 的結(jié)構(gòu)不能明顯降低點(diǎn)卷積的處理時延的原因有兩點(diǎn),一是點(diǎn)卷積的卷積核在輸入特征圖的行和列上移動時,從輸入特征圖讀出的數(shù)據(jù)不會出現(xiàn)重疊,從而使得Input Buffer 無法重用數(shù)據(jù),每一次都需要從BRAM 讀取完整的數(shù)據(jù);二是點(diǎn)卷積一個PE 僅需要一個權(quán)重數(shù)據(jù),導(dǎo)致卷積核在輸入特征圖的行和列上移動時可以復(fù)用的權(quán)重數(shù)據(jù)的數(shù)量較少,從而數(shù)據(jù)復(fù)用帶來的時延降低效果變差。而與點(diǎn)卷積相比,空洞卷積通過重用輸入特征圖補(bǔ)零后四周的零值,在同樣不能重用有效的輸入數(shù)據(jù)的條件下取得了較好的加速效果。與不進(jìn)行專用結(jié)構(gòu)設(shè)計的加速器相比,本文設(shè)計的加速器對于標(biāo)準(zhǔn)卷積、點(diǎn)卷積、空洞卷積和深度卷積最大分別可以帶來113.0、17.9、64.6 和13.2 倍的速度提升。
本文提出了一種基于FPGA 的多類型卷積加速器設(shè)計方法。首先針對點(diǎn)卷積、標(biāo)準(zhǔn)卷積、空洞卷積和深度卷積運(yùn)算中的兩種基本運(yùn)算設(shè)計了兩種處理單元,通過處理單元內(nèi)部并行計算提高卷積的計算效率。然后,設(shè)計了一種多處理單元并行的加速器結(jié)構(gòu),通過處理單元間的并行來進(jìn)一步加快卷積的處理速度并通過高效的數(shù)據(jù)訪存結(jié)構(gòu)減少了數(shù)據(jù)的傳輸?shù)却龝r間。實驗結(jié)果表明,采用多處理單元并行的加速器結(jié)構(gòu)和PIPELINE的設(shè)計方法能夠大幅度減少各類型卷積的處理時間。此外,提升加速器的并行度可以有效減少各類卷積的處理時間,高并行度的加速器在占用更多資源的條件下可以帶來更快的處理速度,與不進(jìn)行專用結(jié)構(gòu)設(shè)計的加速器相比,本文設(shè)計的加速器對于特征圖尺寸為64×32×32的標(biāo)準(zhǔn)卷積、點(diǎn)卷積、空洞卷積和深度卷積分別可以帶來113.0、17.9、64.6 和13.2 倍的速度提升。