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的隊列之中。