張旭欣,張 嘉,李新增,金 婕
(上海工程技術(shù)大學(xué) 電子電氣工程學(xué)院,上海201600)
深度卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)已經(jīng)成為了當(dāng)前計(jì)算機(jī)視覺(jué)系統(tǒng)中最有前景的圖像分析方法之一。
近 年 來(lái),隨 著B(niǎo)inary-Net、Dorefa-Net、ABC-Net 等[1-3]低精度量化神經(jīng)網(wǎng)絡(luò)的深入研究,越來(lái)越多的研究集中于在FPGA 硬件中構(gòu)建定制的加速器結(jié)構(gòu),實(shí)現(xiàn)CNN 的加速[4]。 基于FPGA 的低精度量化神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)主要可分為兩類(lèi):流架構(gòu)[5-6]和層架構(gòu)[7-8]。 其中,由于流架構(gòu)實(shí)現(xiàn)了流水線化,每個(gè)階段都可以獨(dú)立處理輸入且可以針對(duì)CNN 逐層設(shè)計(jì)并優(yōu)化相應(yīng)層的加速運(yùn)算單元, 因此擁有更高的吞吐率和更低的延遲以及內(nèi)存帶寬,但其邏輯資源等消耗也相當(dāng)可觀。 因此,現(xiàn)有的基于流架構(gòu)實(shí)現(xiàn)的二值神經(jīng)網(wǎng)絡(luò)加速器研究大多是針對(duì)32×32 尺度MNIST 數(shù)據(jù)集等小尺度的圖像輸入。 而實(shí)際應(yīng)用中更多使用如448×448 尺度的YOLO、224×224 尺度的VGG 等作為骨干網(wǎng)絡(luò),一方面,大尺度輸入的網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)量往往較大(以VGG 為例,其參數(shù)量大約500 MB),高端FPGA 的片上內(nèi)存容量也僅32.1 Mb 左右,這對(duì)FPGA 實(shí)現(xiàn)CNN 加速將是資源瓶頸。 即使采用低精度量化策略,F(xiàn)PGA 有限的片上內(nèi)存資源仍捉襟見(jiàn)肘。另一方面,雖然各層運(yùn)算單元可以得到特定優(yōu)化,然而由于網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)限制,往往各層網(wǎng)絡(luò)很難實(shí)現(xiàn)計(jì)算周期的匹配,從而造成推斷性能難以進(jìn)一步提高。針對(duì)基于流架構(gòu)的二值卷積神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)存在的資源與性能的瓶頸,本文以224×224 尺度的VGG-11 網(wǎng)絡(luò)加速器設(shè)計(jì)為例,重點(diǎn)研究了大尺度的二值卷積神經(jīng)網(wǎng)絡(luò)硬件加速器設(shè)計(jì)、優(yōu)化及驗(yàn)證,主要工作如下:
(1)針對(duì)大尺度流架構(gòu)的二值VGG 卷積神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)存在的資源與性能瓶頸,提出了網(wǎng)絡(luò)模型優(yōu)化和流水線優(yōu)化的方法。
(2)設(shè)計(jì)并優(yōu)化了224×224 尺度的基于流架構(gòu)的二值VGG 卷積神經(jīng)網(wǎng)絡(luò)加速器。實(shí)驗(yàn)表明基于FPGA 平臺(tái)實(shí)現(xiàn)了81%的準(zhǔn)確率,219.9 FPS 的識(shí)別速度,相較于同類(lèi)型的加速器識(shí)別速度最高提升了33 倍。
二值卷積神經(jīng)網(wǎng)絡(luò)激活與權(quán)值均采用符號(hào)函數(shù)進(jìn)行二值化,如式(1)所示:
其中w 為單精度浮點(diǎn)權(quán)重,wb為二值權(quán)重。 在硬件設(shè)計(jì)中若以邏輯0 表示-1,邏輯1 表示1,則有:
(1)乘法運(yùn)算可簡(jiǎn)化為Xnor 運(yùn)算和PopCount 累加運(yùn)算[6]。 因此,對(duì)于特征圖r 行c 列卷積核大小為(kc,kr)的卷積運(yùn)算,如式(2)所示:
(2)二值卷積神經(jīng)網(wǎng)絡(luò)的批歸一化與符號(hào)激活函數(shù)運(yùn)算過(guò)程如圖1 所示。
圖1 批歸一化與激活
若結(jié)合歸一化與符號(hào)激活函數(shù)即y=sign (BN(x)),可得:
其中x 為前一層卷積層輸出,μ、σ 是批量輸入的均值和方差,ε、γ、β 為參數(shù),chin表示輸入通道數(shù)。
綜上所述,二值卷積運(yùn)算單元(Processing Element,PE)計(jì)算流程如下:輸入特征圖與權(quán)值經(jīng)過(guò)同或門(mén)與累加器進(jìn)行卷積運(yùn)算, 再經(jīng)閾值比較器實(shí)現(xiàn)批歸一化與激活函數(shù)運(yùn)算,硬件結(jié)構(gòu)如圖2 所示。
卷積層包含了多通道輸入與多通道輸出。 因此,單層計(jì)算引擎通常由PE 陣列構(gòu)成,如圖3 所示,計(jì)算引擎從緩沖區(qū)讀入SIMD 通道特征圖,經(jīng)PE 陣列并行計(jì)算得到多個(gè)輸出到緩沖區(qū)。
基于數(shù)據(jù)流結(jié)構(gòu)的加速器,通過(guò)層間流控模塊,逐層將二值卷積計(jì)算引擎連接起來(lái),整體結(jié)構(gòu)如圖4 所示,通過(guò)調(diào)節(jié)各層SIMD 與PE 參數(shù),可以實(shí)現(xiàn)性能與邏輯資源的最優(yōu)化。
圖2 二值卷積運(yùn)算單元
圖3 二值卷積計(jì)算引擎
圖4 數(shù)據(jù)流架構(gòu)
針對(duì)二值卷積神經(jīng)網(wǎng)絡(luò)加速器存在的資源瓶頸以及性能瓶頸,需要從網(wǎng)絡(luò)拓?fù)?、流水線運(yùn)算周期均衡等多方面進(jìn)行優(yōu)化設(shè)計(jì):
(1)由于硬件資源限制、網(wǎng)絡(luò)結(jié)構(gòu)以及大量的網(wǎng)絡(luò)參數(shù),往往造成片上存儲(chǔ)資源瓶頸,因此需要首先針對(duì)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行優(yōu)化。
(2)由于不同網(wǎng)絡(luò)層運(yùn)算量各不相同,運(yùn)算所需周期也不同,因此需要針對(duì)流水線進(jìn)行逐層的運(yùn)算優(yōu)化,平衡每層的運(yùn)算周期。
原始VGG-11 的網(wǎng)絡(luò)拓?fù)渲械氖讉€(gè)全連接Fc1 層參數(shù)量顯著高于其余各層,約占網(wǎng)絡(luò)整體參數(shù)量79%。由于其參數(shù)量過(guò)大,既造成了片上內(nèi)存資源瓶頸又導(dǎo)致計(jì)算量過(guò)大,與其余各層計(jì)算周期嚴(yán)重不均衡,使流水線阻塞造成性能瓶頸。針對(duì)上述問(wèn)題,對(duì)VGG-11 網(wǎng)絡(luò)結(jié)構(gòu)的瓶頸層進(jìn)行優(yōu)化:
(1)對(duì)原始浮點(diǎn)卷積VGG-11 進(jìn)行二值化,以有效降低內(nèi)存占用以及邏輯資源數(shù)量。
(2)在卷積層與Fc1 層之間添加全局最大池化層,將卷積層輸出特征圖從7×7 池化到1×1。
優(yōu)化后的二值VGG-11 網(wǎng)絡(luò)拓?fù)淙绫? 所示,添加全局最大池化層(Global Max Pool)后,F(xiàn)c1 層參數(shù)量降低了約49 倍,同時(shí)由于對(duì)網(wǎng)絡(luò)進(jìn)行了二值化,整體網(wǎng)絡(luò)參數(shù)所占內(nèi)存空間從511.3 MB 降低到3.66 MB,因而有效地從網(wǎng)絡(luò)結(jié)構(gòu)層面降低了內(nèi)存資源瓶頸。
表1 二值VGG-11 網(wǎng)絡(luò)拓?fù)?/p>
基于數(shù)據(jù)流架構(gòu)示意圖如圖5 所示,Initiation Interval為兩個(gè)任務(wù)間的時(shí)間間隔,Latency 為整體任務(wù)完成的延遲。 由于采用數(shù)據(jù)流架構(gòu),網(wǎng)絡(luò)加速器的吞吐率可以采用Fclk/IImax來(lái)進(jìn)行估算。 計(jì)算延遲最慢的網(wǎng)絡(luò)層會(huì)導(dǎo)致任務(wù)間的時(shí)間間隔最大為IImax,從而決定了網(wǎng)絡(luò)的吞吐率。
圖5 流水線時(shí)序圖
根據(jù)上述分析可知,消耗時(shí)鐘周期數(shù)最多的計(jì)算引擎會(huì)成為整體性能的瓶頸,從而會(huì)造成其他層資源的浪費(fèi)和性能的下降。因此,針對(duì)流水線優(yōu)化,需要針對(duì)不同的計(jì)算引擎之間進(jìn)行整體的計(jì)算周期均衡,盡可能地保證各層的計(jì)算周期相近。
為了有效提高加速器的性能與資源利用率,本文設(shè)計(jì)了不同的PE 陣列參數(shù)配置,以驗(yàn)證不同的PE 和SIMD 配置對(duì)分類(lèi)效率的影響,表2 中給出的計(jì)算陣列結(jié) 構(gòu) 參 數(shù),A 是 最 低 速 的 配 置,B、C、D、E 依 次 增 加 了PE 以及SIMD,E 是根據(jù)調(diào)整得到的最好的結(jié)果。
表2 PE 陣列配置
如表3 所示,根據(jù)表2 中SIMD 及PE 參數(shù)所對(duì)應(yīng)的各網(wǎng)絡(luò)層計(jì)算周期,通過(guò)盡可能將各網(wǎng)絡(luò)層運(yùn)算周期均衡調(diào)整,從而可以在相應(yīng)的資源占用率下實(shí)現(xiàn)最大化加速器推斷速率。
表3 運(yùn)算周期
在Ubuntu16.04 操作系統(tǒng)下,基于Pytorch 深度學(xué)習(xí)框架訓(xùn)練二值VGG-11 卷積神經(jīng)網(wǎng)絡(luò),實(shí)驗(yàn)基于CIFAR-10數(shù)據(jù)集驗(yàn)證,將數(shù)據(jù)集圖像尺寸放大到224×224 作為網(wǎng)絡(luò)輸入,數(shù)據(jù)訓(xùn)練利用NVIDIA Quadro P2000 GPU 實(shí)現(xiàn)加速。 基于流架構(gòu)二值VGG-11 加速器硬件系統(tǒng)開(kāi)發(fā)基于ZCU102 開(kāi)發(fā)板,最終硬件系統(tǒng)實(shí)現(xiàn)了81%的識(shí)別率,推斷速率、資源占用率等如表4 所示,最高實(shí)現(xiàn)了219.9 FPS。
表4 資源利用率對(duì)比
通過(guò)實(shí)驗(yàn)對(duì)比可得出如下結(jié)論:
(1)逐漸增加PE 或SIMD 的數(shù)量能提高深度神經(jīng)網(wǎng)絡(luò)加速器的推斷速率,但會(huì)占用更多邏輯資源,反之也可以通過(guò)降低推斷速率來(lái)?yè)Q取邏輯資源占用面積的縮減。
(2)比較方案E 和方案D,除Conv1 卷積層外,其余各層均提高了SIMD 和PE 數(shù)量以及縮減了計(jì)算周期,然而對(duì)比實(shí)現(xiàn)結(jié)果,可以發(fā)現(xiàn)邏輯資源占用率有了大幅增長(zhǎng),而推斷速度卻并沒(méi)有得到大幅提升。 這驗(yàn)證了針對(duì)于流水線結(jié)構(gòu)的深度卷積神經(jīng)網(wǎng)絡(luò)加速器來(lái)說(shuō),計(jì)算周期延遲最大的計(jì)算引擎對(duì)網(wǎng)絡(luò)整體性能有較大的影響,在設(shè)計(jì)中對(duì)各層運(yùn)算單元計(jì)算周期進(jìn)行均衡尤為重要。
(3)對(duì)比FPGA 片上資源LUT、FF 以及BRAM 等資源,片上內(nèi)存數(shù)量是限制進(jìn)一步提高神經(jīng)網(wǎng)絡(luò)層數(shù)以及提高推斷速度的資源瓶頸。
與國(guó)內(nèi)外相關(guān)基于FPGA 的VGG 網(wǎng)絡(luò)加速器實(shí)現(xiàn)進(jìn)行比較,如表5 所示。通過(guò)優(yōu)化設(shè)計(jì),實(shí)現(xiàn)了相較于其他VGG 加速器最高33 倍推斷加速,相比基于層架構(gòu)的同類(lèi)型二值VGG 網(wǎng)絡(luò)加速器[8]提高了7 倍。
表5 基于FPGA 的VGG 加速器對(duì)比
本文通過(guò)從網(wǎng)絡(luò)結(jié)構(gòu)、流水線均衡等多方面優(yōu)化設(shè)計(jì),實(shí)現(xiàn)了輸入尺度更大的二值VGG-11 卷積神經(jīng)網(wǎng)絡(luò)加速器,并驗(yàn)證了優(yōu)化方法的有效性,為更大尺度、更深層次的卷積神經(jīng)網(wǎng)絡(luò)加速器提供了設(shè)計(jì)優(yōu)化思路。