1. 程式人生 > >基於FPGA的卷積神經網路加速器_餘子健

基於FPGA的卷積神經網路加速器_餘子健

文章目錄


這是浙大餘子健的研究生畢業論文,也是我閱讀的第一篇文獻。

1. 神經網路計算模型

上圖為典型的卷積神經網路的結構。在圖中C層代表的是卷積層,S層是子取樣層,F代表全連線層。C層與S層是交替出現的。卷積層即特徵提取層,子取樣層可以二次平均和區域性提取。卷積層是FPGA要加速的重點

上圖是一個典型的卷積層,N個輸入特徵圖,M個輸出特徵圖,將會有N*M個卷積核 (Kernals)。這點我覺得很重要:不同的輸入特徵圖,卷積核一定不同;不同的輸出特徵圖,卷積核也一定不同。
具體的卷積和子取樣計算過程不贅述。

2. 卷積計算並行性分析

這一部分是整個論文的核心。在該部分的討論中,所有的並行情況都單獨考慮,不設計多個組合的情況。

2.1 卷積視窗內部並行

即某一個卷積視窗的卷積計算的並行。通常在實現時會加入流水線技術,並行度為N時在單週期可完成N次乘累加。

一個小錯誤:上圖中最左上角的X(n, 0)應該是X(n, 3)。
以第一行(行n)為例來說明該流水線是如何工作的,在第一個時鐘週期,執行X(n, 0)*W00;第二個時鐘週期,X(n, 1)*W01,並加上X(n, 0)*W00的計算結果, 此外,第一級流水線還會計算X(n, 1)*W00,即下一個卷積視窗的第一個計算值;第三個時鐘週期,第三級流水線執行X(n, 2)*W02 + X(n, 1)*W01 + X(n, 0)*W00,第一級流水線執行X(n, 2)*W00,第二級流水線執行X(n, 1)*W00

+ X(n, 2)*W01。以此類推。

2.2 相同特徵圖卷積視窗間並行實現分析

相同特徵圖內不同卷積視窗的並行,易理解如下圖。

2.3 不同輸入特徵圖卷積視窗並行

如上圖所示為不同輸入特徵圖的同一卷積視窗的並行,原理很好理解。

2.4 不同輸出特徵圖並行

原理與不同輸入特徵圖的並行基本相同。
到這裡為止,四種由小到大,由細到粗的並行結構就結束了,這四種並行結構可以進行組合,在資料頻寬和執行效率之間做出平衡。

3. 啟用函式的實現

神經元的繳活函式實現是一個重要的環節,其導數的變化範圍影響網路的收斂速度和學習速度。常用的啟用函式有sigmoid,雙曲正切等。啟用函式的數位電路實現方式主要有以下方式:

  1. 泰勒級數展開
    可通過求啟用函式的五階泰勒級數來實現。這種方法精度損失小,佔用很少儲存器空間,但需要比較多的計算單元,並且通用性差。
  2. 簡單的查詢表
    通過傳統的查詢表方式將所有結果儲存在儲存器中來實現。這種方法具有較高的靈活性,精度可任意調整,消耗運算資源少,但隨著精度要求的提升,儲存器資源的負擔也指數增長。例如一個16位輸入,16位輸出的查詢表,其消耗的儲存器大小為128KB。
  3. 分段線性逼近
    分段線化(PWL)逼近的基本思想是用一系列折線來逼近啟用函式。在實現的時候,可將分段函式的斷點存入查詢表,斷點間的區間用線化函式來得到中間值。這種方式佔用儲存器資源少於查詢表,消耗計算單元也小於泰勒展開。
    PWL實現方式如下:在函式f(x)上選擇一個線性區,並設定最大允許誤差。比較線性區原函式與線性函式之間的誤差,直至到達最大誤差時,從該點開始一個新的線性區。重複上述操作直至函式定義域內所有區域均已遍歷。
  4. CORDIC演算法
    CORDIC演算法本質是利用一組常數的角度基底去逼近任意一個旋轉角度,通過多次迭代可得到任意解析度輸入資料的結果,消耗一定的運算資源,適合精度要求較高的實現場合。

4. 基於FPGA的加速器設計

4.1 整體結構

加速器的整體結構如上圖所示。注意,要加速的過程是前向預測過程,反向訓練以得到引數的過程是在主機上完成的。 主機把權值和影象以及指令傳給FPGA,FPGA計算結束後將結果傳回主機。

4.2 卷積計算單元

卷積運算是本次設計的優化重點,其實現決定了CNN計算單元的整體結構。由於CNN是一個前向傳播結構,層間運算具有獨立性且各層運算具有高度相似性,因此可通過複用單層運算資源來實現完整的CNN神經網路計算,在實現過程中只需實現單層的卷積計算結構。
在這裡插入圖片描述

上圖是計算過程。在該例項中,有4副輸入特徵圖,4副輸出特徵圖,核的大小為3*3,上圖中分左邊階段和右邊階段。採用並行性組合的方式,輸出特徵圖之間的並行度為2,即同時計算兩個輸出特徵圖;輸入特徵圖之間的並行度為2,即同時計算兩個輸入特徵圖;同一輸入特徵圖不同卷積視窗的並行度為2,即同時計算兩個卷積視窗。
如右階段所示,把兩輸出特徵圖的計算完成後,接著計算剩下兩副輸出特徵圖的結果。