張小軍, 王俊英, 王曉靜, 韓 欽, 王正榮, 張德學(xué)
(1.山東科技大學(xué)電子信息工程學(xué)院,山東青島 266590;2.高效能服務(wù)器和存儲(chǔ)技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,濟(jì)南 250101)
近年來(lái),卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)已成功應(yīng)用于目標(biāo)檢測(cè)、圖像識(shí)別和自然語(yǔ)言處理等人工智能領(lǐng)域[1-2]。在神經(jīng)網(wǎng)絡(luò)開(kāi)發(fā)的硬件平臺(tái)中,F(xiàn)PGA相對(duì)于GPU和CPU具有更高的能效,與ASIC 相比可擴(kuò)展性更好、開(kāi)發(fā)周期更短[3]。故基于FPGA的加速平臺(tái)成為一種極具潛力的計(jì)算方案[4]。盡管得益于近年集成電路工藝特征尺寸的減小,F(xiàn)PGA單片資源數(shù)增加明顯,但仍舊難以滿足搭建大規(guī)模CNN的需求。因此,采用多個(gè)FPGA可提高大規(guī)模神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練效率[5]。
與單FPGA 的硬件加速系統(tǒng)只考慮算法映射相比,多FPGA 的CNN 硬件加速由于包含算法拆分、算法映射與多FPGA 通信等機(jī)制,其實(shí)現(xiàn)復(fù)雜性大幅提高[6-7]。分布式加速分為數(shù)據(jù)并行和模型并行。其中數(shù)據(jù)并行在不同CNN 層中應(yīng)用的配置不同,F(xiàn)PGA 需要在層間重新配置,以實(shí)現(xiàn)每一層的優(yōu)化設(shè)計(jì)。為降低多FPGA加速器的實(shí)現(xiàn)復(fù)雜度,提高CNN的執(zhí)行效率,眾多國(guó)內(nèi)外學(xué)者對(duì)其展開(kāi)了研究。Zhang 等[8]提出一種深度流水線多FPGA設(shè)計(jì),使總吞吐量最大化。Sharma等[9]基于Caffe 框架中的CNN規(guī)范,提出一種為多FPGA平臺(tái)生成可合成加速器的技術(shù)。為減少片外訪問(wèn),Alwani 等[10]改變計(jì)算模式,為計(jì)算多個(gè)卷積層提供了更好的緩存空間。Lian 等[11]利用軟件控制執(zhí)行并將計(jì)算密集型操作加載到硬件加速器,提出一種基于多FPGA數(shù)據(jù)并行方案,批量處理數(shù)據(jù)集,實(shí)現(xiàn)了深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks,DNN)推理加速。以上工作主要探索了CNN 在多FPGA 平臺(tái)上的推理加速,在多FPGA的存儲(chǔ)和計(jì)算方面進(jìn)行了研究。但基于多FPGA 的訓(xùn)練網(wǎng)絡(luò)的相關(guān)工作較少?;贔PGA采用反向傳播(Back Propagation,BP)算法訓(xùn)練CNN的過(guò)程中存在計(jì)算強(qiáng)度不平衡,導(dǎo)致整體性能降低。肖望勇[12]提出一種軟件訓(xùn)練、硬件加速方案,通過(guò)改進(jìn)手寫數(shù)字識(shí)別架構(gòu)算法,采用Python 訓(xùn)練CNN參數(shù)并通過(guò)高層綜合語(yǔ)言設(shè)計(jì)基于FPGA的手寫數(shù)字識(shí)別系統(tǒng)。Geng 等[13]優(yōu)化可擴(kuò)展框架,有效將CNN訓(xùn)練邏輯映射到多個(gè)FPGA。Jiang 等[14]提出一種新硬件和軟件協(xié)同探索框架,用于高效神經(jīng)架構(gòu)搜索,縮短訓(xùn)練時(shí)間。神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程主要通過(guò)誤差BP算法完成,反向訓(xùn)練運(yùn)算處理單元與前向重合度較高,數(shù)據(jù)間存在高度的依賴性,針對(duì)CNN 架構(gòu),優(yōu)化整體架構(gòu),調(diào)整計(jì)算時(shí)序,實(shí)現(xiàn)多FPGA分布式神經(jīng)網(wǎng)絡(luò)訓(xùn)練加速實(shí)驗(yàn)。主要工作如下:
(1)根據(jù)BP算法,完成CNN 訓(xùn)練。采用數(shù)據(jù)并行分布式模型,拆分圖片訓(xùn)練集,進(jìn)行并行訓(xùn)練,實(shí)現(xiàn)多FPGA分布式CNN的訓(xùn)練加速。
(2)根據(jù)各層數(shù)據(jù)的依賴性,改變矩陣內(nèi)部卷積順序,實(shí)現(xiàn)層內(nèi)和層間的細(xì)粒度流水線設(shè)計(jì),降低計(jì)算延遲。
(3)根據(jù)各層卷積核特點(diǎn),提出一種數(shù)據(jù)拼接方案,根據(jù)需求選擇不同的數(shù)據(jù)拼接方案,解決卷積運(yùn)算造成的存儲(chǔ)資源消耗過(guò)大。根據(jù)不同層數(shù)據(jù)分布特征,各層之間選用不同定點(diǎn)量化方案,進(jìn)一步降低存儲(chǔ)資源消耗。
(4)搭建多FPGA測(cè)試平臺(tái),采用QSFP光纖接口進(jìn)行通信,優(yōu)化Ring-Allreduce 數(shù)據(jù)傳輸方案,測(cè)試表明,多FPGA測(cè)試可得到近似線性加速比。
為提取圖片特征,卷積層中卷積核與輸入矩陣做卷積運(yùn)算,提取數(shù)據(jù)特征值。輸入特征和權(quán)重經(jīng)卷積得到輸出特征。設(shè)卷積層輸入尺寸為M×M,卷積核的尺寸為N×N,卷積步長(zhǎng)為S,填充為P,可得多通道輸出二維矩陣
池化層用于減少圖片中特征數(shù)量,降低計(jì)算量,主要分為最大池化和平均池化,平均池化由于減少估計(jì)值方差,增大誤差,更大限度地保留了圖像的背景信息。平均池化后的圖像信息。
式中:datai為池化層的輸入矩陣元素;l×l為池化層的窗口元素尺寸。
全連接層對(duì)數(shù)據(jù)特征進(jìn)行拼接計(jì)算,分類輸出。輸入矩陣由三維轉(zhuǎn)化成二維矩陣,與多組單通道權(quán)重運(yùn)算,得到多個(gè)神經(jīng)元輸出。CNN 中的激活函數(shù)改變架構(gòu)內(nèi)部線性運(yùn)算特性,對(duì)輸出進(jìn)行判斷,采用Sigmoid作為激活函數(shù)。
BP算法稱為誤差反向傳播,結(jié)合梯度下降完成對(duì)權(quán)重和偏置的更新,每層更新對(duì)應(yīng)參數(shù)并通過(guò)誤差損失函數(shù)傳遞到前層,達(dá)到訓(xùn)練效果。BP算法的本質(zhì)為鏈?zhǔn)角髮?dǎo)過(guò)程,前向推理運(yùn)算完成后,進(jìn)行BP 更新參數(shù)。CNN逐層傳遞,經(jīng)過(guò)鏈?zhǔn)角髮?dǎo)
通過(guò)損失函數(shù)的傳遞更新參數(shù)。最終通過(guò)鏈?zhǔn)椒▌t實(shí)現(xiàn)整個(gè)架構(gòu)反向流動(dòng)。BP 由誤差傳遞以及參數(shù)更新兩部分組成。
采用細(xì)粒度流水線提高訓(xùn)練速度,實(shí)現(xiàn)高吞吐率。提出一種數(shù)據(jù)拼接讀寫方案減少存儲(chǔ)資源消耗,優(yōu)化激活函數(shù)及池化層硬件實(shí)現(xiàn)方案,減少計(jì)算資源的消耗,提高內(nèi)部運(yùn)算效率。分布式CNN 訓(xùn)練過(guò)程中多FPGA之間采用光模塊互聯(lián),減少板間通信延遲。
神經(jīng)網(wǎng)絡(luò)整體訓(xùn)練架構(gòu)由片外存儲(chǔ)CNN數(shù)據(jù)集,F(xiàn)PGA內(nèi)部增加緩沖區(qū),解決讀取數(shù)據(jù)滯后,節(jié)省數(shù)據(jù)讀取時(shí)間。緩沖區(qū)預(yù)存并加載數(shù)據(jù)集,初始化參數(shù)存儲(chǔ)到內(nèi)部存儲(chǔ)器。如圖1 所示,F(xiàn)PGA 內(nèi)部CNN 架構(gòu)由卷積層、池化層和全連接層構(gòu)成,BP 更新權(quán)重和偏置,完成一輪訓(xùn)練。權(quán)重和偏置更新后進(jìn)行新一輪迭代。多FPGA之間通過(guò)光纖通信完成板間傳輸,實(shí)現(xiàn)數(shù)據(jù)同步。訓(xùn)練完成后,輸入測(cè)試集測(cè)試訓(xùn)練性能。
圖1 多FPGA分布式結(jié)構(gòu)
卷積運(yùn)算通過(guò)RAM 存儲(chǔ)不同地址,實(shí)現(xiàn)矩陣像素位置的移動(dòng),經(jīng)過(guò)乘加模塊得到卷積結(jié)果。已知卷積核為N×N,輸入為M×M,步長(zhǎng)為S,池化層的核為l×l,步長(zhǎng)為t,得到輸出矩陣:
根據(jù)式(4)可得卷積計(jì)算預(yù)估時(shí)鐘個(gè)數(shù)。后經(jīng)過(guò)激活函數(shù),寫入RAM數(shù)據(jù)存儲(chǔ)器。式(5)為卷積后的第1 個(gè)像素點(diǎn)所需clock個(gè)數(shù),第1 個(gè)像素點(diǎn)進(jìn)行卷積運(yùn)算所需clock數(shù)可用式(6)表示,式(7)為其余像素點(diǎn)所需clock 個(gè)數(shù),其余像素點(diǎn)進(jìn)行卷積運(yùn)算所需clock數(shù)可用式(8)表示。式(9)為池化之后第1 個(gè)像素點(diǎn)所需clock個(gè)數(shù),式(10)為其余像素點(diǎn)所需clock數(shù)量,所有像素點(diǎn)卷積與池化后所需clock 個(gè)數(shù)可用式(11)表示。O1和O2分別為卷積和池化后像素點(diǎn)的大小。若未采用流水線設(shè)計(jì),O1和O2的大小為卷積和池化后本層輸出矩陣大小,細(xì)粒度流水線設(shè)計(jì)是從存儲(chǔ)器中提前讀取數(shù)據(jù),改變像素點(diǎn)計(jì)算順序,減小O1和O2,從而減小Xc。當(dāng)O1和O2大小滿足下一層卷積核大小時(shí),進(jìn)行下一層運(yùn)算。如圖2、3 所示,由后層卷積核大小決定L層卷積結(jié)果的運(yùn)算順序,在L層卷積未完成的情況下,滿足L+1 層的像素點(diǎn)窗口條件后提前進(jìn)行L+1 層運(yùn)算。采用細(xì)粒度流水線方案,可縮短47.8%的運(yùn)算時(shí)長(zhǎng)。
圖2 流水線加速
圖3 卷積運(yùn)算示意圖
當(dāng)前數(shù)據(jù)寫入RAM,狀態(tài)機(jī)判斷讀寫地址關(guān)系,發(fā)送讀使能信號(hào),無(wú)須滿足全部數(shù)據(jù)存入后的延時(shí),即可進(jìn)行下一步計(jì)算。根據(jù)以上2 種方式做細(xì)粒度流水完成各層運(yùn)算。在保證頻率相對(duì)較高的基礎(chǔ)上,縮短了圖片訓(xùn)練時(shí)長(zhǎng)。
存儲(chǔ)器主要存儲(chǔ)權(quán)重、偏置和每層輸出數(shù)據(jù)做前向傳播運(yùn)算以及BP運(yùn)算。設(shè)卷積核為N×N,卷積層硬件實(shí)現(xiàn)是將輸入的數(shù)據(jù)和權(quán)重同時(shí)存儲(chǔ)到N個(gè)RAM存儲(chǔ)器,從N個(gè)RAM 中同時(shí)讀取不同地址的N個(gè)數(shù)據(jù)進(jìn)行卷積運(yùn)算,分批次處理部分?jǐn)?shù)據(jù)的乘加,經(jīng)過(guò)N個(gè)時(shí)鐘運(yùn)算,得到輸出矩陣的一個(gè)元素。通過(guò)設(shè)置存儲(chǔ)基地址偏移量,實(shí)現(xiàn)卷積核在輸入矩陣中的小窗口移位卷積計(jì)算,地址橫向移動(dòng),依次處理每個(gè)卷積核運(yùn)算。在數(shù)據(jù)讀取過(guò)程中,滿足不同地址數(shù)據(jù)的同時(shí)讀寫,并行輸出N個(gè)數(shù)據(jù)做乘加運(yùn)算,這種方案存儲(chǔ)資源消耗過(guò)大,增加了(N-1)倍的片內(nèi)資源。提出一種既節(jié)省存儲(chǔ)資源又可在消耗較少的時(shí)鐘下完成對(duì)整個(gè)矩陣的卷積計(jì)算方法。圖4 是數(shù)據(jù)進(jìn)行卷積的硬件結(jié)構(gòu)。假設(shè)N=5,將5 個(gè)數(shù)據(jù)進(jìn)行并行拼接且存儲(chǔ)到RAM的一個(gè)地址中,此時(shí)RAM內(nèi)部存儲(chǔ)位寬是原來(lái)的5 倍,深度變成原來(lái)的1/5。RAM 采用雙端口設(shè)計(jì),根據(jù)卷積計(jì)算特點(diǎn)進(jìn)行數(shù)據(jù)選擇,每個(gè)時(shí)鐘可以讀出兩組由5 個(gè)輸入數(shù)據(jù)并行拼接的數(shù)據(jù)。令步長(zhǎng)為1,可組合成(N+1)個(gè)數(shù)據(jù)卷積運(yùn)算,每個(gè)clock 完成(N+1)個(gè)像素點(diǎn)的1/N部分計(jì)算,N個(gè)時(shí)鐘就可完成(N+1)個(gè)像素點(diǎn)計(jì)算。以本文反向卷積運(yùn)算、核為24 ×24 為例,輸入矩陣尺寸為28 ×28,內(nèi)部元素采用24 個(gè)數(shù)值拼接,存儲(chǔ)到1 個(gè)地址中,RAM 采用雙口讀寫,解決每個(gè)clock同時(shí)讀取24 個(gè)數(shù)據(jù)以及所需卷積元素跨2 個(gè)地址卷積運(yùn)算。
圖4 卷積硬件結(jié)構(gòu)
為節(jié)省硬件內(nèi)部計(jì)算資源,平均池化采用移位運(yùn)算實(shí)現(xiàn)。激活函數(shù)采用分段非線性擬合法[15]實(shí)現(xiàn),增加移位運(yùn)算以減少乘法器數(shù)量,降低由乘法運(yùn)算帶來(lái)的資源消耗。
基于多FPGA分布式CNN數(shù)據(jù)傳輸方案:
式(12)為板間數(shù)據(jù)傳輸所消耗的時(shí)間,由數(shù)據(jù)計(jì)算時(shí)間Tt1和數(shù)據(jù)輸出串、并轉(zhuǎn)換時(shí)間Tsp以及板間傳輸時(shí)間Ttran組成。式(13)~(15)為數(shù)據(jù)經(jīng)過(guò)FPGA傳輸?shù)臄?shù)據(jù)累加。數(shù)據(jù)傳輸方式如圖5(a)所示,經(jīng)過(guò)完整的3 輪循環(huán)數(shù)據(jù)傳輸,根據(jù)式(13)~(15),數(shù)據(jù)從3 個(gè)FPGA內(nèi)部傳輸,完成3 組數(shù)據(jù)累加,耗時(shí)6Ttran后,將一組數(shù)據(jù)傳輸?shù)矫總€(gè)FPGA 內(nèi)部,這種數(shù)據(jù)傳輸方式重復(fù)性高,耗時(shí)長(zhǎng)。因此采用圖5(b)方案?jìng)鬏敂?shù)據(jù)。在FPGA3接收來(lái)自FPGA1和FPGA2的數(shù)據(jù)之后,結(jié)合FPGA3內(nèi)部數(shù)據(jù)完成計(jì)算,分別傳輸?shù)紽PGA1和FPGA2,耗時(shí)3Ttran,循環(huán)一周完成數(shù)據(jù)累加,減少數(shù)據(jù)傳輸時(shí)間T,也減少了數(shù)據(jù)的傳輸量。
圖5 Ring-Allreduce數(shù)據(jù)傳輸
為節(jié)省硬件資源消耗,減少邏輯運(yùn)算,選用定點(diǎn)量化進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練。量化方案
式中:QS為符號(hào)位;QI為整數(shù)位;QF為小數(shù)位。
在不同量化方案,對(duì)Mnist數(shù)據(jù)集訓(xùn)練性能統(tǒng)計(jì),見(jiàn)表1。當(dāng)選用QS為1、QI為1、QF為6,即Q(1,1,6)方案時(shí),錯(cuò)誤率高達(dá)91.08%。選用Q(1,5,10)方案,錯(cuò)誤率為12.97%,與Q(1,10,21)方案2.75%的錯(cuò)誤率相比仍差距過(guò)大,因此針對(duì)各梯度數(shù)據(jù)分布統(tǒng)計(jì),設(shè)計(jì)一種位寬可變精度方案。統(tǒng)計(jì)表明,卷積層輸出數(shù)據(jù)在0.1 ~1 之間,池化層數(shù)據(jù)分布主要集中在0.01 ~1 之間,卷積層4 的梯度數(shù)據(jù)分布主要集中在10-1~10-4之間,卷積層2 的梯度數(shù)據(jù)分布主要集中在10-2~10-5之間。預(yù)留乘加運(yùn)算溢出位寬,量化方案為BP全連接層選用Q(1,5,10),卷積層分別選用Q(1,2,13)和Q(1,0,15)的數(shù)據(jù)精度,得到錯(cuò)誤率為4.93%,與32 位寬相比,僅相差2%,因此選用16 位可變精度量化方案進(jìn)行圖片訓(xùn)練。
表1 訓(xùn)練識(shí)別效果
如圖6 所示,分布式CNN 數(shù)據(jù)傳輸由3 個(gè)FPGA互聯(lián),并行訓(xùn)練多張圖片。FPGA 之間依次傳輸每一層更新后的參數(shù),根據(jù)圖5(b)中的Ring-Allreduce 傳輸模式進(jìn)行板間傳輸。采用QSFP 光纖接口傳輸數(shù)據(jù),以減小數(shù)據(jù)傳輸延遲對(duì)訓(xùn)練速度的影響,板間添加異步FIFO解決數(shù)據(jù)不同步問(wèn)題,最終實(shí)現(xiàn)板間高速通信。采用數(shù)據(jù)并行分布式訓(xùn)練,完成圖片的訓(xùn)練,工作頻率為154.54 MHz。由于多FPGA之間存在數(shù)據(jù)傳輸耗時(shí),相較于單FPGA,2FPGA 和3FPGA 的加速比為1.99 和2.98。則:
圖6 多FPGA互聯(lián)實(shí)驗(yàn)裝置
式(17)為某一層乘法器的個(gè)數(shù),式(18)為某一層加法器的個(gè)數(shù),其中:O為對(duì)應(yīng)層輸出大?。籆in為輸入通道;Cout為輸出通道。計(jì)算整體架構(gòu)包括BP 中的乘法器和加法器的總和近似得到整個(gè)訓(xùn)練架構(gòu)的計(jì)算性能,并根據(jù)時(shí)鐘頻率得到整體性能。根據(jù)表2 的性能比對(duì),單FPGA 選用16 位定點(diǎn)訓(xùn)練得到的吞吐量是CPU的4.3 倍,是在Altera Stratix V 平臺(tái)下選用4 位定點(diǎn)數(shù)的3.25 倍,比在Xilinx KCU1500 平臺(tái)下,借助自適應(yīng)精度隨機(jī)梯度下降(Stochastic Gradient Descent,SGD),采用軟、硬件結(jié)合選用8 位定點(diǎn)位寬訓(xùn)練性能低,其影響因素包括除采用性能較好的開(kāi)發(fā)平臺(tái)外,選用了比16 位少一倍的位寬,但8 位定點(diǎn)位寬的吞吐量比3FPGA分布式并行訓(xùn)練選用16 位定點(diǎn)位寬得到的吞吐量低,整體性能也相對(duì)較好,且16 位定點(diǎn)位寬訓(xùn)練得到的正確率也會(huì)相對(duì)較高。
表2 性能對(duì)比
表3 為每個(gè)FPGA內(nèi)部整體未優(yōu)化和優(yōu)化過(guò)后的資源占用對(duì)比情況。優(yōu)化過(guò)后,以犧牲少量的ALM和DSP資源,減少了大量block memory存儲(chǔ)資源。
表3 資源消耗
本文設(shè)計(jì)了一種基于FPGA分布式神經(jīng)網(wǎng)絡(luò)訓(xùn)練加速器,實(shí)現(xiàn)了基于多FPGA 訓(xùn)練加速,完成資源優(yōu)化,提高整體性能。采用數(shù)據(jù)并行訓(xùn)練,優(yōu)化實(shí)現(xiàn)多通道并行計(jì)算,內(nèi)部架構(gòu)采用層內(nèi)和層間細(xì)粒度流水線設(shè)計(jì),縮短了訓(xùn)練時(shí)長(zhǎng),提高了整體效率。反向訓(xùn)練過(guò)程優(yōu)化量化位數(shù),在降低資源消耗的基礎(chǔ)上,提升整體訓(xùn)練精度。優(yōu)化Ring-Allreduce數(shù)據(jù)傳輸方案,提高了數(shù)據(jù)傳輸速率,實(shí)現(xiàn)了2FPGA為1.99,3FPGA為2.98的加速比。