ISSCC-2020-GANPU論文解讀
@論文筆記
GANPU: A 135TFLOPS/W Multi-DNN Training Processor for GANs with Speculative Dual-Sparsity Exploitation
一、背景和動機
1.背景
這篇論文是韓國KAIST大學Semiconductor System Lab的最新成果,KAIST大學在片上訓練(On-chip-training)領域還是非常強的,已經在ISSCC發表過多篇相關論文。這篇論文是針對GAN生成對抗網絡做的片上訓練系統。
首先對GAN的背景以及應用做了些介紹,Gan廣泛應用於圖片的風格遷移,AI換臉,圖片修復等場景,無非是應用廣泛,值得一做。

生成對抗網絡主要分為兩個部分,一個生成器和一個判別器。生成器的任務是根據輸入圖片來生成一張“贗品”圖片,而判別器則接受生成的贗品圖片以及真實的標簽圖片,評估兩者的差異並輸出生成器生成的是贗品還是真貨,如果生成器生成的圖片沒能成功“騙過”判別器,則會根據判別器的輸出來更新或者優化生成器。
總而言之,GAN的兩個網絡相互配合,可以實現生成器生成的圖片盡量像標簽圖片或者說目標圖片靠攏。

2.動機
a. 本地VS雲端
之后,論文提出了主要矛盾,在邊際設備上,從雲端下載下來的模型在本地針對不同用戶的的使用場景表現出來明顯的失真。因此需要做片上的訓練。

GAN網絡的主要分類。

b. 計算和存儲瓶頸
不同類別的GAN的資源利用和計算量,存在明顯的存儲瓶頸和計算瓶頸。

一般判別器可以用傳統的圖像分類benchmark實現,判別器和生成器的計算量存在較大的差異,一半來說生成器的計算量普遍比判別器大幾個量級。
c. 輸入與輸出稀疏性的不對稱

另外,傳統的稀疏性方法在反向傳播時並不適用。當輸入激活值存在0元素時,在卷積時可以直接跳過為0元素的乘累加,這就是所謂的IA (input actication) zero skipping : 輸入稀疏性跳過。
而事實上,如果說我們能預先知道輸出層的某個元素為0,那么其實可以直接跳過計算該元素的所有運算!在反向傳播中,由於反傳的公式特殊性,以及一般卷積之前都會經過Relu函數激活,導致在向前推斷梯度時可以預先知道輸出的哪個位置是0(具體原理下面會分析),因此可以直接跳過設計該位置的所有運算。這就是所謂的 OA (output activation) zero skipping :輸出稀疏性跳過。

這邊也提到了,反向傳播具備的這種OA性質,只能加速反傳,對前向的計算實際上沒有幫助,因為前向過程無法預先知道輸出的稀疏性。
下面這張圖比較清楚地解釋了為什么反傳時OA可以提前確定:

實際上從\(\delta_c\)到\(\delta_R\)的推斷時會乘上激活函數導函數在\(X_N\)處的值,而Relu的導函數在x小於0時值為0,因此只要計算得到\(X_N\),就能提前知道反傳過程這一層的梯度\(\delta_R\)的哪些位置為0了。
通過上面的分析,可見IA和OA似乎在前向inference時是無法兼得的,這也是本文解決的主要問題之一。
二、架構
整體的架構分為三個層次:

1. GANPU硬件架構
整體拓撲圖如下:
-
采用了4*2*4=32個雙邊稀疏化訓練集群(DSTC)
-
二維網格化片上網絡,並且具有4個外部接口
-
8位和16位算術單元

在每個DSTC內部,包含:
- 輸入-輸出稀疏卷積計算核
- 指數形式Relu推測器
外部控制器包含可重構的累加網絡和RISC控制器,以及一種自適應的空間-時間復用方法。

2. 頂層的映射和數據調度機制
a. Adaptive Spatio-Temporal Multiplexing
先介紹自適應時空復用的工作機制:

傳統的計算網絡的方式是分時復用,在第一個時間步內計算A網絡,在第二個時間步內計算B網絡。但是往往因為網絡差異導致兩次計算面臨不同的瓶頸。
而另一種是分空間復用,將整個計算陣列分成兩部分,分別計算呢A和B網絡,哪個沒算完,下個時間步繼續把那個算完。這種復用方式一般會固定陣列的分法,也就是Fixed boundary的方式,因此缺少了自動適配的方式。(好的適配方式可以讓A和B幾乎同時算完而沒有IDLE)
因此論文提出了一種兩者結合的方式ASTM:

就是說可以自動根據帶寬和計算將計算陣列分配給不同的網絡部分,完成分時分空間的混合復用,從而可以最大程度地優化工作負載並縮短計算延遲,達到的效果如上圖右下角所示。
b. Reconfigurable Accumulation Network
跟上面的ASTM機制配合的是下面的這種可重構的累加網絡。因為ASTM會分時地將計算陣列划分為不同的部分,這些部分映射兩個不同網絡的不同計算,其計算的部分和需要特定的方式累加起來才是正確的結果。這個累加網絡就是負責干這個事。

