神經網絡加速理論


內容:

1、GPU計算神經網絡加速原理

2、脈動陣列計算神經網絡原理

3、谷歌TPU架構

4、脈動陣列

參考文獻

1、GPU計算神經網絡加速原理

GPU實現神經網絡加速優化的關鍵方式是並行化矢量化,一種最常見的GPU加速神經網絡的模式為通用矩陣相乘(General Matrix Multiply),即將各類神經網絡核心計算展開為矩陣計算的形式

下面以卷積神經網絡中的加速計算對GPU加速原理進行分析。

卷積:卷積操作如下圖所示神經網絡中的卷積通過卷積核在特征圖上以特定步長平移滑動,通過計算卷積核和特征圖上與卷積核相同大小的數據塊進行相乘求和,得出輸出特征圖像上的一個單元點的輸出。

GPU進行卷積加速

GPU上無法直接支持卷積計算,所以在GPU上進行卷積計算時,需要首先將卷積核和特征圖按照特定的規律進行預處理展開,稱為Img2Col方法。

Img2Col操作如下圖所示,以3✖3✖2的特征圖和2✖2✖2✖2的卷積核為例,計算操作如下:

  1. 將每個周期通道1和通道2參與卷積計算的數據按行按列展開,通道1在上通道2在下排成一列。由於需要進行4次計算,因此展開為8✖4的矩陣。
  2. 同理將卷積核WG分別按行按列展開,通道1在前通道2在后展開為1行。由於有兩個卷積核,所以將兩行展開的卷積核按行拼接為2✖8的矩陣。
  3. 將特征圖矩陣和卷積核矩陣進行矩陣乘法,得到2✖4的輸出矩陣,其中每一行代表一張輸出特征圖。

 

 

GPU加速局限:

當神經網絡的通道數過多造成矩陣過大,以至於GPU無法在將所有通道展開。則需要根據GPU的算力選擇部分通道先進行矩陣計算,並輸出中間計算結果;再將所有中間計算結果累加得到最終的輸出。

GPU單指令多線程處理:

從上圖可以觀察到,對於展開后的矩陣相乘,左矩陣的每個行向量與右矩陣的每一列向量的操作相同(乘和累加),但是作用於不同的數據上。GPU采用單指令多線程進行處理,每個線程同步的在不同的數據上執行相同的指令流,可以並行化計算。針對上述例子,GPU可以同時使用8個線程進行並行計算。每個線程可在每個周期內並行執行一次乘加計算,多個線程獨立並行執行。多線程執行流程如下圖所示,理性情況下8個周期即可輸出所有點。

 

2、脈動陣列計算神經網絡原理

脈動陣列

是一個二維的滑動陣列,其中每一個節點都是一個脈動計算單元,每個單元在一個周期內完成一次乘加操作。計算單元之間通過橫向或縱向的數據通路實現數據的傳遞。

優點:

  1. 結構簡單,規整,模塊化強,可擴充,非常適合VLSI實現;
  2. PE單元見數據通信距離短,規則,便於數據流和控制流的設計,同步控制等;
  3. 計算並行度高,脈動陣列中所有單元可以同時計算,可通過流水獲得很高的運算效率和吞吐率。

缺點:

  • 具有一定的專用性,限制了應用范圍。

加速流程

以3✖3✖2的特征圖和2✖2✖2✖2的卷積核在8✖2的脈動陣列計算為例,卷積核權重固定在PE單元中,特征值橫向脈動傳遞,中間計算結果縱向脈動傳遞,計算操作如下:

周期0:兩個卷積核W和G的權重靜態存儲在脈動陣列的計算單元中,同一卷積核的權重排列在同一列;將輸入特征圖F按列展開,每行相隔一個周期;

周期1:輸入特征圖F00進入W00單元,並與W00計算得到Y00的中間計算值;

周期2:

橫向:F00向右脈動傳遞至G00單元,計算第二張輸出特征圖的Y10的第一個中間計算值;

縱向:第二行特征圖的F10進入計算單元W01並與其進行計算,計算結果與W00傳遞的F00中間計算結果累加獲得F00的第二個中間計算結果。

同時F01進入W00計算Y01的第一個中間計算結果

以此類推,輸入的特征值沿着脈動陣列的行方向不斷開啟不同卷積核的中間計算結果,而對應着輸出特征圖的輸出點沿着列方向不斷進行乘累加。

周期8:在第一列脈動陣列的最后一個計算單元,進行Y00的最后一個中間計算結果的乘累加,得到第一個輸出特征圖的第一個點。 

周期9:第一列計算單元輸出第一張輸出特征圖的第二個點,第二列計算單元輸出第二張輸出特征圖的第一個點。

 

 

以此類推,每個周期都輸出對應輸出特征圖的點,直至輸出所有所有特征圖,完成脈動陣列計算卷積神經網絡。

啟動時間:

脈動陣列的計算方式決定了數據必須按照事先安排好的順序依次進入,所以每次要填滿整個陣列(使計算並行度最大)需要一定的啟動時間,這段時間會造成硬件資源的浪費。

啟動時間=行數+列數-1 (不是max{行數,列數}-1嗎?),當度過啟動時間后整個脈動陣列的並行度和吞吐量才達到最大。

脈動方式:

上述例子使用的脈動方式是:固定卷積核權重,橫向脈動輸入特征值,縱向脈動部分和。實際上可以任意選擇脈動這三個變量中的兩個,固定其中一個進行卷積,如:固定部分和,脈動特征值和權重的方式實現卷積計算。

脈動陣列大小設計:

脈動陣列的大小由行數和列數組成。這二者可以相等,也可以不相等。

上述實例中脈動陣列的行數與卷積核的大小相同,列數與輸出通道數相同。實際中如果卷積核非常大,或者通道數非常多,采用上述方式構建脈動陣列會過於龐大且不利於硬件實現。

為解決上述問題,一般采用分割計算末端累加等方式解決這一問題,即將多通道的權重數據分割成幾個部分,每個部分都能夠適合脈動陣列的大小,然后依次對各部分進行計算,最終在陣列底部的累加器中計算出最終結果。

3、谷歌TPU架構

架構組成:脈動陣列、矢量計算單元、主結構模塊、隊列模塊和統一緩存區。

計算流程

 4、脈動陣列

https://www.doc88.com/p-081712870059.html

https://www.zhihu.com/search?type=content&q=%E8%84%89%E5%8A%A8%E9%98%B5%E5%88%97

 

參考文獻

《昇騰AI處理器架構與編程》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM