?

一種基于FPGA 的卷積神經網絡加速器實現方案*

2022-03-02 12:43陳心宇高文斌
北京電子科技學院學報 2022年4期
關鍵詞:池化層池化權值

李 莉 陳心宇 高文斌

北京電子科技學院,北京市 100070

引言

近年來,深度學習領域中的神經網絡技術因為其算法性能方面的優異表現被研究者們廣泛關注, 在神經網絡中卷積神經網絡CNN 表現格外突出[1]。 CNN 作為一種經典的利用標簽進行學習的監督學習算法,一直都是計算機圖像處理領域的熱點[2]。 由于CNN 中存在大量的卷積運算,即乘法和加法運算,如何提升CNN 的運算性能成了近年來研究者的重要關注點。

針對CNN 中卷積池化的運算計算量大、計算效率低的問題,存在三種解決辦法:一是改進神經網絡模型,減少神經網絡對權值與參數數量的需求[3];二是利用快速算法,文獻[4]中采用Winograd 算法,通過減少乘法次數來實現加快卷積運算;三是采用計算效率更高的平臺,提高運算的效率。 CNN 是多層感知機的一個變種模型,這種模型剛開始被用來模擬大腦皮層的視覺行為,后在計算機視覺識別任務上表現出色被廣泛運用于圖像識別領域。 與傳統神經網絡不同的是,CNN 卷積層中輸出特征面的每個神經元與其輸入進行的是局部連接而非全連接,通過對應的連接權值與局部輸入進行乘積求和再加上權值的偏置值,得到該神經元輸出值,該過程等同于卷積過程。 CNN 采用局部感受野、權值共享等思想,顯著地減少了網絡中自由參數的個數,使得使用更多層的深度神經網絡來進行監督深度學習成為可能。 CNN 由輸入層、卷積層、池化層、全連接層及輸出層構成,通常采用多個卷積層和池化層交替出現的結構,在卷積層、池化層、全連接層中,層內部的運算都是相互獨立的,靠后的層內運算不會影響靠前的層內運算,換言之,以并行的方式實現CNN 的網絡結構是可行的。 在文獻[5]中,作者率先指出CNN 并行特征可以概括為層間并行性、輸出間并行性、卷積核間并行性和卷積核內并行性四種類型。 但在實際應用中由于各種客觀原因,無法兼顧四種并行性,在文獻[6]中作者將探尋CNN 并行性的最大挑戰總結于探究多種并行機制的最佳組合。

針對CNN 模型這種并行的層間結構,CPU的串行實現方式難以發揮CNN 的并行結構特點,而FPGA 具有計算資源豐富、邏輯電路設計靈活,并行設計容易實現的特點,廣泛應用于硬件加速領域。 文獻[7]采用主機+FPGA 的計算架構,通過將卷積層的卷積核參數和特征輸入權值一次性全部緩存,再進行卷積的并行運算來減少卷積層的運算時間,但是會占用更多的FPGA片上資源。 文獻[8]考慮到FPGA 片上資源的有限性,選擇對部分卷積核進行并行運算,使用了循環變換方法構建卷積層計算電路,通過循環分塊方法將卷積層劃分成多組不同的輸入-輸出分塊,構成多輸入多輸出的模型結構,通過循環展開方法以并行方式計算輸入-輸出塊內的卷積操作,從而以層間并行、層內并行的方式實現卷積層的計算。 文獻[9]提供了一種用來優化卷積運算中乘法和累加運算的稀疏卷積算法,降低了卷積運算中乘法運算復雜度。 文獻[10]采用移位操作代替卷積運算中的乘法操作來降低硬件資源消耗。

在前人研究基礎上,本文完成了以下工作。

(1) 選取CNN 中典型的LeNet-5 網絡,分析各層結構,考慮CNN 的四種并行類型:層間并行性、輸出間并行性、卷積核間并行性和卷積核內并行性,采用卷積核間全并行、核內部分并行、輸出部分并行的方案實現神經網絡卷積池化運算的加速。

(2) 提出一種新的行緩存乘法-加法樹結構,一定程度上減少了內存資源消耗,提高了緩存-卷積操作的運算速率。

