Alexnet模型結(jié)構(gòu)如下圖2.1所示
模型的輸入是3x224x224大小圖片,采用5(卷積層)+3(全連接層)層模型結(jié)構(gòu),部分層卷積后加入Relu,Pooling 和Normalization層,最后一層全連接層是輸出1000分類的softmax層。如表1所示,全部8層需要進行1.45GFLOP次乘加計算,計算方法參考下文。
2.2Alexnet 卷積運算特點
Alexnet的卷積運算是三維的,在神經(jīng)網(wǎng)絡(luò)計算公式: y=f(wx+b) 中,對于每個輸出點都是三維矩陣w(kernel)和x乘加后加上bias(b)得到的。如下圖2.2所示,kernel的大小M=Dxkxk,矩陣乘加運算展開后 y = x[0]*w[0]+ x[1]*w[1]+…+x[M-1]*w[M-1],所以三維矩陣運算可以看成是一個1x[M-1]矩陣乘以[M-1]x1矩陣。
圖2.2 Alexnet三維卷積運算
??? 每個三維矩陣kernel和NxN的平面上滑動得到的所有矩陣X進行y=f(wx+b)運算后就會得到一個二維平面(feature map)如圖2.3 所示。水平和垂直方向上滑動的次數(shù)可以由 (N+2xp-k)/s+1 得到(p為padding的大小),每次滑動運算后都會得到一個點。
a)N是NxN平面水平或者垂直方向上的大??;
b)K是kernel在NxN平面方向上的大小kernel_size;
c)S是滑塊每次滑動的步長stride;
圖2.3 kernel進行滑窗計算
Kernel_num 個 kernel 經(jīng)過運算后就會得到一組特征圖,重新組成一個立方體,參數(shù)H = Kernel_num,如圖2.4所示。這個卷積立方體就是卷積所得到的的最終輸出結(jié)果。
圖2.4 多個kernel進行滑窗計算得到一組特征圖
3.AlexNet模型的FPGA實現(xiàn)
3.1 FPGA異構(gòu)平臺
圖3.1為異構(gòu)計算平臺的原理框圖,CPU通過PCIe接口對FPGA傳送數(shù)據(jù)和指令,F(xiàn)PGA根據(jù)CPU下達的數(shù)據(jù)和指令進行計算。在FPGA加速卡上還有DDR DRAM存儲資源,用于緩沖數(shù)據(jù)。
圖3.1 FPGA異構(gòu)系統(tǒng)框圖
3.2 CNN在FPGA的實現(xiàn)
3.2.1 將哪些東西offload到FPGA計算?
在實踐中并不是把所有的計算都offload到FPGA,而是只在FPGA中實現(xiàn)前5層卷積層,將全連接層和Softmax層交由CPU來完成,主要考慮原因:
(1)?? ?全連接層的參數(shù)比較多,計算不夠密集,要是FPGA的計算單元發(fā)揮出最大的計算性能需要很大的DDR帶寬;
(2)?? ?實際運用中分類的數(shù)目是不一定的,需要對全連階層和Softmax層進行修改,將這兩部分用軟件實現(xiàn)有利于修改。
3.2.2 實現(xiàn)模式
Alexnet的5個卷積層,如何分配資源去實現(xiàn)它們,主要layer并行模式和layer串行模式:
(1)?? ?Layer并行模式:如圖3.2所示,按照每個layer的計算量分配不同的硬件資源,在FPGA內(nèi)同時完成所有l(wèi)ayer的計算,計算完成之后將計算結(jié)果返回CPU。優(yōu)點是所有的計算在FPGA中一次完成,不需要再FPGA和DDR DRAM直接來回讀寫中間結(jié)果,節(jié)省了的DDR帶寬。缺點就是不同layer使用的資源比較難平衡,且layer之間的數(shù)據(jù)在FPGA內(nèi)部進行緩沖和格式調(diào)整也比較難。另外,這種模式當(dāng)模型參數(shù)稍微調(diào)整一下(比如說層數(shù)增加)就能重新設(shè)計,靈活性較差。
(2)Layer串行模式:如圖3.3所示,在FPGA中只實現(xiàn)完成單個layer的實現(xiàn),不同layer通過時間上的復(fù)用來完成。優(yōu)點是在實現(xiàn)時只要考慮一層的實現(xiàn),數(shù)據(jù)都是從DDR讀出,計算結(jié)果都寫回DDR,數(shù)據(jù)控制比較簡單。缺點就是因為中間結(jié)果需要存儲在DDR中,提高了對DDR帶寬的要求。
圖3.3 layer并行模式下資源和時間分配示意圖
我們的設(shè)計采用了是Layer串行的模式,數(shù)據(jù)在CPU、FPGA和DDR直接的交互過程如圖3.4所示。
圖3.4 計算流程圖
3.2.3 計算單個Layer的PM(Processing Module)設(shè)計
如圖3.5所示,數(shù)據(jù)處理過程如下,所有過程都流水線進行:
(1)Kernel和Data通過兩個獨立通道加載到CONV模塊中;
(2)CONV完成計算,并將結(jié)果存在Reduce RAM中;
(3)(可選)如果當(dāng)前l(fā)ayer需要做ReLU/Norm,將ReLU/Norm做完之后寫回Reduce RAM中;
(4)(可選)如果當(dāng)前l(fā)ayer需要做Max Pooling,將Max做完之后寫回Reduce RAM中;
(5)將計算結(jié)果進行格式重排之后寫回DDR中。
圖3.5 Processing Module的結(jié)構(gòu)框圖
3.2.4 CONV模塊的設(shè)計
在整個PM模塊中,最主要的模塊是CONV模塊,CONV模塊完成數(shù)據(jù)的卷積。
由圖3.6所示,卷積計算可以分解成兩個過程:kernel及Data的展開和矩陣乘法。
Kernel可以預(yù)先將展開好的數(shù)據(jù)存在DDR中,因此不需要在FPGA內(nèi)再對Kernel進行展開。Data展開模塊,主要是將輸入的feature map按照kernel的大小展開成可以同kernel進行求內(nèi)積計算的矩陣。數(shù)據(jù)展開模塊的設(shè)計非常重要,不僅要減小從DDR讀取數(shù)據(jù)的數(shù)據(jù)量以減小DDR帶寬的要求,還要保證每次從DDR讀取數(shù)據(jù)時讀取的數(shù)據(jù)為地址連續(xù)的大段數(shù)據(jù),以提高DDR帶寬的讀取效率。
圖3.7為矩陣乘法的實現(xiàn)結(jié)構(gòu),通過串聯(lián)乘加器來實現(xiàn),一個周期可以完成一次兩個向量的內(nèi)積,通過更新端口上的數(shù)據(jù),可以實現(xiàn)矩陣乘法。
圖3.7 矩陣乘法實現(xiàn)結(jié)構(gòu)
??? 展開后的矩陣比較大,F(xiàn)PGA因為資源結(jié)構(gòu)的限制,無法一次完成那么的向量內(nèi)積,因此要將大矩陣的乘法劃分成幾個小矩陣的乘加運算。拆分過程如圖3.8所示。
假設(shè)大矩陣乘法為O= X*W,其中,輸入矩陣X為M*K個元素的矩陣;權(quán)重矩陣W為K*P個元素的矩陣;偏置矩陣O為M*P個元素的矩陣;
R = K/L,如果不能整除輸入矩陣,權(quán)重矩陣和偏置通過補零的方式將矩陣處理成可以整除;
S = P/Q,如果不能整除將權(quán)重矩陣和偏置矩陣通過補零的方式將矩陣處理成可以整除;
3.2.5實現(xiàn)過程的關(guān)鍵點
(1)?? 決定系統(tǒng)性能的主要因素有:DSP計算能力,帶寬和片內(nèi)存儲資源。好的設(shè)計是將這三者達到一個比較好的平衡。參考文獻[2]開發(fā)了roofline性能模型來將系統(tǒng)性能同片外存儲帶寬、峰值計算性能相關(guān)聯(lián)。
(2)? 為了達到最好的計算性能就是要盡可能地讓FPGA內(nèi)的在每一個時鐘周期都進行有效地工作。為了達到這個目標,CONV模塊和后面的ReLU/Norm/Pooling必須能異步流水線進行。Kernel的存儲也要有兩個存儲空間,能對系數(shù)進行乒乓加載。另外,由于計算是下一層的輸入依賴于上一層的輸出,而數(shù)據(jù)計算完成寫回DDR時需要一定時間,依次應(yīng)該通過交疊計算兩張圖片的方式(Batch=2)將這段時間通過流水迭掉。
(3)? 要選擇合適的架構(gòu),是計算過程中Data和Kernel只要從DDR讀取一次,否則對DDR帶寬的要求會提高。
3.3 性能及效益
如圖3.9所示采用FPGA異構(gòu)計算之后,F(xiàn)PGA異構(gòu)平臺處理性能是純CPU計算的性能4倍,而TCO成本只是純CPU計算的三分之一。本方案對比中CPU為2顆E5-2620,F(xiàn)PGA為Virtex-7 VX690T,這是一個28nm器件,如果采用20nm或16nm的器件會得到更好的性能。
圖 3.10 歸一化單位成本對比
??? 圖3.11為實際業(yè)務(wù)中利用FPGA進行加速的情況,由圖中數(shù)據(jù)可知FPGA加速可以有效降低成本。
圖3.11 某實際業(yè)務(wù)中的性能和成本對比
參考文獻
[1] Alex Krizhevsky. ImageNet Classification with Deep Convolutional Neural Networks
[2] C. Zhang, et al. Optimizing FPGA-based accelerator design for deep convolutional neural networks. In ACM ISFPGA 2015.
[3] P Gysel, M Motamedi, S Ghiasi. Hardware-oriented Approximation of Convolutional Neural Networks. 2016.
[4] Song Han,Huizi Mao,William J. Dally.DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING. Conference paper at ICLR,2016