可見為了匹配ASTM的這種靈活性,每個DSTC單元都跟一個Global Acc. Switch鏈接。每個switch都有東南西北四個方向的I/F。每個DSTC都可以通過它鏈接的Switch模塊將自己的部分和傳到臨近的任意一個節點並在節點中完成累加、BN以及激活操作,再分發給下一個節點。
以上兩個是top層做的優化,涉及一種數據調度和計算映射優化的片上網絡。
2. DSTC單元內部的工作方式
a. IOSC
在每個DSTC內部包含了6*7個PE單元,陣列左側的輸入buf存放以行為單位,逐通道方式存放的輸入圖,上方的mem存放7組filter,每組6個通道(個人理解)。每行PE計算一個輸入通道,每列PE計算一個輸出通道,每個PE計算完乘累加后將部分和往下輸入到下一行pe與下一行的部分和累加,最后輸入Local Accumulator。Local Acc應該是用於累加不同組Weight Mem計算得到的輸出值(每次計算6個輸入通道,在local acc中完成所有通道和的累加)。
每行PE公用一個Row Buffer,用於Row stationary的數據流,每計算完一次卷積Row Buffer內的數據相對之前的數據在input map上往右滑動一個stride。

每個PE內部采用的是Input stationary的形式,我理解的方式是:例如weight是3*3的大小,第一次放到pe里的是第一行的weight,與第一行的input map做卷積,做完這行之后,Row buffer導入下一行input map。而這時pe內部的weight不動,先計算第一行weight和第二行ifmap的卷積,得到第二行output map的部分結果。之后才導入第二行weight,保持ifmap不動,計算第二行ifmap和第二行weight的卷積,得到第一行的output map部分結果。
下面介紹了PE內部的IO skip邏輯:

負責輸入的Row buffer的每個數據都有兩部分,Data和IDX。IDX實際是輸入數據的RLC編碼。此外,pe內部還有一個8*16b的存儲ofmap的OA regfile,跟Row buffer類似,OA regfile的每一個數據都包含了一個Flag,表示這個data是否為0。
pe中的IO skip ctrlr負責利用輸入輸出的稀疏性。具體工作原理如下:

對於IA的稀疏性計算跟傳統RLC編碼的稀疏跳過算法類似,根據IDX計算行卷積,結果存入OA buffer中。圖中的\(O_0 = I_2*W_2,O_1 = I_2 * W_1\).而當卷積計算\(O_3\)時,因為預先通過flag知道這位為0,因此可以直接跳過這步卷積。
后面的計算類似。因此,對於這組實際長度為10的輸入,跟長度為3的卷積核卷積,理論應該計算8次卷積操作,而利用了IA和OA的稀疏性后只需要計算三次卷積。
b. IOSC Scheduling
由於考慮了IA和OA的稀疏性,PE之間的計算時間將變得不均衡,這也是稀疏卷積普遍面臨的問題。對於某些PE,可能提前其他PE就計算完成了本次計算,這時PE將會向Input Prefetcher 以及 Weight Prefetcher發出預取請求。這兩個預取模塊將會從memory中將數據提前取出供給結束早的pe,提高了pe的利用率。

c. IOSC performance
IOSC相對於只利用IA或者OA其中一種的方法有較大的提升。極大提升了吞吐率。

3. Exponent-Only ReLU Speculation
a. 如何判斷前向過程OA的稀疏性
上面提到了可以利用OA的稀疏性來優化卷積計算,但前提是得先獲得一個當前輸出是否為0的信息。在反向過程這個是可以得到的,但在前向過程如何獲取呢?下面論文提出了一種基於指數計算的預判機制。

其基本原理是將輸入IA以及權重W化為2的指數形式,這在浮點數表示的數據中非常容易,一般浮點數由一個符號位,若干個指數位,剩下的位數表示的是小數部分。具體的浮點數構成見上圖。我們只需要提取出每個浮點數的藍色和綠色部分。

之后,取一半通道的IA和一半通道的Weight做卷積,得到的結果如果不大於一個閾值則認為這次卷積的結果是0。實際上這種方法的思想是如果一半的卷積結果足夠負,那么不管剩下的卷積結果是什么,都認為不能左右最終通過relu后的輸出結果。
對於這個閾值實際上需要進行一定的權衡,越高的閾值會導致約高的誤判,從而導致OA預判錯誤率提升,雖然OA稀疏性會提高,但不利於網絡的准確率。較低的閾值則效果相反。論文經過實驗取得的經驗閾值是在10%的誤判率下取得的。
b. EOR unit architecture
EOR單元主要由72個指數計算PE構成。每個PE內部計算2的冪次的乘加,實際上乘法也轉換為了加法。因此這部分的代價不會很大。

c. Dual Sparsity Exploitation with EORS
EOR+IOSC兩種方式結合后,前向計算也能進行OA稀疏性運算。在前向時,EOR先進行運算,緊接着進行IOSC卷積運算,同時下一步卷積的EOR可以跟當前IOSC進行pipline並行計算。

此外,論文也給出了所提出的EOR+IOSC算法對Inference的准確率的影響,結論是在41.24%的平均OA稀疏性下,對網絡推理幾乎沒有影響。

最后是一些整體的性能結果以及對比表格:


三、Measurement Results

從表格上看,對比19年ISSCC論文(也是他們組的貌似)在能效上有將近5倍的提升。