(3) 提出卷積-池化-卷積-池化-卷積五級流水線結構,設計控制模塊高效地控制各層數據的讀入輸出,降低了CNN 的運算所需時間。

1 CNN 結構及其分析

1.1 LeNet-5 卷積神經網絡

CNN 通過前向傳播來進行識別和模式分類,通過反向傳播來進行訓練。 CNN 模型由多個計算層組成,除輸入層和輸出層外,CNN 使用卷積層、池化層代替了傳統神經網絡中的隱含層。 CNN 通過反向傳播不斷更新兩層神經元之間連接的權值,使層中的不同神經元能夠提取輸入的不同特征,實現傳統全連接網絡達不到的多層深度學習網絡的目標。

如圖1 所示,手寫體字符識別7 層CNN——LeNet-5 由輸入層、卷積層C1、池化層S2、卷積層C3、池化層S4、卷積層C5、全連接層F6 和全連接輸出層組成。 為了提高加速方案的普適性,本文只研究加速神經網絡中具有高度并行性的部分:卷積層、池化層,也就是實現輸入層、卷積層C1、池化層S2、卷積層C3、池化層S4、卷積層C5 的硬件加速。 待識別的32*32 單通道二值圖像和6 個5*5 大小的卷積核做卷積操作得到6 通道28*28 的二維特征輸出,經過2*2 的最大池化得到6 通道14*14 的特征輸出,16 個5*5 卷積核與前一層6 通道特征輸出中的部分通道做卷積運算,得到16 通道10*10 輸出,經過下一層最大池化得到16 通道5*5 特征輸出。池化層S4 的特征輸出和卷積層C5 的120 個卷積核都是5*5 大小,卷積運算后得到120 維1*1 大小的向量輸出。

圖1 LeNet-5 神經網絡結構

1.2 并行性分析與層間結構分析

在上文描述LeNet-5 結構時,可以注意到,前后卷積層與池化層之間相互獨立,但是每層的輸入和上層的輸出有關。 考慮到后一層不需要等待前一層所有數據處理完成再開始處理數據,前一層繼續處理數據的同時向后一層輸出數據,達到多層同時處理數據的效果,因此層間的數據處理可以用流水線的方式實現。 輸出間的并行性可以和卷積核間的并行性一起考慮。 在LeNet-5 卷積層C1 中,28*28 的特征輸入需要和6 通道的5*5 卷積核做卷積運算。 對于6 通道的卷積操作,每個通道的卷積之間互不影響,而且每個通道的卷積運算過程完全相同,所以對于卷積核間的并行性是可行的。 在一定程度上,多通道的輸出,即輸出間的并行性也是可以實現的。 對于核內的并行性,即乘法和累加的并行性,在已有的文獻中都有提及,這里不再詳細說明。

綜上,本方案針對LeNet-5 神經網絡的前五層卷積層C1、池化層S2、卷積層C3、池化層S4、卷積層C5 設計五級流水線架構。 采用卷積核間全并行、核內部分并行,輸出部分并行的方式實現CNN 加速,層與層之間采用流水線結構實現數據流的高效處理。

2 實現方案

本文基于FPGA 對CNN 中典型的LeNet-5網絡進行實現:層與層間采用卷積-池化-卷積-池化-卷積五級流水線設計,來加速CNN 層間的數據流傳遞與不同層之間的數據處理;層內卷積運算采用卷積核全并行、核內部分并行、輸出部分并行的并行方式來加速CNN 的卷積、池化運算。

2.1 總體方案設計

在現行研究下,利用軟硬件協同來實現CNN 加速器的架構主要有兩種,一種是利用FPGA 片上CPU 和硬件資源協同實現整體方案[11],另一種是通過PC 機和FPGA 硬件資源實現整體方案。 本文采用第二種PC 機協同方案:PC 機負責傳輸圖像輸入、權值參數和偏置參數以及控制的功能;FPGA 負責CNN 運算的整個過程,二者通過UART 串口進行數據的傳輸交換。 CNN 并行加速方案的總體設計結構框圖如圖2 所示。

圖2 方案的總體設計結構框圖

