程佳風(fēng),王紅亮
(中北大學(xué) 電子測量技術(shù)國家重點實驗室,山西 太原030051)
近年來,卷積神經(jīng)網(wǎng)絡(luò)的應(yīng)用范圍越來越廣泛,其應(yīng)用場景也日益復(fù)雜,卷積神經(jīng)網(wǎng)絡(luò)的計算密集和存儲密集特征日益凸顯,成為快速高效實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的限制。 于是基于GPU[1]、ASIC[2]、FPGA[3]的不同的加速器平臺被相繼提出以提升CNN 的設(shè)計性能。 GPU 的電力消耗巨大,硬件結(jié)構(gòu)固定,限制了卷積神經(jīng)網(wǎng)絡(luò)在嵌入式設(shè)備的應(yīng)用;ASIC 開發(fā)成本極高,靈活性低,不適合搭載復(fù)雜多變的卷積神經(jīng)網(wǎng)絡(luò);FPGA 具有功耗低、性能高、靈活性好的特點,因此更加適用于卷積神經(jīng)網(wǎng)絡(luò)硬件加速的開發(fā)研究,但由于Verilog HDL 開發(fā)門檻高,開發(fā)周期相對較長,影響了FPGA 在卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用的普及[4-5]。
本文基于軟硬件協(xié)同的思想,利用HLS 工具,在PYNQ-Z2 上實現(xiàn)了一個卷積神經(jīng)網(wǎng)絡(luò)加速器, 并采用矩陣切割的設(shè)計方法對卷積核運算進(jìn)行優(yōu)化。
本設(shè)計采用Xilinx 公司推出的PYNQ-Z2 開發(fā)板作為實驗平臺。 PYNQ-Z2[6-9]是基于Xilinx ZYNQ-7000 FPGA 的平臺,除繼承了傳統(tǒng)ZYNQ 平臺的強(qiáng)大處理性能外,還兼容Arduino 接口與標(biāo)準(zhǔn)樹莓派接口,這使得PYNQ-Z2 具有極大的可拓展性與開源性。 PYNQ 是一個新的開源框架,使嵌入式編程人員無需設(shè)計可編程邏輯電路即可充分發(fā)揮Xilinx Zynq All Programmable SoC(APSoC)的功能。 與常規(guī)方式不同的是,通過PYNQ-Z2,用戶可以使用Python 進(jìn)行APSoC 編程,并且代碼可直接在PYNQ2 上進(jìn)行開發(fā)和測試。通過PYNQ-Z2,可編程邏輯電路將作為硬件庫導(dǎo)入并通過其API 進(jìn)行編程,其方式與導(dǎo)入和編程軟件庫基本相同。
卷積神經(jīng)網(wǎng)絡(luò)[10-13]是一種復(fù)雜的多層神經(jīng)網(wǎng)絡(luò),擅長處理目標(biāo)檢測、目標(biāo)識別等相關(guān)的深度學(xué)習(xí)問題。 卷積神經(jīng)網(wǎng)絡(luò)通過其特有的網(wǎng)絡(luò)結(jié)構(gòu),對數(shù)據(jù)量龐大的圖像識別問題不斷地進(jìn)行圖像特征提取,最終使其能夠被訓(xùn)練。一個最典型的卷積神經(jīng)網(wǎng)絡(luò)由卷積層、池化層、全連接層組成。 其中卷積層與池化層配合,組成多個卷積組,逐層提取特征,最終通過全連接層完成圖像的分類任務(wù)。卷積層完成的操作可以認(rèn)為是受局部感受野概念的啟發(fā),而池化層主要是為了降低數(shù)據(jù)維度。綜合起來,CNN 通過卷積來模擬特征區(qū)分, 并且通過卷積的權(quán)值共享及池化來降低網(wǎng)絡(luò)參數(shù)的數(shù)量級,最后通過傳統(tǒng)神經(jīng)網(wǎng)絡(luò)完成分類等任務(wù)。
本文采用一種典型的手寫數(shù)字識別網(wǎng)絡(luò)CNN LeNet5 模型[14-16]對系統(tǒng)進(jìn)行測試,模型結(jié)構(gòu)如圖1 所示,總共包含6 層網(wǎng)絡(luò)結(jié)構(gòu):兩個卷積層、兩個池化層、兩個全連接層。 網(wǎng)絡(luò)的輸入為28×28×1 像素大小圖片,輸 入 圖 像 依 次 經(jīng) 過conv1、pool1、conv2、pool2、inner1、relu1、inner2 層后,得到10 個特征值,然后在softmax 分類層中將10 個特征值概率歸一化得出最大概率值即為分類結(jié)果。 網(wǎng)絡(luò)中的具體參數(shù)設(shè)置如表1 所示。
由表1 可以計算出,該CNN 網(wǎng)絡(luò)總共的權(quán)重參數(shù)量為260+5 020+16 050+510=21 840 個變量。若將這21 840個變量都采用ap_int(16)來存儲,將大約消耗43 KB 的存儲資源,本文采用的PYNQ-Z2 有足夠的存儲空間用于存放這些變量。
本文設(shè)計并實現(xiàn)基于PYNQ-Z2 的CNN 通用加速器,采用PYNQ-Z2 的PS 部分做邏輯控制,PL 部分執(zhí)行卷積神經(jīng)網(wǎng)絡(luò)運算。由于全連接運算是特殊的卷積運算,因此依據(jù)卷積神經(jīng)網(wǎng)絡(luò)的特性設(shè)計了兩個通用的運算模塊,即通用的卷積運算模塊和通用的池化運算模塊,如圖2 所示。
表1 網(wǎng)絡(luò)參數(shù)表
由圖2 可以看出,這種加速器框架實現(xiàn)了兩種通用的加速電路(即通用的卷積運算電路和通用的池化運算電路),CPU 通過axi_lite 總線對卷積池化電路的參數(shù)進(jìn)行配置,卷積池化電路通過axi_hp 總線對CPU 中存儲的特征權(quán)重參數(shù)進(jìn)行讀取。當(dāng)存儲器中輸入一組數(shù)據(jù)的時,CPU 就會進(jìn)行參數(shù)配置并調(diào)用卷積運算模塊進(jìn)行運算, 卷積ReLU 后的結(jié)果保存在存儲器中再進(jìn)行參數(shù)配置并調(diào)用池化運算模塊進(jìn)行運算,可以通過這種循環(huán)運算的方式實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的運算。
本文在TensorFlow 中搭建CNN LeNet5 網(wǎng)絡(luò)模型并進(jìn)行訓(xùn)練,訓(xùn)練過程如圖3 所示。 其中橫坐標(biāo)軸代表訓(xùn)練次數(shù),縱坐標(biāo)軸表示每次訓(xùn)練的誤差。 設(shè)置訓(xùn)練速率為50,訓(xùn)練20 000 次,隨著訓(xùn)練次數(shù)的不斷增多,誤差逐漸減小,最后的模型錯誤率僅為1.58%。
Xilinx 推出的HLS[17]工具是基于FPGA 的設(shè)計與開發(fā),用戶可以選擇多種不同的高級語言(如C、C++、System C)來進(jìn)行FPGA 的設(shè)計,在代碼生成時可以快速優(yōu)化FPGA 硬件結(jié)構(gòu),提高執(zhí)行效率,降低開發(fā)難度。
圖1 典型的手寫數(shù)字識別網(wǎng)絡(luò)結(jié)構(gòu)
圖2 系統(tǒng)硬件原理框圖
圖3 CNN LeNet5 誤差與訓(xùn)練次數(shù)的關(guān)系
本文通過C 語言描述了兩個加速電路,利用HLS 工具生成加速器的IP 核。 系統(tǒng)通過CPU 配置IP 核的參數(shù),采用AXI 的通信方式進(jìn)行數(shù)據(jù)傳輸,輸入的數(shù)據(jù)通過IP 核進(jìn)行CNN 運算,運算的結(jié)果通過AXI 總線輸出。圖4 是加速器IP 核的原理圖。
圖4 加速器IP 核原理圖
由于特征、權(quán)重參數(shù)都是多維的空間變量,無法在計算機(jī)中讀取,因此需要將其展開為一維變量。 如圖5 所示,對于特征參數(shù), 它在空間中的排布方式為三維變量,因此需要將其展開為一維變量,考慮到FPGA 的并行計算能力優(yōu)秀,所以在空間中沿輸入特征的通道C 將其切割為C/k 通道,每一個通道可以實現(xiàn)k 路并行的計算且需要的特征存儲空間減少,大大提高了加速電路的運算效率,節(jié)約了FPGA 的存儲資源。 特征參數(shù)經(jīng)過切割后,它在內(nèi)存中的排布方式變?yōu)榱艘痪S變量:[C/k][H][W][k]。
圖5 卷積運算的矩陣切割
權(quán)重參數(shù)在空間中的排布方式為四維變量,要將它展開為一維變量,也是對其輸入通道CHin 切割為CHin/k通道,實現(xiàn)每一個通道的k 路并行,它在內(nèi)存中的排布方式變?yōu)橐痪S變量:[CHout][ky][kx][CHin/k][k]。
其中k 的取值會對系統(tǒng)性能造成極大的影響,一個合適的k 值可以使得存儲資源、計算資源、帶寬資源三者達(dá)到平衡。 通常k 的取值有8、16、32、64,其不同的取值對應(yīng)的資源消耗如表2 所示,不同取值對應(yīng)的計算圖片的時間如表3 所示。
通過表2 和表3 的數(shù)據(jù)對比可以得到,在k=32 時的資源占用較為合理,可以使得系統(tǒng)的性能達(dá)到最優(yōu),同時權(quán)衡了計算時間和數(shù)據(jù)存儲時間,達(dá)到了比較好的均衡效果。
表2 不同k 的取值對應(yīng)的資源消耗
本實驗采用PYNQ-Z2 開發(fā)板,其主芯片是XC7Z020,主要由PS 和PL 兩部分組成,PS 端是650 MHz 雙核Cortex-A9 處 理 器,PL 端 的 時 鐘 頻 率 為100 MHz。 通 過表3 可以看出,在進(jìn)行單張圖片測試時,CNN IP 核在k=32 時計算圖片的時間比PS 端減少了將近39 ms,達(dá)到了近6 倍的加速效果。接下來進(jìn)行多張圖片測試來記錄加速效果。
在MNIST 數(shù)據(jù)集中選取1 000 張圖片,分成10 組,每組100 張測試圖片,組成圖片流,分別送入ARM 層和硬件層的加速器IP 核進(jìn)行CNN 運算, 并且記錄各自所用的時間,從而得到加速器IP 核對圖片流的加速效果。實現(xiàn)結(jié)果如圖6 所示。
圖6 圖片流的測試結(jié)果
由圖6 可以看出,兩種不同平臺的測試結(jié)果都成線性關(guān)系,說明每張圖片的運算時間都是固定不變的,加速器IP 核處理單張圖片的平均時間為4.3 ms, 而ARM平臺處理單張圖片的平均時間約為42 ms,由此可見,當(dāng)運算相同數(shù)量的圖片時,CNN IP 核可將運算速度提高到近10 倍,遠(yuǎn)遠(yuǎn)超過了單張圖片的加速效果。 當(dāng)處理1 000 張圖片時,加速器IP 核比ARM 端快了38 s 左右,并且隨著圖片的數(shù)量越來越多, 加速器IP 核的性能也將越來越好,加速效果也將越來越顯著。
本文采用的HLS 工具實現(xiàn)的加速器IP 核與FPGA實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)[18]相比較,比較結(jié)果如表4 和表5所示。
通過表5 可以看出,文獻(xiàn)[18]中提出的利用FPGA實現(xiàn)CNN 加速器與傳統(tǒng)的CPU 相比有很大的加速效果,在處理單張圖片時的加速比為4.17,在處理10 000張圖片時的加速比為3.43,可見隨著處理圖片的數(shù)量逐漸增加,加速器的效果在不斷降低。 本文提出的利用HLS 工具生成的CNN 加速器在處理單張圖片時所耗時間為8 ms,加速比為5.875,與傳統(tǒng)CPU 相比有很好的加速效果;在處理1 000 張圖片時,加速器IP 核耗時4.352 s,通用CPU 耗時42.322 s,此時的加速比為9.72,加速效果越來越明顯,并且隨著處理的圖片數(shù)量越來越多,加速效果會越來越好,具有很好的參考意義。
表3 不同k 的取值對應(yīng)的計算圖片的時間
表4 文獻(xiàn)[18]與本文實驗平臺的對比
表5 文獻(xiàn)[18]與本文對不同數(shù)量的圖片處理的運算速度的對比
本文在PYNQ-Z2 平臺上利用HLS 工具設(shè)計了加速器IP 核來進(jìn)行卷積神經(jīng)網(wǎng)絡(luò)運算,并通過矩陣切割的方法對加速器IP 核進(jìn)行優(yōu)化,充分利用了FPGA 的并行計算能力。 通過實驗證明在k=32 時,均衡了存儲資源和計算資源,使得加速器IP 核的性能達(dá)到最優(yōu),運算速度得到明顯的提升。由于本實驗采用的開發(fā)平臺資源有限,若采用資源更多的FPGA 平臺進(jìn)行加速運算,加速器的性能將得到更大的提升。