張小軍, 王俊英, 王曉靜, 韓 欽, 王正榮, 張德學
(1.山東科技大學電子信息工程學院,山東青島 266590;2.高效能服務器和存儲技術國家重點實驗室,濟南 250101)
近年來,卷積神經網絡(Convolutional Neural Networks,CNN)已成功應用于目標檢測、圖像識別和自然語言處理等人工智能領域[1-2]。在神經網絡開發的硬件平臺中,FPGA相對于GPU和CPU具有更高的能效,與ASIC 相比可擴展性更好、開發周期更短[3]。故基于FPGA的加速平臺成為一種極具潛力的計算方案[4]。盡管得益于近年集成電路工藝特征尺寸的減小,FPGA單片資源數增加明顯,但仍舊難以滿足搭建大規模CNN的需求。因此,采用多個FPGA可提高大規模神經網絡模型的訓練效率[5]。
與單FPGA 的硬件加速系統只考慮算法映射相比,多FPGA 的CNN 硬件加速由于包含算法拆分、算法映射與多FPGA 通信等機制,其實現復雜性大幅提高[6-7]。分布式加速分為數據并行和模型并行。其中數據并行在不同CNN 層中應用的配置不同,FPGA 需要在層間重新配置,以實現每一層的優化設計。為降低多FPGA加速器的實現復雜度,提高CNN的執行效率,眾多國內外學者對其展開了研究。Zhang 等[8]提出一種深度流水線多FPGA設計,使總吞吐量最大化。Sharma等[9]基于Caffe 框架中的CNN規范,提出一種為多FPGA平臺生成可合成加速器的技術。為減少片外訪問,Alwani 等[10]改變計算模式,為計算多個卷積層提供了更好的緩存空間。Lian 等[11]利用軟件控制執行并將計算密集型操作加載到硬件加速器,提出一種基于多FPGA數據并行方案,批量處理數據集,實現了深度神經網絡(Deep Neural Networks,DNN)推理加速。以上工作主要探索了CNN 在多FPGA 平臺上的推理加速,在多FPGA的存儲和計算方面進行了研究。但基于多FPGA 的訓練網絡的相關工作較少。基于FPGA采用反向傳播(Back Propagation,BP)算法訓練CNN的過程中存在計算強度不平衡,導致整體性能降低。肖望勇[12]提出一種軟件訓練、硬件加速方案,通過改進手寫數字識別架構算法,采用Python 訓練CNN參數并通過高層綜合語言設計基于FPGA的手寫數字識別系統。Geng 等[13]優化可擴展框架,有效將CNN訓練邏輯映射到多個FPGA。Jiang 等[14]提出一種新硬件和軟件協同探索框架,用于高效神經架構搜索,縮短訓練時間。神經網絡的訓練過程主要通過誤差BP算法完成,反向訓練運算處理單元與前向重合度較高,數據間存在高度的依賴性,針對CNN 架構,優化整體架構,調整計算時序,實現多FPGA分布式神經網絡訓練加速實驗。主要工作如下:
(1)根據BP算法,完成CNN 訓練。采用數據并行分布式模型,拆分圖片訓練集,進行并行訓練,實現多FPGA分布式CNN的訓練加速。
(2)根據各層數據的依賴性,改變矩陣內部卷積順序,實現層內和層間的細粒度流水線設計,降低計算延遲。
(3)根據各層卷積核特點,提出一種數據拼接方案,根據需求選擇不同的數據拼接方案,解決卷積運算造成的存儲資源消耗過大。根據不同層數據分布特征,各層之間選用不同定點量化方案,進一步降低存儲資源消耗。
(4)搭建多FPGA測試平臺,采用QSFP光纖接口進行通信,優化Ring-Allreduce 數據傳輸方案,測試表明,多FPGA測試可得到近似線性加速比。
為提取圖片特征,卷積層中卷積核與輸入矩陣做卷積運算,提取數據特征值。輸入特征和權重經卷積得到輸出特征。設卷積層輸入尺寸為M×M,卷積核的尺寸為N×N,卷積步長為S,填充為P,可得多通道輸出二維矩陣
池化層用于減少圖片中特征數量,降低計算量,主要分為最大池化和平均池化,平均池化由于減少估計值方差,增大誤差,更大限度地保留了圖像的背景信息。平均池化后的圖像信息。
式中:datai為池化層的輸入矩陣元素;l×l為池化層的窗口元素尺寸。
全連接層對數據特征進行拼接計算,分類輸出。輸入矩陣由三維轉化成二維矩陣,與多組單通道權重運算,得到多個神經元輸出。CNN 中的激活函數改變架構內部線性運算特性,對輸出進行判斷,采用Sigmoid作為激活函數。
BP算法稱為誤差反向傳播,結合梯度下降完成對權重和偏置的更新,每層更新對應參數并通過誤差損失函數傳遞到前層,達到訓練效果。BP算法的本質為鏈式求導過程,前向推理運算完成后,進行BP 更新參數。CNN逐層傳遞,經過鏈式求導
通過損失函數的傳遞更新參數。最終通過鏈式法則實現整個架構反向流動。BP 由誤差傳遞以及參數更新兩部分組成。
采用細粒度流水線提高訓練速度,實現高吞吐率。提出一種數據拼接讀寫方案減少存儲資源消耗,優化激活函數及池化層硬件實現方案,減少計算資源的消耗,提高內部運算效率。分布式CNN 訓練過程中多FPGA之間采用光模塊互聯,減少板間通信延遲。
神經網絡整體訓練架構由片外存儲CNN數據集,FPGA內部增加緩沖區,解決讀取數據滯后,節省數據讀取時間。緩沖區預存并加載數據集,初始化參數存儲到內部存儲器。如圖1 所示,FPGA 內部CNN 架構由卷積層、池化層和全連接層構成,BP 更新權重和偏置,完成一輪訓練。權重和偏置更新后進行新一輪迭代。多FPGA之間通過光纖通信完成板間傳輸,實現數據同步。訓練完成后,輸入測試集測試訓練性能。