本方案硬件設計實現CNN 的前向測試部分,CNN 的反向學習訓練部分、輸入的待識別圖片二值化、權值浮點數定點化均由PC 端實現,系統讀取訓練完成的權值數據、偏置數據和二值化后的圖片數據。 輸入層、卷積層、池化層、全連接層、輸出層間設計數據緩存模塊,將前一層的輸出保存在寄存器中,并等待控制模塊輸出使能信號控制下一層對前一層數據的讀取。 卷積層由數據處理模塊、卷積模塊和激活函數Relu 模塊組成;池化層由最大池化模塊組成。

2.2 五級流水線設計

針對LeNet-5 神經網絡的前五層——卷積層C1、池化層S2、卷積層C3、池化層S4、卷積層C5 設計五級流水線架構,如圖3 所示。

圖3 五級流水線架構

2.3 分模塊設計

2.3.1 浮點數定點化

CNN 訓練完成得到模型的參數分別為各卷積層所需要的卷積核權值及其偏置的值,經過軟件部分的訓練,上述參數值大小介于-10 與10之間。 對于FPGA 而言,不能直接處理浮點數,處理正負數小數需要將其定點化為二進制補碼。Holt 等人[12]研究發現16bit 定點數既能維持一定的分類精度,也能有效地降低能耗。 在16bit中,第一位為符號位,0 代表正,1 代表負,隨后五位為整數部分,最后10 位為小數部分。

2.3.2 緩存模塊和輸入控制模塊

對于CNN 的硬件實現來說,待識別的圖像數據輸入、每層的特征輸出都是需要下一級處理的數據,選擇合適的緩存方案來保存這些數據顯得尤為關鍵。 以待識別的圖像輸入數據為例,圖像數據是32*32bit,考慮到后續卷積操作中卷積核大小為5*5,相較于直接采用5 組寄存器的行緩存結構,采用4 組寄存器串聯和一條數據輸入流組成5 行行緩存結構不僅更能節省FPGA 片上資源,而且更適合需要快速讀入緩存數據的情況。 讀取圖像像素數據流是串行讀入,在每個時鐘周期,優先讀取的數據從左到右,從上到下依次流入。 該結構如圖4 所示。

圖4 5 行行緩存結構

在上述行緩存結構中,在每個時鐘周期,卷積窗口從左至右,從上到下移動一個像素,實現每個窗口下的卷積運算。 在卷積層與池化層之間的緩存器中,在每個時鐘周期,2*2 池化窗口從左往右、從上至下依次平移一個像素,對兩行緩存數據進行最大池化操作。

控制模塊主要是通過輸出使能信號來控制池化層S2、卷積層C3、池化層S4、卷積層C5 的數據輸入輸出。 卷積層C1 即時處理串行流入的數據,由卷積窗口在像素值上左右上下滑動,橫向上,在卷積窗口滑動至第28 個像素值后需要在第二行的第一個像素值繼續向右滑動,滑動至第5 行第5 個像素值之后,卷積層C1 輸出第一個卷積窗口的卷積結果。 圖解如圖5 所示。

圖5 控制模塊C1 圖解

池化層S2 在接收到C1 層第一個卷積結果的同時開始工作,因此當池化層S2 的計數器,經過4*32+5=133 個時鐘后,S2 的使能信號s2_en 置為高電平1,接收數據。 除此以外,池化層S2 還需對卷積層C1 數據取舍,每32 個數據中的最后4 個數據是無效數據。 因此池化層S2 開始工作后,每隔28 個時鐘需要將使能信號由高電平1 置為低電平0,低電平持續4 個時鐘周期后再置為高電平1,往復循環,直到得到所有卷積層C1 的特征輸出,如圖6 所示。

圖6 控制模塊S2 圖解

