寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析

DaDianNao

寒武紀的DaDianNao的誕生稍晚於DianNao,同樣也是在2014年。

如果把DianNao看作是嵌入式終端使用的處理器,那麼DaDianNao就是服務器上用的大規模高性能處理器。

DaDianNao其實就是採用的DianNao的NFU作為內核,然後在一塊芯片上同時放置了16個NFU,於是乎,性能也就是DianNao的16倍。

文章說,在DaDianNao的設計過程中,首先想到的是,直接將DianNao中NFU的邏輯資源擴大成原來的16倍即可簡單實現性能16倍的提升。但是這裡就要考慮芯片上實際的晶體管佈局及佈線。發現,如果單純擴大NFU規模,那麼最終佈線所佔用的芯片面積遠遠超過NFU邏輯模塊,貌似並不高效,如下圖中的Figure4所示。

於是乎,就想到了多核並行的架構。

將上面的大NFU拆分成16個小NFU(DianNao),通過合理佈局佈線,能夠大幅縮小布線需要的面積,最終面積的減小28.5%,而性能與上面的設計相同。

芯片上,那可真的是寸土寸金。

沒說的,選第二種,也就是下圖中的Figure5。

寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


到目前為止(2018年),國內的人工智能公司,大部分還是侷限在算法領域,並不關注底層硬件。少數幾個大體量的AI獨角獸,如寒武紀/商湯/深鑑/地平線/比特大陸等公司,都對芯片有不同程度的涉足。這其中,大部分公司的芯片都只是涉及到終端的推斷(inference),而沒有涉足訓練(training),所以芯片設計比較簡單。

相反,國外的科技巨頭,比如谷歌/intel/NviDia/facebook等,都有涉足training的深度學習處理器的研發。

寒武紀是少數已經涉足training的中國企業。

DaDianNao就是可以用於服務器上進行大規模training的專用芯片。

PuDianNao

之前介紹了寒武紀的DianNao和DaDianNao,其實內部處理邏輯可以說是一樣的。

這種架構,只能適用特定的算法類型,比如深度學習(CNN,DNN,RNN)等。

但是,深度學習只是機器學習中的某一類,整個機器學習,有很多其他種類的算法,和深度學習的不太一樣,甚至經常用到除法等計算類型。這些算法,目前的應用範圍也很廣。

為了加快常用機器學習算法的運算,寒武紀又設計出專門針對這些算法的處理器方案:PuDianNao.

PuDianNao,內部實現了7種常用的機器學習算法:k-means, k-nearest neighbors , naive bayes , support vector machine , linear regression , and DNN.

PuDianNao的結構如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


可以看出整體結構和DianNao比較像。

三個buffer存儲數據,一個存儲輸出,2個存儲輸入。

核心是中間的運算邏輯。

PuDianNao的運算邏輯,可以看成由許多組相同的FU(Function Unit)並聯組成。每個FU中包含一個MLU和一個ALU。

MLU結構如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


MLU

可以看出,MLU(Machine Learning Unit)的整體結構與DianNao的NFU比較像。

與NFU相比,PuDianNao在NFU-1的前面增加了2層邏輯Counter和Adder。

Counter用於累加,結果直接輸出。Counter用於naive bayes 和 classification tree需要的。

Adder 用於大部分的機器學習算法,計算結果要麼直接輸出,要麼作為下一級的輸入。

Multiplier相當於DianNao的NFU-1.這裡就不再贅述。

Adder tree相當於DianNao的NFU-2。

Acc,用於當計算的size大於硬件資源,比如需要累加30個輸入,但是一次只能累加16個,所以需要連續累加2次,那麼第一次的前16個的累加結果就暫時存在Acc中,等後面14個累加結果到了,再累加起來,形成30個輸入的累加結果,直接輸出或作為下一級的輸入。這裡與DianNao是有區別的。DianNao對這個問題的處理,選擇將前16個輸入的中間累加結果暫時存入NBout中,與剩下的14個輸入一同完成累加,形成最終結果。二種方案的具體優劣,無從評判,但是個人感覺,PuDianNao增加了一級Acc,僅以很少的資源,比如一個累加器,幾個控制信號,就能實現大size的計算,而DianNao的方案則需要將結果寫入NBout,讀寫存儲是很消耗功耗的,並且需要的佈線資源也不少,信號傳輸需要時間,可能綜合來看,個人覺得還是PuDianNao的方案更加高效。當然,這個判斷並沒有經過實際仿真驗證,僅僅是一點直覺。當不得準。

