層數kernel個數每個kernel進行卷積次數每個kernel一次卷積運算量浮點乘加次數第1層963025(1x363)x(363x1)96x3025x363=105M=210MFLOP第2層256729(1x1200)x(1200x1)256x729x1200=224M=448MFLOP第3層384169(1x2304)x(2304x1)384x169x2304=150M=300MFLOP第4層384169(1x1728)x(1728x1)384x169x1728=112M=224MFLOP第5層256169(1x1728)x(1728x1)256x169x1728=75M=150MFLOP第6層14096(1x9216)x(9216x1)4096x9216=38M=76MFLOP第7層14096(1x4096)x(4096x1)4096x4096=17M=34MFLOP第8層11000(1x4096)x(4096x1)1000x4096=4M=8MFLOP總和1.45GFLOP表2.1Alexnet浮點計算量
2.2Alexnet卷積運算特點
Alexnet的卷積運算是三維的,在神經網絡計算公式: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.2Alexnet三維卷積運算
每個三維矩陣kernel和NxN的平面上滑動得到的所有矩陣X進行y=f(wx+b)運算后就會得到一個二維平面(featuremap)如圖2.3所示。水平和垂直方向上滑動的次數可以由(N+2xp-k)/s+1得到(p為padding的大小),每次滑動運算后都會得到一個點。
a)N是NxN平面水平或者垂直方向上的大??;
b)K是kernel在NxN平面方向上的大小kernel_size;
c)S是滑塊每次滑動的步長stride;
圖2.3kernel進行滑窗計算
Kernel_num個kernel經過運算后就會得到一組特征圖,重新組成一個立方體,參數H=Kernel_num,如圖2.4所示。這個卷積立方體就是卷積所得到的的最終輸出結果。
圖2.4多個kernel進行滑窗計算得到一組特征圖
3.AlexNet模型的FPGA實現
3.1FPGA異構平臺
圖3.1為異構計算平臺的原理框圖,CPU通過PCIe接口對FPGA傳送數據和指令,FPGA根據CPU下達的數據和指令進行計算。在FPGA加速卡上還有DDRDRAM存儲資源,用于緩沖數據。圖3.1FPGA異構系統(tǒng)框圖
3.2CNN在FPGA的實現
3.2.1將哪些東西offload到FPGA計算?
在實踐中并不是把所有的計算都offload到FPGA,而是只在FPGA中實現前5層卷積層,將全連接層和Softmax層交由CPU來完成,主要考慮原因:(1)全連接層的參數比較多,計算不夠密集,要是FPGA的計算單元發(fā)揮出最大的計算性能需要很大的DDR帶寬;
(2)實際運用中分類的數目是不一定的,需要對全連階層和Softmax層進行修改,將這兩部分用軟件實現有利于修改。
3.2.2實現模式
Alexnet的5個卷積層,如何分配資源去實現它們,主要layer并行模式和layer串行模式:(1)Layer并行模式:如圖3.2所示,按照每個layer的計算量分配不同的硬件資源,在FPGA內同時完成所有l(wèi)ayer的計算,計算完成之后將計算結果返回CPU。優(yōu)點是所有的計算在FPGA中一次完成,不需要再FPGA和DDRDRAM直接來回讀寫中間結果,節(jié)省了的DDR帶寬。缺點就是不同layer使用的資源比較難平衡,且layer之間的數據在FPGA內部進行緩沖和格式調整也比較難。另外,這種模式當模型參數稍微調整一下(比如說層數增加)就能重新設計,靈活性較差。
圖3.2layer并行模式下資源和時間分配示意圖
(2)Layer串行模式:如圖3.3所示,在FPGA中只實現完成單個layer的實現,不同layer通過時間上的復用來完成。優(yōu)點是在實現時只要考慮一層的實現,數據都是從DDR讀出,計算結果都寫回DDR,數據控制比較簡單。缺點就是因為中間結果需要存儲在DDR中,提高了對DDR帶寬的要求。