卷積層C3 必須等到池化層S2 輸出第一個最大池化結果后開始工作。 S2 層輸出一個最大池化結果需要四個C1 層的卷積輸出,卷積窗口在第二行像素上滑動到第二個卷積輸出后,會得到第一個S2 層池化結果。 所以,320+20=340個時鐘周期后,卷積層C3 開始讀入數據。 在橫向上,池化操作的池化窗口滑動步長為2,卷積層C3 的使能信號每隔一個時鐘周期高低電平交替變換,即高電平每2 個時鐘周期出現一次,重復14 次。 縱向上步長也為2,偶數行的池化層S2 特征輸出全部舍去,在使能信號上就表現為重復14 次高低電平后,使能信號置低電平持續280 個時鐘周期后還需要40 個時鐘周期,共計320 個周期得到下一行的池化操作輸出,并以此規律取遍所有數據。 池化層S2 輸入使能信號S2_en 和卷積層C3 輸入使能信號C3_en 的時序邏輯如圖7 所示。 池化層S4、卷積層C5 使能信號的獲得同上。

圖7 使能信號時序邏輯

2.3.3 卷積模塊

相對來說我國是一個淡水資源比較缺乏的國家,為世界13個赤水國家之一。在我國的農業的生產中,我國每年的農業灌溉用水量約4 00多億m3。我國淡水資源比較缺乏,但是農業用水占總用水量比重比較多,在農業灌溉方面浪費情況嚴重。在我國的現有的水資源基礎上,滿足我國農業生產所需灌溉用水需求,對于農業提出了一個更高的要求。

CNN 中卷積層是CNN 中最核心的部分。卷積窗口在輸入像素上依次滑動,卷積窗口的每一個權值與窗口內像素點做內積。

CNN 模型的通道個數稱為深度,二維圖像的特征輸出由輸入深度和卷積核的數量共同決定。 對于LeNet-5 來說,卷積層的卷積運算是建立在多通道的卷積運算基礎上,不同通道的卷積運算互不干擾,而且不同通道的卷積運算動作完全一致,因此本文采用核間全并行的方式實現多通道卷積運算,以卷積層C1 六通道為例,其實現結構如圖8 所示。

圖8 核間全并行實現結構

卷積模塊中的卷積操作涉及乘法和加法運算。 以5*5 卷積窗口和5*5 像素卷積操作為例,需要進行25 次乘法操作。 偽代碼如下所示。

卷積模塊中的加法操作即是對卷積窗口中得到的25 個乘法結果進行累加得到一個卷積窗口的卷積結果。 為了發揮FPGA 并行計算的優勢,采用加法樹結構實現核內運算的部分并行,如圖9 所示。

圖9 卷積加法樹結構

每個時鐘下進行兩兩加法求和,第一輪一個時鐘周期內并行執行12 組加法運算,第二輪一個時鐘周期內并行執行6 組加法運算,以此類推,第五輪得到最終卷積結果。 相較于普通串行實現的累加運算,使用加法樹結構,可以實現并行高效的累加運算。 卷積操作的結構方案如圖10 所示,因篇幅原因,加法樹只畫一部分。

圖10 卷積操作結構方案

綜上,考慮到采用核間全并行、核內部分并行的方式實現卷積層的卷積運算操作,卷積層的輸出采用輸出部分并行的方式實現,不同通道的卷積運算結果并行輸出,相同通道的卷積核滑動運算結果串行輸出。

卷積模塊后,需要對卷積結果進行Relu 函數激活。 Relu 模塊采用的激活函數如下所示。

2.3.4 池化模塊

池化層主要通過減少網絡的參數來減小計算量,并且能夠在一定程度上控制過擬合。 本文采用最大池化方案,相較于卷積操作,最大池化操作窗口只需要對2*2=4 個特征輸入進行取大操作。 參考卷積模塊中的加法樹結構,本文中最大池化操作采用如圖11 所示的池化樹結構:從兩行緩存器中輸入待比較的數據,兩兩比較大小,得到一個池化窗口四個特征輸入的最大值輸出。

圖11 池化樹結構

3 實驗與實驗結果分析

本文實驗仿真工具采用Mentor 公司的Modelsim 10.5,通過圖12 所示的仿真結果可以看到,在經歷32*4+4 個時鐘周期(1320ns)后得到卷積層C1 的輸出;在卷積層C1 輸出第一個卷積結果后,經歷32 *1+2 個時鐘周期(340ns)后得到池化層S2 的輸出,后續的C3、S4、C5 等層同理。 在經過10735 個時鐘周期后得到卷積層C5 的輸出結果。

圖12 Modelsim 仿真結果圖