Misc,相當於DianNao的NFU-3。

可以看出,MLU中的邏輯,只能執行乘法/加法/激活等操作,但是某些機器學習算法需要用到除法等不常用的計算類型。於是,必須增加對這些計算類型的支持。

ALU

PuDianNao選擇在MLU之外,額外增加一個ALU(Arithmetic Logic Unit).

ALU中包含一個加法器,一個乘法器,一個除法器,一個converter。

增加ALU也很合理,畢竟有些機器學習算法,需要特殊的計算,不得不準備專門的邏輯資源,以保證算法功能得到正確執行。

ShiDianNao

ShiDianNao的出現是寒武紀在深度學習處理器上細分領域的更加深入。

前面介紹的DianNao針對的是大部分的深度學習神經網絡算法,包括CNN和RNN等。

目前比較火而且應用面非常廣的領域是計算機視覺,若在這個領域的算法精度實現巨大突破,那麼,就將開啟廣闊的應用領域,能夠真正明顯地改變世界。比如自動駕駛/安防等等,利潤豐厚的領域。

圖像識別,這類算法主要採用CNN結構。

於是乎,開發專門針對CNN的ASIC就變得可行且有商業價值。

寒武紀為何在已經有了DianNao的基礎上,還要設計ShiDianNao?

先來分析下,目前DianNao存在的缺陷。

眾所周知,深度學習類的算法都是計算密集型和存儲密集型。

這就造成了不低的功耗。

當這類芯片應用到終端嵌入式設備上有許多限制,比如智能手機,對芯片功耗有著嚴苛的要求。

因為DianNao中的數據會存儲在DRAM中,而DRAM的讀寫會消耗非常大的功耗。

如果能夠避免用DRAM存儲數據,那麼就能很大程度上降低功耗。

是的,就是基於這個想法,ShiDianNao誕生了。

ShiDianNao的想法就是,在實際應用時,將用於圖像識別的人工智能處理器在物理位置上比較靠近圖像來源(CMOS/CCD傳感器),這樣就避免了圖像數據需要DRAM的存儲。

另外,對於CNN算法,其中常用的一類CNN是共享權值的,這樣權值的數量就不大,可以完整存放在片上SRAM中,從而使得權值也能避免存儲在DRAM中。

這樣處理後,整個系統就不需要DRAM做存儲,從而大幅降低功耗。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


上圖將Acc(人工智能處理器)放置在離傳感器很近的位置,直接從傳感器獲取圖像數據,避免了DRAM的使用。

ShiDianNao架構

ShiDianNao的架構如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


整個架構與DianNao一脈相承。三個buffer分別存儲權值/輸入數據/輸出數據。

核心邏輯是右邊的NFU,也就是PE陣列。PE(processing elements),是最小的處理單元。

NFU的內部結構如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


從上圖可以看出,權重是同時廣播到所有的PE,輸出也是同時傳遞到output,而輸入數據則配合每個PE內部的兩個fifo,有不同的輸入規律,有時一次給所有PE提供輸入,有時又只給一列提供輸入其餘列靠相鄰右邊的fifo提供,有時又給一列提供輸入其餘列靠相鄰下方的PE的fifo提供。

單個PE結構如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


ShiDianNao與TPU1對比

與TPU的脈動矩陣相對比,發現二者都共用了權重和輸入數據。但是細細分析,還是覺得TPU的脈動矩陣更加優秀高效。