圖1 多FPGA分布式結構
卷積運算通過RAM 存儲不同地址,實現矩陣像素位置的移動,經過乘加模塊得到卷積結果。已知卷積核為N×N,輸入為M×M,步長為S,池化層的核為l×l,步長為t,得到輸出矩陣:
根據式(4)可得卷積計算預估時鐘個數。后經過激活函數,寫入RAM數據存儲器。式(5)為卷積后的第1 個像素點所需clock個數,第1 個像素點進行卷積運算所需clock數可用式(6)表示,式(7)為其余像素點所需clock 個數,其余像素點進行卷積運算所需clock數可用式(8)表示。式(9)為池化之后第1 個像素點所需clock個數,式(10)為其余像素點所需clock數量,所有像素點卷積與池化后所需clock 個數可用式(11)表示。O1和O2分別為卷積和池化后像素點的大小。若未采用流水線設計,O1和O2的大小為卷積和池化后本層輸出矩陣大小,細粒度流水線設計是從存儲器中提前讀取數據,改變像素點計算順序,減小O1和O2,從而減小Xc。當O1和O2大小滿足下一層卷積核大小時,進行下一層運算。如圖2、3 所示,由后層卷積核大小決定L層卷積結果的運算順序,在L層卷積未完成的情況下,滿足L+1 層的像素點窗口條件后提前進行L+1 層運算。采用細粒度流水線方案,可縮短47.8%的運算時長。

圖2 流水線加速

圖3 卷積運算示意圖
當前數據寫入RAM,狀態機判斷讀寫地址關系,發送讀使能信號,無須滿足全部數據存入后的延時,即可進行下一步計算。根據以上2 種方式做細粒度流水完成各層運算。在保證頻率相對較高的基礎上,縮短了圖片訓練時長。
存儲器主要存儲權重、偏置和每層輸出數據做前向傳播運算以及BP運算。設卷積核為N×N,卷積層硬件實現是將輸入的數據和權重同時存儲到N個RAM存儲器,從N個RAM 中同時讀取不同地址的N個數據進行卷積運算,分批次處理部分數據的乘加,經過N個時鐘運算,得到輸出矩陣的一個元素。通過設置存儲基地址偏移量,實現卷積核在輸入矩陣中的小窗口移位卷積計算,地址橫向移動,依次處理每個卷積核運算。在數據讀取過程中,滿足不同地址數據的同時讀寫,并行輸出N個數據做乘加運算,這種方案存儲資源消耗過大,增加了(N-1)倍的片內資源。提出一種既節省存儲資源又可在消耗較少的時鐘下完成對整個矩陣的卷積計算方法。圖4 是數據進行卷積的硬件結構。假設N=5,將5 個數據進行并行拼接且存儲到RAM的一個地址中,此時RAM內部存儲位寬是原來的5 倍,深度變成原來的1/5。RAM 采用雙端口設計,根據卷積計算特點進行數據選擇,每個時鐘可以讀出兩組由5 個輸入數據并行拼接的數據。令步長為1,可組合成(N+1)個數據卷積運算,每個clock 完成(N+1)個像素點的1/N部分計算,N個時鐘就可完成(N+1)個像素點計算。以本文反向卷積運算、核為24 ×24 為例,輸入矩陣尺寸為28 ×28,內部元素采用24 個數值拼接,存儲到1 個地址中,RAM 采用雙口讀寫,解決每個clock同時讀取24 個數據以及所需卷積元素跨2 個地址卷積運算。