本文實驗選用Xilinx Zynq 架構的開發板xc7z010clg400-2,CPU 采用主頻為2.3Ghz 的i5-6300HQ 處理器。 在相同的權值數據和模型下,在Vivado 18.3 下綜合,各資源占用情況與其他相關研究對比如表1 所示。

表1 資源占用情況對比

圖13 為綜合后時序報告,時鐘信號的最差負松弛WNS 指標為2.296ns。

圖13 綜合時序報告

在不同FPGA 平臺的縱向對比上,計算性能是一個比較關鍵的指標,通常用單位GOP /s(每秒十億次運算數) 來描述,計算公式如式1。

其中P代表計算性能,Clk_num是總執行時鐘周期數,即完成運算所需要的時鐘周期的個數,Opt是CNN 中涉及乘加運算的總運算數,Frem是最高時鐘頻率,單位為MHz。 各層的運算數如表2 所示。

表2 各層運算數

經分析統計,本方案前向預測過程的總運算數為16936188 次。 在Vivado 中,Frem最高時鐘頻率由公式2 得到,其中T 為綜合預設時鐘周期。 本文預設時鐘周期T 為10ns,WNS 為2.296ns,可以計算得到本方案最大時鐘頻率為129.8MHz。

把上述參數,代入式1,可以得到本方案的計算性能為

本方案設計卷積-池化-卷積-池化-卷積五級流水線結構來提高系統吞吐量。 吞吐量TPS的計算如式3 所示。

BITS為t時間內運算的比特數,Frem是最高時鐘頻率,N為流水線級數。 在最高時鐘頻率129.8MHz 下系統需要經歷10735 個時鐘周期得到運算結果,即t=8270.4ns 后得到結果。 本方案的系統吞吐量為

在129.8MHz 最大時鐘頻率下,表3 列出了本方案與其他方案在計算性能和功耗方面的對比。 文獻[11]和文獻[15]采用Zynq 系列開發板,處理精度采用8bit 定點數,能夠以較小的功耗實現加速設計,但是相較于16bit 定點數,計算精度和計算性能都存在差距。 相較于其他文獻方案,本文方案能效比沒有太大優勢:相較于文獻[14],本文方案有較低的功耗;相較于文獻[15]和文獻[16],本文方案有較高的計算性能;相較于文獻[17],本文方案,在計算性能沒有明顯優勢的情況下,有著較低的功耗。

表3 加速器方案性能能耗對比

本硬件加速方案和在采用主頻為2.3Ghz 的CPU 下基于python 實現LeNet-5 網絡的正向預測的所需時間對比如表4 所示,較CPU 實現速度提升近337 倍,實現了CNN 加速功能。

表4 計算時間對比

4 結語

本文通過對一種典型的CNN 的權值參數和網絡結構進行分析,提出了一種CNN 加速器硬件實現方案:采用16 位定點量化方案和一種新的行緩存乘法-加法樹結構,設計卷積-池化-卷積-池化-卷積五級流水線結構實現卷積核間全并行、核內部分并行、輸出部分并行的卷積池化方案。 在129.8MHz 最高時鐘頻率和定點化16bit 精度的實驗情況下,系統對單張圖片的處理速度較CPU 提高近337 倍。 在功耗為14.967W 的情況下, 系統計算性能達204.78GOP/s,能效比為13.68GOP/(s*W),系統吞吐量為1028.56Gbit/s。 后續工作將集中以下兩點:1. 對定點數精度選擇帶來收益損失進行研究;2. 選擇更復雜的神經網絡模型,在提高運算量的基礎上優化加速器軟硬協同結構,在降低片上資源消耗的基礎上進一步提高加速器的性能。

猜你喜歡
池化層池化權值
基于高斯函數的池化算法
一種融合時間權值和用戶行為序列的電影推薦模型
卷積神經網絡中的自適應加權池化
卷積神經網絡模型研究分析*
CONTENTS
基于卷積神經網絡的紙幣分類與點鈔
基于深度學習卷積神經網絡的人體行為識別研究
基于卷積神經網絡和池化算法的表情識別研究
基于全卷積神經網絡的SAR圖像目標分類*
用于手寫漢字識別的文本分割方法
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合