比如,二者都共用了權值,ShiDianNao是統一獲取權值,然後同一週期廣播到所有PE。受限於信號在導線中傳遞速度,信號完整性以及時序同步的問題,ShiDianNao的PE陣列無法做到比較大的規模,且規模越大,需要的傳輸佈線長度約長,傳輸時間越久,因此頻率也無法做到很高。而且,每個PE都是單獨出結果,也就是說,在PE陣列中央的PE也要直接給輸出傳遞數據,這就意味著需要不菲的佈線資源。所以,ShiDianNao的缺點還是比較明顯的。

再比如,二者都共用了輸入數據。ShiDianNao是在PE內部有兩個FIFO來存儲多個輸入數據。而且因為輸入數據共享的方式有幾種不同的情況,所以就造成了為了共享數據,不同時刻,數據的傳遞方向是不同的,比如,可能是按列,從右往左傳遞,也可能是按行,從下往上傳遞。而反觀谷歌的TPU,採用了脈動陣列,於是,輸入數據只需要從陣列的左側進入,然後所有輸入數據都從左往右依次傳遞,傳遞方式非常簡單,也不需要在PE中內置FIFO。

幾種不同的輸入數據傳遞方式,見下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


另外,脈動陣列只有最下面一行的PE會輸出計算結果,只有最左邊的一列會接受輸入數據,整體來說,所需要的佈線資源就少很多。另外,因為PE所需的輸入數據/權重相關信息/中間計算結果,都來自鄰近的PE,不需要很長的走線,且能夠輕易做到相鄰PE的距離相同,那麼相鄰PE之間的信號傳遞時間就完全一致,可以保持整個脈動陣列工作在非常高的頻率。

總體來看,個人認為還是谷歌TPU的脈動陣列更加高效。

計算卷積

下面看看ShiDianNao是怎麼計算的。

以卷積為例。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


Figure13(a)顯示了一個2X2的PE陣列。所以可以同時計算4個輸出。所需輸入數據如圖右側的4個不同顏色方框所示。中間則表示了從cycle0開始,每個cycle,給每個PE的輸入數據。可以看出,其中有部分數據可以反覆利用。於是,這就給增加FIFO來實現數據複用提供了可能。

Figure13(b)則配合圖(a),給出了每個cycle,每個PE中的FIFO應該如何存儲輸入數據,以及輸出數據複用。

這種方式有個缺點,一般而言,圖像數據存儲在RAM中,都是按照一張圖的數據集中存儲在一起,那麼,取同一張圖像上的某些像素點作為輸入數據時,每個週期的像素地址並未對齊,無法在一個週期中獲取該週期需要的所有有效數據,難以滿足PE陣列的需求,會降低計算速度。

狀態機

整個ShiDianNao的運行,會因為算法中的不同計算而有不同的控制方式,這就需要用到狀態機,如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


引入狀態機控制ShiDianNao工作,就可以採用指令集的方式,描述需要的操作,然後由狀態機執行。

這一點,比較贊。

猜測寒武紀的一系列芯片應該都採用了這樣的狀態機進行控制。

Cambricon-X

Cambricon-X是針對稀疏係數的矩陣計算架構。

深鑑科技的韓鬆等人的研究發現,可以將傳統的深度學習網絡模型的許多權重係數去掉,甚至能去掉90%以上,而並不影響模型的計算精度。如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


目前的深度學習模型的權重係數太多,造成需要的乘法計算非常多,計算時間長,速度慢。

相信,未來的模型會更加複雜,需要的計算更多,時間更久。

未來把模型進行係數刪減,就成了必然。

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

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

Cambricon-X架構

下圖為Cambricon-X的架構。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


可以看出,整個架構還是和DianNao很像。

當然還是有不同的。

最大的不同是,為了利用到稀疏係數帶來的加速效果,首先就需要將係數為0的權重所對應的輸入數據去掉。這個,由Fig4中的Buffer Controller來實現。

Buffer Controller的具體結構見Fig5,主要由indexing實現數據的篩選。

Indexing從輸入神經元數據(input neurons)中挑選出非0權重對應的輸入數據,按順序排列好,然後傳輸給對應的PE。然後,由PE去執行乘法/加法等操作。

PE結構如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


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

權重的存儲方式如下圖所示。


寒武紀DaDianNao/PuDianNao/ShiDianNao/Cambricon-X結構分析


假設每個地址。