EIE:Efficient Inference Engine on Compressed Deep Neural Network論文詳解

EIE爲韓鬆博士在FPGA2017上的最佳論文。

 

一、背景與介紹

1.1 Motivation

最新的DNN模型都是運算密集型存儲密集型,難以硬件部署。

1.2 前期工作

Deep compression 通過剪枝量化等方法極大的壓縮了模型。Deep compression解析見下鏈接

 https://blog.csdn.net/weixin_36474809/article/details/80643784

1.3 貢獻點

  • 提出了EIE (Efficient Inference Engine)的方法,將壓縮模型應用與硬件。
  • 對於壓縮網絡來說,EIE可以帶來120 GOPS/s 的處理效率,相當於同等未壓縮的網絡 3TGOP/s的處理效率。
  • 比CPU和GPU帶來24000x和3400x的功率提升。
  • 比CPU,GPU和Mobile GPU速度快189x, 13x,307x

二、方法

2.1 公式描述

 神經網絡的基本運算

對於神經網絡中的一個Fc層,相應的運算公式是下面的:

其中,a爲輸入,v爲偏置,W爲權重,f爲非線性的映射。b爲輸出。此公式即神經網絡中的最基本操作。

 對於神經元的運算

針對每一個具體的神經元,上面的公式可以簡化爲下面這樣:

輸入a與權重矩陣W相乘,然後進行激活,輸出爲b

 Deep compression後的公式

Deep compression將相應的權重矩陣壓縮爲一個稀疏的矩陣,將權值矩陣Wij壓縮爲一個稀疏的4比特的Index Iij,然後共享權值存入一個表S之中,表S有16種可能的權值。所以相應的公式可以寫爲:

即位置信息爲i,j,非零值可以通過Iij找到表S中的位置恢復出相應的權值。

 查表與值

權值的表示過程經過了壓縮。即CSC與CRC的方法找到相應的權值,即

具體可以參考Deep compression或者網上有詳細的講解。

https://blog.csdn.net/weixin_36474809/article/details/80643784

 例如上面的稀疏矩陣A。我們將每一個非零值存下來在AA中。

JA表示換行時候的第一個元素在AA中的位置。例如A中第二列第一個元素在A中爲第四個,第3行元素在A中爲第6個。

IC爲對應AA每一個元素的列。這樣通過這樣一個矩陣可以很快的恢復AA表中的行和列。

 2.2 矩陣表示(重要)

這是一個稀疏矩陣相乘的過程,輸入向量a,乘以矩陣W,輸出矩陣爲b,然後經過了ReLU。

用於實現相乘累加的單元稱爲PE,相同顏色的相乘累加在同一個PE中實現。例如上面綠色的都是PE0的責任。則PE0只需要存下來權值的位置和權值的值。所以上面綠色的權值在PE0中的存儲爲下面這樣:

通過CSC存儲,我們可以很快看出virtual weight的值。(CSC不懂見上一節推導)。行標與元素的行一致,列標可以恢復出元素在列中的位置。

向量a可以並行的傳入每個PE之中,0元素則不併行入PE,非零元素則同時進入每一個PE。若PE之中對應的權重爲0,則不更新b的值,若PE之中對應的權重非零,則更新b的值。

三、硬件實現

3.1 CCU與PE

CCU用於查找非零值,廣播給PE。

PE即上面算法中的PE單元, 實現將CCU廣播過來的數據進行卷積的相乘累加和ReLU激活。下面爲每個具體單元的作用。

3.2 Activation Queue and Load Balancing

上圖之中的連接PE與CCU之間的序列。

如果CCU直接將數據廣播入PE,則根據木桶短板效應,最慢的PE是所有PE的時間的時長。

所以我們在每個PE之前設置一個隊列,用於存儲,這樣PE之間不同同步,只用處理各自隊列上的值。

  • 只要隊列未滿,CCU就向PE的隊列廣播數據
  • 只要隊列之中有值,PE就處理隊列之中的值

這樣,PE之間就能最大限度的處理數據。

3.3 Pointer Read Unit

根據當前需要運算的行與列生成相應的指針傳入稀疏矩陣讀取單元

3.4 Sparse Matrix Read Unit

根據前面傳入的指針值,從稀疏矩陣的存儲之中讀取出權重。

3.5 Arithmetic Unit

 進行卷積之中的權重與feature相乘,然後累加的操作。

3.6 Activation Read/Write

每次相乘之後會對bx進行累加

3.7 Distributed Leading Non-Zero Detection

LNZD node,用於寫入每層計算feature,下一層計算的時候直接傳給CCU到下一層。

這個因爲神經網絡計算方式,本層計算結果作爲下一層的計算輸入,激活神經元要被分發到多個PE裏乘以不同的權值(神經網絡計算中,上一層的某個神經元乘以不同的權值並累加,作爲下一層神經元),Leading非零值檢測是說檢測東南西北四個方向裏第一個不爲0(激活)的神經元,就是每個PE都接受東南西北4個方向來的輸入,這4個輸入又分別是其他PE的輸出,是需要計算的,那我這個PE計算時取哪個方向來的數據呢?用LNZD判斷,誰先算完就先發射誰,儘量佔滿流水線。

 PE之間用H-tree結構,可以保證PE數量增加時佈線長度以log函數增長(增長最緩慢的形式)

3.8 Central Control Unit(CCU)

用於將LZND模塊之中的值取出來然後傳入PE的隊列之中。

IO模式:當所有PE空閒的時候, the activations and weights in every PE can be accessed by a DMA connected with the Central Unit

運算模式:從LZND模塊之中,取出相應的非零值傳入PE的隊列之中。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章