1. 程式人生 > >AI晶片:寒武紀Cambricon-X結構分析

AI晶片:寒武紀Cambricon-X結構分析

Cambricon-X

Cambricon-X是針對稀疏係數的矩陣計算架構。
深鑑科技的韓鬆等人的研究發現,可以將傳統的深度學習網路模型的許多權重係數去掉,甚至能去掉90%以上,而並不影響模型的計算精度。如下圖所示。
這裡寫圖片描述
目前的深度學習模型的權重係數太多,造成需要的乘法計算非常多,計算時間長,速度慢。
相信,未來的模型會更加複雜,需要的計算更多,時間更久。
未來把模型進行係數刪減,就成了必然。

但是,刪減了大量權值係數後,模型網路所需要的乘法計算次數明顯變少,但是因為係數的稀疏帶有不可控的隨機性,不同filter的有效權重可能是不同位置的,所以,這就造成了大量權重平行計算時,無法做到同步,導致目前現有的處理器設計都並不能充分利用係數稀疏帶來的加速效果。

Cambricon-X就是寒武紀在這個方面的一個探索。

Cambricon-X架構

下圖為Cambricon-X的架構。
這裡寫圖片描述
可以看出,整個架構還是和DianNao很像。
當然還是有不同的。
最大的不同是,為了利用到稀疏係數帶來的加速效果,首先就需要將係數為0的權重所對應的輸入資料去掉。這個,由Fig4中的Buffer Controller來實現。
Buffer Controller的具體結構見Fig5,主要由indexing實現資料的篩選。
Indexing從輸入神經元資料(input neurons)中挑選出非0權重對應的輸入資料,按順序排列好,然後傳輸給對應的PE。然後,由PE去執行乘法/加法等操作。
PE結構如下圖所示。
這裡寫圖片描述


可以看到,PE中有個小SB,用於存放有效的權重。

權重的儲存方式是,將單個神經元的所有不為0的權重儲存在一起,如下圖所示。
這裡寫圖片描述
假設每個地址能儲存4個權重。
在圖7中,假設只有2個神經元:
神經元0,只有0和4,兩個權重引數w00 和 w40,儲存在address0。
神經元1,有5個權重引數w11, w21 , w31, w51, w61, 這樣一個地址不能完全儲存,於是需要2個地址,儲存在address1和address2.

權重的稀疏性,造成每個神經元計算時,需要讀取權重的次數不相同,比如,神經元0只需要讀一次權重memory,神經元1需要讀2次權重memory,這種不規律,造成難以大量神經元同步計算,無法直接利用脈動陣列的優勢。

Indexing Module

既然權重是無規律稀疏的分佈。那麼,怎麼將權重與對應的輸入資料匹配起來呢?

Cambricon引入了Indexing Module(IM)
在這裡插入圖片描述
Cambricon-X的每個PE都配置有一個單獨的IM。
依然採用了輸入資料在不同神經元上覆用的思想。
按照上方圖7的例子,依然是2個神經元,在非稀疏情況下每個神經元計算一個卷積結果需要八個輸入資料和8個權重,現在是稀疏的,還是一次讀取了8個數據,但是神經元0只需要其中2個數據,神經元1需要其中5個數據。
這就需要一種機制去實現權重與輸入資料的對應關係。
Cambricon採用的是用標誌位connections[i]表示是否有對應連線關係,如圖9所示。

Direct Indexing

直接想到的對映機制是直接對映,每個connections的每個bit對應一個輸入資料,如圖10所示。
在這裡插入圖片描述
這種方式的優點:簡單直接;缺點:當稀疏性較大時,會有許多connections[i]是無效的0,浪費晶片內的空間資源。

為了降低空間浪費的問題,又引入了step indexing。

Step Indexing

顧名思義,只儲存非零的connections[i],並存儲相鄰兩個非零的connections[i]的距離step(中間間隔的無效0的個數),然後通過累加step,就能恢復出原始的稀疏陣列。如圖11所示。(論文原圖中有小錯誤,如圖紅色標註所示)

在這裡插入圖片描述
這種方式的優點是:可以節省無效0佔據的空間;缺點是:需要額外的計算器去累加step,並且需要耗費一些時間。
不過,由於目前用到的模型的尺寸都很大,比如yolo_v3中的網路就往往是416X416的,如果能去除90%的冗餘權重,那麼step indexing就能明顯減少無效0佔據的空間。

Cambricon-X的設計中,經過綜合考慮,選擇的是step indexing。

總結

到了這裡,Cambricon-X的內部結構就很清晰了。
整體來看,結構類似DianNao,只有一列(或一行)計算單元,而不是TPU的那種二維的脈動陣列,輸入資料的複用效率就低了不少。
估計Cambricon-X,是按照複用輸入資料的思路來控制的。猜測其運算方式是:每次讀取一次卷積需要的輸入資料,然後將資料傳輸給當前的所有PE的IM,然後每個IM根據step indexing去計算並匹配權重和輸入資料,完成資料的匹配後,統一或者各自自主傳輸給各自的PE(計算單元,內部是乘法器及加法器等),當所有PE計算完成後,將結果寫入NBout(buffer),才能進行下一次的計算.
有個缺點:因為要複用輸入資料,所以是按照輸入資料來控制計算的,就算有PE提前算完,估計也必須等著別的PE計算完成。所以,一次計算的時長,是計算最慢的那個PE決定的,這就表明,Cambricon-X的頻率不會非常高。

不過,如果矩陣非常稀疏,那麼Cambricon的優勢還是非常明顯的。

而且,隨著之後模型尺寸越來越大,計算量也越來越大,算力非常緊缺,研究稀疏性矩陣的計算,非常有應用前景,特別是嵌入式終端方面,比如手機。

不管怎麼樣,Cambricon-X還是一個很不錯的探索!!

感謝寒武紀!!