圖4 卷積硬件結構
為節省硬件內部計算資源,平均池化采用移位運算實現。激活函數采用分段非線性擬合法[15]實現,增加移位運算以減少乘法器數量,降低由乘法運算帶來的資源消耗。
基于多FPGA分布式CNN數據傳輸方案:
式(12)為板間數據傳輸所消耗的時間,由數據計算時間Tt1和數據輸出串、并轉換時間Tsp以及板間傳輸時間Ttran組成。式(13)~(15)為數據經過FPGA傳輸的數據累加。數據傳輸方式如圖5(a)所示,經過完整的3 輪循環數據傳輸,根據式(13)~(15),數據從3 個FPGA內部傳輸,完成3 組數據累加,耗時6Ttran后,將一組數據傳輸到每個FPGA 內部,這種數據傳輸方式重復性高,耗時長。因此采用圖5(b)方案傳輸數據。在FPGA3接收來自FPGA1和FPGA2的數據之后,結合FPGA3內部數據完成計算,分別傳輸到FPGA1和FPGA2,耗時3Ttran,循環一周完成數據累加,減少數據傳輸時間T,也減少了數據的傳輸量。

圖5 Ring-Allreduce數據傳輸
為節省硬件資源消耗,減少邏輯運算,選用定點量化進行神經網絡訓練。量化方案
式中:QS為符號位;QI為整數位;QF為小數位。
在不同量化方案,對Mnist數據集訓練性能統計,見表1。當選用QS為1、QI為1、QF為6,即Q(1,1,6)方案時,錯誤率高達91.08%。選用Q(1,5,10)方案,錯誤率為12.97%,與Q(1,10,21)方案2.75%的錯誤率相比仍差距過大,因此針對各梯度數據分布統計,設計一種位寬可變精度方案。統計表明,卷積層輸出數據在0.1 ~1 之間,池化層數據分布主要集中在0.01 ~1 之間,卷積層4 的梯度數據分布主要集中在10-1~10-4之間,卷積層2 的梯度數據分布主要集中在10-2~10-5之間。預留乘加運算溢出位寬,量化方案為BP全連接層選用Q(1,5,10),卷積層分別選用Q(1,2,13)和Q(1,0,15)的數據精度,得到錯誤率為4.93%,與32 位寬相比,僅相差2%,因此選用16 位可變精度量化方案進行圖片訓練。

表1 訓練識別效果
如圖6 所示,分布式CNN 數據傳輸由3 個FPGA互聯,并行訓練多張圖片。FPGA 之間依次傳輸每一層更新后的參數,根據圖5(b)中的Ring-Allreduce 傳輸模式進行板間傳輸。采用QSFP 光纖接口傳輸數據,以減小數據傳輸延遲對訓練速度的影響,板間添加異步FIFO解決數據不同步問題,最終實現板間高速通信。采用數據并行分布式訓練,完成圖片的訓練,工作頻率為154.54 MHz。由于多FPGA之間存在數據傳輸耗時,相較于單FPGA,2FPGA 和3FPGA 的加速比為1.99 和2.98。則:

圖6 多FPGA互聯實驗裝置
式(17)為某一層乘法器的個數,式(18)為某一層加法器的個數,其中:O為對應層輸出大小;Cin為輸入通道;Cout為輸出通道。計算整體架構包括BP 中的乘法器和加法器的總和近似得到整個訓練架構的計算性能,并根據時鐘頻率得到整體性能。根據表2 的性能比對,單FPGA 選用16 位定點訓練得到的吞吐量是CPU的4.3 倍,是在Altera Stratix V 平臺下選用4 位定點數的3.25 倍,比在Xilinx KCU1500 平臺下,借助自適應精度隨機梯度下降(Stochastic Gradient Descent,SGD),采用軟、硬件結合選用8 位定點位寬訓練性能低,其影響因素包括除采用性能較好的開發平臺外,選用了比16 位少一倍的位寬,但8 位定點位寬的吞吐量比3FPGA分布式并行訓練選用16 位定點位寬得到的吞吐量低,整體性能也相對較好,且16 位定點位寬訓練得到的正確率也會相對較高。

表2 性能對比
表3 為每個FPGA內部整體未優化和優化過后的資源占用對比情況。優化過后,以犧牲少量的ALM和DSP資源,減少了大量block memory存儲資源。

表3 資源消耗
本文設計了一種基于FPGA分布式神經網絡訓練加速器,實現了基于多FPGA 訓練加速,完成資源優化,提高整體性能。采用數據并行訓練,優化實現多通道并行計算,內部架構采用層內和層間細粒度流水線設計,縮短了訓練時長,提高了整體效率。反向訓練過程優化量化位數,在降低資源消耗的基礎上,提升整體訓練精度。優化Ring-Allreduce數據傳輸方案,提高了數據傳輸速率,實現了2FPGA為1.99,3FPGA為2.98的加速比。