文/邱超 馮肖雄
深度學習CNN神經(jīng)網(wǎng)絡(luò)因其巨大的計算量,巨大的通信帶寬要求,對傳統(tǒng)的馮諾依曼體系結(jié)構(gòu)的CPU提出了挑戰(zhàn),傳統(tǒng)CPU產(chǎn)品無法應(yīng)對,因此衍生出了GPU圖形處理器、ASIC專用集成電路、FPGA等幾條技術(shù)路線。我們從架構(gòu)靈活性、峰值算力、延遲以及功耗、研發(fā)成本對比五個維度,對四條平臺技術(shù)路線進行了對比。
從以上五個維度來說,F(xiàn)PGA使用處于上游位置,因此使用FPGA作為深度學習定制化加速電路,具備了天然優(yōu)勢,本文提到的新型三維脈動陣列結(jié)構(gòu)主要是基于FPGA電路動態(tài)可變基礎(chǔ)上實現(xiàn)。
我們知道卷積層作為計算量要求最高的網(wǎng)絡(luò)層,是CNN推理加速器中最需要加速的網(wǎng)絡(luò)層,接下來以簡單實例為主,介紹卷積層的計算方法。
本文設(shè)定的卷積計算場景是,輸入數(shù)據(jù)圖像5x5大小,輸入通道數(shù)ci=3,卷積核大小是3x3,卷積步長stride=2,卷積外部填充pad=1,輸出圖像的通道數(shù)co=2為例,介紹卷積計算過程,對于其他參數(shù)的場景,計算方法類似。
首先取卷積核參數(shù)中co相同的一組,找到對應(yīng)的ci通道,覆蓋到對應(yīng)的Feature Input上,經(jīng)過點乘求和,可得到3個結(jié)果,接下來再對3個結(jié)果進行累加,即可得到一個輸出點的數(shù)據(jù)。對于其他點的輸出數(shù)據(jù),采用的計算方法一樣。

圖1:三維陣列結(jié)構(gòu)
一種三維脈動陣列乘加器實現(xiàn)結(jié)構(gòu)如圖1所示,從卷積計算中提取3個重要維度,分別是ci(channel inputs),co(channel outputs)以及pix像素信息。
(1)Feature Map的ci信息與權(quán)重數(shù)據(jù)的ci一一對應(yīng)。
(2)相同F(xiàn)eature Map的ci信息,可以有不同的co通道,并且co方向不需要累加和。
(3)對于不同的Pix通道信息,ci,co通道信息共用。這種三維陣列結(jié)構(gòu)的乘加陣列器,極大程度滿足了算力要求,并且做到累加和的關(guān)鍵路徑最短。
前文介紹,卷積核陣列還有一個維度參數(shù)是kernel,在這個乘加陣列中沒有體現(xiàn)出來,這里考慮的因素是由于不同神經(jīng)網(wǎng)絡(luò)下,卷積核尺寸是任意的,這個維度上做分割并行相乘不可取,因此三維陣列結(jié)構(gòu)上不需要體現(xiàn)出來。
三維陣列結(jié)構(gòu)只給出了乘加陣列計算模塊工作方法,這里面有個疑問,對于Feature Map來說,數(shù)據(jù)分配器如何產(chǎn)生的,在下一節(jié)中有介紹。
Feature Maps數(shù)據(jù)分配器中包括原始輸入圖像IntPix和輸出滑窗后的圖像OutPix。我們以卷積核填充為0,核大小為5,步長為2,同時輸出7點數(shù)據(jù)為例,介紹輸入分配器如何同時輸出多點Pix模塊。
首先IntPix模塊中存放的是輸入圖像數(shù)據(jù),注意是單通道的。OutPix中存放輸出的數(shù)據(jù)信息。其次從IntPix中每取到一個像素點pix,都會按照滑窗的對應(yīng)關(guān)系,放到相應(yīng)位置的opix中即可,這種操作方式是按照行掃描的方式進行,當所有行都掃描結(jié)束后,便得到了多個像素點按照滑窗展開后的像素信息。
本文提出了一種新型三維脈動陣列結(jié)構(gòu)的乘加器,并給出了Feature Map數(shù)據(jù)分配模塊的實現(xiàn)過程,該結(jié)構(gòu)具有定制靈活,關(guān)鍵路徑長度較短,以及計算標準密集的特點,非常適合在各種型號的FPGA上進行定制化CNN推理加速應(yīng)用。