林秀男,錢 慧
(福州大學(xué) 物理與信息工程學(xué)院,福州 350100)E-mail:qianhui@fzu.edu.cn
殘差網(wǎng)絡(luò)(Residual Network,ResNet)[1]是近年來廣受關(guān)注的一種卷積神經(jīng)網(wǎng)絡(luò)(Convolution Neural Network,CNN).ResNet通過殘差函數(shù)有效地解決了CNN隨著網(wǎng)絡(luò)層次加深而出現(xiàn)的梯度消失和網(wǎng)絡(luò)退化問題.目前為止,最深的殘差網(wǎng)絡(luò)層次已達(dá)到1000多層,在圖像分類、對象檢測和語義分割等領(lǐng)域中都表現(xiàn)出了良好的性能.隨著深度神經(jīng)網(wǎng)絡(luò)理論逐漸成熟,面向資源有限的移動(dòng)終端平臺(tái)上的硬件加速設(shè)計(jì)成為重要的研究領(lǐng)域和商業(yè)應(yīng)用的熱點(diǎn).
相對于樸素貝葉斯、K最近鄰和支持向量機(jī)等已廣泛商用的機(jī)器學(xué)習(xí)算法來說,所有CNN模型部署都面臨著存儲(chǔ)和計(jì)算資源需求過大的問題.目前,研究學(xué)者主要通過數(shù)據(jù)量化和稀疏化來壓縮網(wǎng)絡(luò)模型.文獻(xiàn)[2]實(shí)現(xiàn)了8-bits的參數(shù)量化,在精度損失約為1%的情況下,模型壓縮了約15~20倍.文獻(xiàn)[3,4]使用K-means標(biāo)量量化方法量化參數(shù)值,實(shí)現(xiàn)了16~24倍的網(wǎng)絡(luò)壓縮,而且僅損失1%的精度.在網(wǎng)絡(luò)稀疏化方面,文獻(xiàn)[5,6]分別提出通過剪枝、量化和霍夫曼編碼的方式,動(dòng)態(tài)網(wǎng)絡(luò)手術(shù)的剪枝策略分別對模型壓縮了35~49倍和17~108倍.雖然經(jīng)過壓縮后的模型對存儲(chǔ)需求有所降低,但仍有GB級別的計(jì)算量.面對如此大量的計(jì)算,尤其是在低功耗平臺(tái)上,部署CNN進(jìn)行實(shí)時(shí)推理工作是一個(gè)挑戰(zhàn).目前,主要是廣泛運(yùn)用并行計(jì)算來解決這個(gè)問題,但并行度越高,對計(jì)算資源的需求量越大.這就導(dǎo)致計(jì)算資源和并行度之間的折衷關(guān)系.所以,目前CNN在移動(dòng)終端上的部署依然是一個(gè)極具挑戰(zhàn)的課題.
FPGA因具有功耗低、結(jié)構(gòu)靈活等優(yōu)點(diǎn)成為目前部署CNN的主流平臺(tái).早期基于FPGA的深度神經(jīng)網(wǎng)絡(luò)加速器主要是利用FPGA中豐富的邏輯資源,通過并行計(jì)算來提高速度.Sankarada[7]根據(jù)CNN中不同卷積層的特點(diǎn)設(shè)計(jì)了一個(gè)大規(guī)模并行CNN協(xié)處理器.Chakradha等人[8]提出CNN在計(jì)算過程中體現(xiàn)了三種并行性:卷積計(jì)算的并行性,多個(gè)輸入數(shù)據(jù)被組合成為單個(gè)輸出數(shù)據(jù)的內(nèi)部輸出并行性,以及多個(gè)獨(dú)立的輸出數(shù)據(jù)之間同時(shí)計(jì)算的輸出間并行性,并基于此設(shè)計(jì)了CNN并行計(jì)算加速器.Cadamb等人[9]將CNN的計(jì)算過程表示為包含大量數(shù)據(jù)的矩陣和向量操作,通過數(shù)組排序、查找最小值和聚類等二次操作來減少原始卷積計(jì)算的計(jì)算量.然而隨著網(wǎng)絡(luò)規(guī)模的不斷增大,外部內(nèi)存帶寬成為限制加速器計(jì)算能力的主要瓶頸.加速器的研究重點(diǎn)轉(zhuǎn)向解決外部內(nèi)存帶寬問題.通過優(yōu)化存儲(chǔ)器的讀寫策略來有效地提高系統(tǒng)的運(yùn)行效率,進(jìn)而解決神經(jīng)網(wǎng)絡(luò)加速器中計(jì)算模塊的吞吐量與FPGA平臺(tái)外部內(nèi)存帶寬的匹配問題.文獻(xiàn)[10-13]中提出通過設(shè)計(jì)靈活的存儲(chǔ)層次結(jié)構(gòu)來減少內(nèi)存瓶頸的影響,從而支持CNN復(fù)雜的數(shù)據(jù)訪問模式.Zhang等人[14]針對內(nèi)存優(yōu)化提出基于roofline模型的解析設(shè)計(jì)方案,通過循環(huán)平鋪和轉(zhuǎn)換的方式對數(shù)據(jù)讀寫進(jìn)行優(yōu)化.而文獻(xiàn)[15,16]利用流水線實(shí)現(xiàn)了從輸入到輸出的不間斷的并行數(shù)據(jù)流,提高了加速器的吞吐率.
目前在移動(dòng)終端進(jìn)行部署的網(wǎng)絡(luò)模型主要是針對經(jīng)典的CNN,在ResNet模型部署方面僅有少量的研究工作.Ma等人[17]采用最大化資源利用率和最小化數(shù)據(jù)移動(dòng)的思想,并使用可擴(kuò)展和復(fù)用的計(jì)算原語來優(yōu)化硬件約束下的物理設(shè)計(jì),設(shè)計(jì)出一種端對端的深度ResNet加速器.Li等人[18]在FPGA上通過OpenCL來加速ResNet.通過構(gòu)造一個(gè)輔助的深度學(xué)習(xí)加速器來實(shí)現(xiàn)ResNet中的殘差函數(shù),并通過數(shù)據(jù)并行和流水線,使濾波器參數(shù)與圖像數(shù)據(jù)同步進(jìn)行處理.相對經(jīng)典的CNN來說,ResNet的硬件實(shí)現(xiàn)更具挑戰(zhàn)性.因?yàn)镽esNet具有許多不同類型的層,這些層的尺寸和核的大小都會(huì)有所差異,另外ResNet還結(jié)合了兩個(gè)非相鄰層之間的跳轉(zhuǎn)連接用來計(jì)算殘差.這些特點(diǎn)都使ResNet的結(jié)構(gòu)高度不規(guī)則和更復(fù)雜,增加了其在移動(dòng)終端的部署難度.
本文通過綜合運(yùn)用流水線、并行和復(fù)用的策略實(shí)現(xiàn)了在有限資源移動(dòng)終端上的RestNet部署.其硬件實(shí)現(xiàn)主要包括卷積計(jì)算單元、殘差計(jì)算單元和全連接層計(jì)算單元.本文的主要工作如下:首先,采用K-means聚類算法對模型中的32位浮點(diǎn)參數(shù)進(jìn)行定點(diǎn)量化,降低模型部署過程中的參數(shù)存儲(chǔ)要求以及計(jì)算復(fù)雜度.其次,各計(jì)算單元都基于并行計(jì)算和流水線實(shí)現(xiàn).另外本文還利用分層存儲(chǔ)結(jié)構(gòu)和乒乓片內(nèi)緩存實(shí)現(xiàn)對殘差計(jì)算單元的復(fù)用,以減少片外存儲(chǔ)器的帶寬限制和計(jì)算資源需求.
對于經(jīng)典的CNN,在不斷增加神經(jīng)網(wǎng)絡(luò)的深度時(shí),模型的精度會(huì)先上升達(dá)到飽和,此時(shí)再繼續(xù)增加深度則會(huì)導(dǎo)致精度下降[1].針對這個(gè)問題,殘差網(wǎng)絡(luò)引入殘差結(jié)構(gòu),即殘差塊.殘差塊所起到的效果就是在網(wǎng)絡(luò)模型精度已達(dá)到飽和之后,再增加的層只是起到層與層之間的恒等映射作用,這樣就不會(huì)因誤差增加而導(dǎo)致精度下降.殘差塊的結(jié)構(gòu)如圖1所示,殘差網(wǎng)絡(luò)與經(jīng)典CNN網(wǎng)絡(luò)之間的區(qū)別在于殘差塊中引入了跳轉(zhuǎn)連接,使得先前殘差塊的信息無障礙地流入下一個(gè)殘差塊,以此來改善信息的流通,避免梯度消失和網(wǎng)絡(luò)退化問題.如圖1所示為常用的殘差塊,包括標(biāo)準(zhǔn)殘差塊和瓶頸塊[1].
圖1 殘差塊結(jié)構(gòu)圖
定義殘差塊的形式是y=F(x,W)+x,x,y分別是殘差塊的輸入向量和輸出向量.F(x,W)是需要學(xué)習(xí)的殘差映射.殘差函數(shù)F的形式是靈活的,如對于圖1中的標(biāo)準(zhǔn)殘差塊,其殘差映射為F=W2σ(W1x),其中W1,W2分別為殘差塊中第1層和第2層的權(quán)重參數(shù),σ為線性整流函數(shù)(Rectified Linear Unit, ReLU).而瓶頸塊中的1×1的卷積操作具有降維的作用,同時(shí)能夠引入更多的非線性變換,增加殘差塊的深度,進(jìn)而提高殘差網(wǎng)絡(luò)的表示能力.圖2所示的是使用標(biāo)準(zhǔn)殘差塊構(gòu)造的具有6個(gè)殘差塊的ResNet,即為本文部署在移動(dòng)終端上的ResNet模型結(jié)構(gòu).
圖2 具有6個(gè)殘差塊的殘差網(wǎng)絡(luò)
ResNet的硬件實(shí)現(xiàn)如圖3所示,包括以下模塊:輸入數(shù)據(jù)緩沖器、權(quán)重緩沖器、卷積計(jì)算單元、殘差計(jì)算單元、全連接層計(jì)算單元、控制器和輸出數(shù)據(jù)緩沖器組成.
圖3 ResNet硬件實(shí)現(xiàn)的整體架構(gòu)
在硬件平臺(tái)進(jìn)行浮點(diǎn)計(jì)算是很難實(shí)現(xiàn)的.因此首先需要對模型參數(shù)進(jìn)行定點(diǎn)量化.本文針對神經(jīng)網(wǎng)絡(luò)浮點(diǎn)參數(shù)利用權(quán)重共享的方法進(jìn)行矢量壓縮和量化[19],將k-means聚類算法應(yīng)用在其中.假設(shè)權(quán)重矩陣W∈Rn×m,收集矩陣中所有權(quán)重的標(biāo)量值w∈R1×mn.設(shè)定簇的數(shù)量為k,cj表示第j個(gè)簇的中心值.則有聚類公式為:
天然氣在分布式能源成本中占比超70%,在天然氣價(jià)格高,同時(shí)直供氣得不到燃?xì)夤局С值那闆r下,企業(yè)成本居高不下。天然氣價(jià)格高,天然氣是清潔能源,相同熱值的管道天然氣終端價(jià)格是煤炭價(jià)格的2倍。雖然川發(fā)改價(jià)格〔2015〕463號文中明確規(guī)定:“新建天然氣分布式能源發(fā)電企業(yè)應(yīng)與中石油西南油氣田分公司(或中石化西南油氣分公司)簽訂直供合同,降低燃?xì)獬杀尽!比欢趯?shí)際項(xiàng)目推進(jìn)過程中,天然氣分布式能源投資企業(yè)在取得天然氣直供許可上存在著較大困難:一方面,各終端天然氣公司有“供區(qū)”;另一方面,城市規(guī)劃也難以支持所有的天然氣分布式能源都能建設(shè)直供天然管道。
(1)
建立一個(gè)字典存放每個(gè)簇的中心值并賦予一個(gè)索引.在完成聚類過程之后,神經(jīng)網(wǎng)絡(luò)的各個(gè)權(quán)重就可以通過查表的方式,并用簇的索引值來表示:
(2)
其中z表示字典中對應(yīng)簇的索引.對于參數(shù)標(biāo)量量化的方式,通過索引值和字典就可以確定權(quán)重參數(shù).
在標(biāo)量量化的基礎(chǔ)上,本文繼續(xù)考慮結(jié)構(gòu)化矢量量化參數(shù)的壓縮方法[20].矢量量化參數(shù)的基本思想是將向量空間劃分成為多個(gè)不相交的子空間,并在每個(gè)子空間中分別進(jìn)行量化操作.對于全連接層而言,采用矢量量化的方法比現(xiàn)有矩陣因式分解的方法更有優(yōu)勢.假設(shè)給定權(quán)重矩陣W∈Rn×m,按列方向?qū)?quán)重矩陣劃分多個(gè)子矩陣:
W=[W1,W2,…,Ws]
(3)
其中Wi∈Rn×(m/s)表示權(quán)重矩陣m列被分成了s份.然后對每一個(gè)子矩陣執(zhí)行k-means聚類運(yùn)算:
(4)
(5)
與標(biāo)量量化方法相比,矢量量化方式需要存儲(chǔ)每個(gè)權(quán)重子向量的索引值和字典.
卷積層的計(jì)算過程是通過卷積核遍歷二維離散信號,將輸入特征圖的數(shù)值與卷積核對應(yīng)位置的數(shù)值相乘并累加,得到輸出結(jié)果.圖4為卷積核為3×3的卷積計(jì)算單元的結(jié)構(gòu).卷積計(jì)算單元主要由數(shù)據(jù)緩沖器、權(quán)重緩沖器、乘法器組、加法樹、激活函數(shù)模塊和池化模塊組成.在每次卷積時(shí),首先將特征圖數(shù)據(jù)加載到數(shù)據(jù)緩沖器中,權(quán)重?cái)?shù)據(jù)通過索引值從字典中提取出來加載到權(quán)重緩沖器中.然后將輸入數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)通過移位寄存器逐行進(jìn)入乘法器組中進(jìn)行乘法運(yùn)算,再經(jīng)加法樹進(jìn)行累加求和得到一次的卷積結(jié)果.激活函數(shù)模塊和池化模塊都是可選模塊.各模塊詳細(xì)說明如下.
圖4 卷積計(jì)算模塊結(jié)構(gòu)圖
激活函數(shù)模塊:卷積計(jì)算的結(jié)果需經(jīng)激活函數(shù)ReLU進(jìn)行計(jì)算.根據(jù)ReLU特性,當(dāng)輸入數(shù)據(jù)大于或等于0時(shí),該值保持不變.當(dāng)輸入數(shù)據(jù)小于0時(shí),輸入數(shù)據(jù)設(shè)置為零.因此,只需進(jìn)行輸入數(shù)據(jù)的符號位的判斷即可.當(dāng)符號位為0時(shí),輸入值保持不變.當(dāng)符號位為1時(shí),它輸出0.
池化模塊:本文進(jìn)行的是最大池化操作.其中,數(shù)據(jù)的存儲(chǔ)和讀取與卷積計(jì)算中的輸入數(shù)據(jù)緩沖器是相同.不同之處在于卷積操作是由乘法器組和加法樹完成,而池化的操作過程由比較器組完成.
在卷積計(jì)算中存在卷積核是單輸入通道的情況.由于不同卷積核之間的計(jì)算相互獨(dú)立,因此可以在同一個(gè)時(shí)刻,對輸入數(shù)據(jù)的同一個(gè)區(qū)域進(jìn)行多個(gè)卷積核的并行卷積計(jì)算,從而實(shí)現(xiàn)輸入數(shù)據(jù)的復(fù)用.卷假設(shè)NUM是卷積核的數(shù)目,NUM′表示同一時(shí)刻并行計(jì)算的卷積核數(shù)目,通過每次并行計(jì)算NUM′個(gè)卷積核,只需要進(jìn)行NUM/NUM′次就可以完成卷積計(jì)算,在很大程度上加速卷積計(jì)算的完成.
在卷積計(jì)算過程還存在卷積核是多輸入通道的情況.當(dāng)對特征圖進(jìn)行多通道卷積時(shí),卷積核的每個(gè)通道都要分別與特征圖的對應(yīng)通道進(jìn)行卷積.最后將各個(gè)通道相應(yīng)位置上的結(jié)果進(jìn)行累加計(jì)算,得到一個(gè)輸出通道的結(jié)果.假設(shè)卷積核和特征圖的通道數(shù)都為C,被劃分為N組,每組有C′個(gè)通道.多通道卷積模塊累加計(jì)算如圖5所示.首先選擇第1組C′個(gè)卷積核通道,與特征圖對應(yīng)的C′個(gè)通道進(jìn)行卷積運(yùn)算,然后將C′個(gè)通道的卷積結(jié)果累加作為第1組的結(jié)果,輸出到輸出緩沖區(qū)1中.接著切換到第2組數(shù)據(jù)的計(jì)算,并將計(jì)算結(jié)果輸出到輸出緩沖區(qū)2中,之后以此類推計(jì)算出N組的結(jié)果.最后將N個(gè)輸出緩沖區(qū)對應(yīng)位置數(shù)據(jù)通過加法樹相加,得到這個(gè)輸出通道的最終卷積結(jié)果.
圖5 多通道卷積模塊累加計(jì)算示意圖
標(biāo)準(zhǔn)殘差塊如圖1所示,由兩個(gè)卷積層和一個(gè)向量加法組成.因此殘差計(jì)算單元可以使用卷積計(jì)算單元的結(jié)構(gòu)進(jìn)行計(jì)算.殘差計(jì)算模塊由兩個(gè)輸入緩沖器、一個(gè)卷積計(jì)算模塊、兩個(gè)輸出緩沖器和一個(gè)控制器模塊組成.兩個(gè)輸入和輸出緩沖器可以形成乒乓結(jié)構(gòu),通過圖3中的控制器實(shí)現(xiàn)不同殘差塊的數(shù)據(jù)輸入,實(shí)現(xiàn)對殘差計(jì)算單元的復(fù)用.
定義輸入全連接層的特征圖為M×M,首先需要展開成1×M2的向量,假定全連接層的權(quán)重參數(shù)是一個(gè)n×M2的權(quán)重矩陣W,進(jìn)行一次全連接層計(jì)算后輸出向量維度為n×1.輸入特征圖為x,則全連接層的輸出z為:
zT=W*xT
(6)
用g表示全連接層的激活函數(shù)ReLU,則經(jīng)激活函數(shù)后的輸出y為:
yT=g(zT)=g(W*xT)
(7)
針對神經(jīng)網(wǎng)絡(luò)的全連接層存在參數(shù)量大,且相互之間沒有依賴關(guān)系的特點(diǎn),本文采用分組計(jì)算的思想.將權(quán)重矩陣拆分成為固定大小的子矩陣,各個(gè)子矩陣可以并行計(jì)算.假設(shè)將n×M2的權(quán)重矩陣W按列劃分為K組,則子矩陣的數(shù)量為C=?M2/K」,并編號為Wij,其中i∈(1,…,K)表示權(quán)重矩陣按列被劃分成K組,j∈(1,…,n)表示該子矩陣為權(quán)重矩陣的第j行,即第j個(gè)輸出節(jié)點(diǎn).同樣的也將M2×1的輸入特征圖劃分為K組,標(biāo)記為Xi,其中i∈(1,…,K).在進(jìn)行拆分之后,全連接層的第j個(gè)輸出節(jié)點(diǎn)的結(jié)果是由K組的計(jì)算結(jié)果累加得到的.其計(jì)算公式如下:
(8)
對于本文圖2中的網(wǎng)絡(luò)模型,其第一層全連接層輸入層權(quán)重大小為200×3136.將權(quán)重矩陣按列劃分為64組,其中每組包含200×49個(gè)權(quán)重.與權(quán)重的劃分方式相同,將1×3136的輸入值也分成64組,每組49個(gè)輸入值.權(quán)重?cái)?shù)據(jù)首先通過索引值在權(quán)值共享字典中查找出對應(yīng)權(quán)重,然后將權(quán)重?cái)?shù)據(jù)與特征圖數(shù)據(jù)分別存放在權(quán)重?cái)?shù)據(jù)緩沖區(qū)和數(shù)據(jù)緩沖區(qū)中,每組對應(yīng)位置的數(shù)據(jù)通過49個(gè)乘法器并行計(jì)算.權(quán)重?cái)?shù)據(jù)和特征圖數(shù)據(jù)都是8-bits.完成乘法計(jì)算之后,需通過加法樹對49個(gè)相乘結(jié)果進(jìn)行累加.在完成64組的計(jì)算后,通過加法樹對64組結(jié)果進(jìn)行累加得到全連接層的輸出.每組計(jì)算過程如圖6所示.
圖6 全連接層計(jì)算模塊結(jié)構(gòu)圖
本文采用的ResNet網(wǎng)絡(luò)結(jié)構(gòu)為圖2所示,在MNIST手寫數(shù)字?jǐn)?shù)據(jù)集上進(jìn)行分類任務(wù)訓(xùn)練.對于訓(xùn)練完成的網(wǎng)絡(luò)模型參數(shù),使用k-means量化參數(shù).將參數(shù)分為256個(gè)簇,權(quán)重矩陣的索引值為8-bit,簇中心的值為16-bit.之后使用1000張測試圖像進(jìn)行實(shí)驗(yàn),結(jié)果表明該量化策略只帶來了約1%的精度損失.網(wǎng)絡(luò)參數(shù)量化的結(jié)果如表1所示.
表1 參數(shù)量化結(jié)果
由表1可知,整個(gè)網(wǎng)絡(luò)的參數(shù)壓縮了將近3.7倍.卷積層的參數(shù)采用的是標(biāo)量量化的方式,壓縮了近4倍的參數(shù)量,全連接層采用矢量量化的方式,按列方向?qū)?quán)重矩陣劃分為64組,然后對每個(gè)組都使用k-means進(jìn)行量化,壓縮了3.53倍的參數(shù)量.
搭建ResNet的硬件平臺(tái)選用的是Xilinx FPGA Zynq系列ZCU102開發(fā)套件,該平臺(tái)擁有強(qiáng)大的高速信號處理能力,同時(shí)具有超大容量的存儲(chǔ)器以及諸多的邏輯資源.其時(shí)鐘頻率為300MHz,中央處理器有基于ARM v8架構(gòu)的四核64位Cortex-A53應(yīng)用處理單元以及基于ARM v7架構(gòu)的雙核32位Cortex-R5實(shí)時(shí)處理單元.處理系統(tǒng)具有4GB存儲(chǔ)空間的DDR4,可編程邏輯部分具有512MB存儲(chǔ)空間的DDR4.系統(tǒng)邏輯單元600K、DSP Slice為2520、最大I/O引腳數(shù)328.表2 為部署ResNet的總體資源使用情況.
表2 總體資源使用情況
文獻(xiàn)[17]是將ResNet-50部署在Altera Arria-10 GX 1150的平臺(tái)上,該平臺(tái)有427.2K的自適應(yīng)邏輯模塊,1518個(gè)DSP為,2713個(gè)RAM塊.表3為本文所設(shè)計(jì)的加速器、與文獻(xiàn)[17]中的加速器的比較情況.
表3 ResNet的部署結(jié)果對比
本文提出了一種應(yīng)用在移動(dòng)終端可擴(kuò)展的ResNet加速器設(shè)計(jì).該加速器是針對具有瓶頸塊或標(biāo)準(zhǔn)殘差塊的ResNet的優(yōu)化實(shí)現(xiàn).通過綜合利用流水線、并行和復(fù)用的策略,降低模型部署所需的存儲(chǔ)需求、計(jì)算資源.該加速器能夠有效地在Zynq-ZCU102上實(shí)現(xiàn)ResNet,其系統(tǒng)時(shí)鐘可達(dá)到300MHz,延時(shí)為26.47ms,DSP占用率為60.4%,LUTRAM占用率為4%.并且通過卷積層中選擇不同的并行計(jì)算數(shù),全連接層中選擇不同的子矩陣大小,該加速器可適用于具有不同資源的移動(dòng)終端.