作者:一皓,驕旸,心彥,張量,Yiping等雲栖PPT合作同僚
此文内容來自雲栖大會人工智能晶片專場,想了解更多情況請觀看雲栖大會回放
雲栖大會回放(9月25日下午人工智能晶片專場)
古往今來,中外各國,兵器種類繁多。中國有“十八般兵器“,還有不少奇門兵器。這是因為兵器有長短,利鈍,剛柔,等各種特點,各有利弊,沒有一把兵器能集齊所有優勢。
所謂“劍走偏鋒鋒芒露”,是指劍身細長輕盈,是以劍法要以快為主,以攻為主,用劍者講求身法靈動,招式精奇,以求出奇制勝!
上古三劍 一曰“含光”
視不可見 運之不知其所觸
泯然無際 經物而物不覺
前言
2019雲栖圓滿結束,含光800正式釋出,成為了焦點中的焦點。隻有少數人有幸參加雲栖,現場見證這激動人心的時刻。其他人大都通過媒體報道才了解到相關産品的資訊。當我看到各式各樣的報道,特别有一些文章充滿了誤解和偏見的時候,我覺得應該站出來,給大家詳細地介紹一下雲栖上相關的slides,糾正一些外界錯誤的解讀。同時讓阿裡同僚對我們的含光800NPU有進一步的了解。
下面介紹的内容會限制在slides裡原有的内容,其他更多的内容會在時機成熟的時候,做進一步分享。

含光800定位
含光800NPU雲栖PPT回顧【晶片與軟體棧系列之----劍走偏鋒】前言含光800定位晶片架構軟體棧架構性能解讀後記
上面是業務定位的一張PPT,針對業務定位,大家主要的一些疑問:
Q:為什麼隻做了推理晶片
其實這個問題的答案很簡單,大家隻要稍微想一下就會了解。
- 首先,随着越來越多的AI應用落地,推理業務量遠大于訓練業務量。這種趨勢在阿裡内部更是明顯。是以從業務量的角度來說,推理是第一優先級。
- 其次,阿裡做AI晶片是從零開始,我們的團隊是一個一個從不同的公司陸陸續續招過來的,好多人其實都沒做過AI晶片。雖然每一個人都是像平頭哥一樣戰鬥力極強,但在人少,時間短的情況下,一定要集中精力做好一個方面。
- 再次,從訓練和推理的屬性/需求做分析 (部分模仿Habana Hot Chip 2019的一些總結),推理可以視為訓練的基礎和踏腳石。
之前的一篇文章裡提到的以色列AI初創公司Habana Labs也是同樣的産品路線圖政策:先出高性能的推理晶片Goya,然後一年以後才推出訓練晶片Gaudi。
Q:計算加速的算法定位
計算晶片從通用變得越來越專用了,這是基于特定領域架構(Domain-Specific Architecture, DSA)的晶片設計趨勢。它是和通用計算不同的一種發展方向,
- 一方面在摩爾定律失效的今天,是提高晶片性能一種很好的思路,
- 另一方面,晶片設計越來越成熟,加上DSA架構相對簡單,這種思路能夠快速地量産和疊代,跟随AI技術的發展。
- 同時,目前人工智能的應用還是比較集中,主要在視覺,搜尋,推薦,語音,自然語言等方面。
我們分析阿裡集團内部的人工智能應用場景需求,确定了以CNN模型為主做了深度的優化,同時支援一些通用模型,比如RNN類模型等。這是針對特定深度學習算法領域做特别的優化,把相關應用的成本效益提高到極緻。
Q:為什麼要做個大晶片
看到有文章在質疑,為什麼含光800做這麼大,整合了比較大的本地存儲?提出了三個主要的問題:
- 功耗高,不适合雲端的超大規模叢集的部署;
- 面積大,影響晶片良率,晶片成本高;
- 算力過剩,沒什麼必要,業務量沒那麼大,或者系統裡其他地方成了瓶頸。
粗看上面的問題是有些道理,但其實我們是考慮了相關因素的。首先,請看下面這張表,我們有多種工作模式來調整适應不用的應用場景,可以通過調頻,調壓,調整核心的數目等多種方式來達到這個目的。而且大的本地存儲看起來一方面是增加了功耗,但同時加少了傳輸和拷貝的次數對應的功耗。靜态功耗相對動态功耗本身就比較小,一加一減之後,實際平均功耗的增加是不明顯的。
其實和其他晶片直接對比,含光800面積功耗并不突出。隻是大家以傳統的觀點去看新穎的AI算法架構,對較大的本地存儲産生了直覺的想法,就是這個晶片肯定特别大。
另外,如上一圖中所寫,根據阿裡集團的主要業務形态,我們選擇以資料中心,邊緣伺服器以及大型終端為目标。這寫業務都是急需大量算力的地方。很多的業務方同僚都給我們反映,他們業務和算法需要大量的GPU,受制于GPU的算力和高價格,沒法鋪開業務量,有些業務甚至沒辦法開展。是以他們急需高性能和高成本效益的晶片。
最重要的,這也是我們的最初的目标:做第一!這個世界,人們隻會記得第一,少有人會記得第二,就好像人們隻能記住世界上第一個登月的人是阿姆斯特朗,誰會記得第二個登月的是誰。雖然他和阿姆斯特朗一起,隻差15分鐘,成為第二位踏上月球的人類。
Q:為什麼沒有解碼器
翻看相關的應用,我們會發現很多的應用其實是不需要編解碼器。而我們含光800的目的是極限地加速深度學習算法,不是做一款功能齊全的晶片,或者整合更多IP的SoC。試想,為了比對含光800的超大算力,再整合一個超大的編解碼器,這個晶片就更是巨無霸了。
當然時間短,整合太多的IP會影響晶片問世的時間了。
其實,市場上有很好的編解碼可以和含光800搭配,比如,Intel VCA2。對需要編解碼功能的應用場景,可以比較靈活地搭配相适應的算力的兩種卡,這樣搭配成本效益很高,充分發揮兩種卡的算力。而對不需要編解碼的應用場景,也不用擔心浪費了晶片的整合解碼器(如果有的話)。
晶片架構
打造一把無雙的神兵利器,需要稀世的材料,也需要獨特的技能。我們來看看打造“含光”用了些什麼材料和技能?!
頂層架構
含光800最頂層的架構圖如下:
頂層架構圖看起來比較簡單,粗看會覺得和其他架構差别不大:
- 多核,核的具體數目可以根據設計情況變化,每個核可以獨立工作,包括子子產品:
-
- 多個Tensor Array,主要負責卷積,矩陣乘等張量操作(Tensor Operation)。
- 和每個Tensor Array對應,有一塊本地存儲(Local Memory)儲存相關資料
- 一個Vector Engine,負責向量相關的操作
- 一個控制單元(SEQ),負責指令的解碼,排程和發射,各種事件同步,以及标量寄存器和運算。
- 一個DMA引擎
- 其他還包括一個指令處理器(CP)和PCIE Gen 4.0.
這些子產品的設計暫時不友善詳細介紹。我們可以從頂層架構來仔細觀察,和其他架構對比,頂層架構的有兩個創新點:
- 存儲系統:隻有一級本地存儲,相對其他晶片的L1+L2來說,比較大
- 核間通信(xCORE-COMM)
存儲系統
存儲系統的創新,是含光800能獲得高性能的最大保證。我們都知道深度神經網絡是資料密集型計算,參數量大,計算的中間值也量大。怎樣設計好資料的存儲,傳輸和輸入-計算-輸出的流水線工作模式,對最終的性能和效率至關重要。反之,一旦存儲系統設計不合理,很容易變成整個晶片和整個應用系統的瓶頸,這種情況下,再多的理論算力(TOPS)都是沒有意義的。
如果了解傳統CPU/GPU,以及其他新的Ai 晶片,比如華為Davinci架構,前一篇文章分析的Habana Labs的Goya,我們就會發現,這些晶片都是除了各種cache/buffer之外,都是兩級或兩級以上的片上存儲。L1存儲是各個核心的本地存儲,L2通常是共享存儲,有些晶片還有L3的緩存。多級緩存的目的,本身也是希望使用大小比較合适的存儲,通過合理的分布式cache和級間排程,消除資料傳輸的瓶頸,提高算力的效率。
以上面Davinci架構核心為例,存儲系統也是經過非常細緻地設計:
- 8M L2,保證一定地片上存儲,縮短DMA延遲(推理SoC上還有L3,但不一定會被Davinci核心使用)
- 1M L1,接存儲轉換單元(MTE),輸入計算單元前做格式轉換
- 雙Cube輸入緩沖(A,B),交替準備資料,減少MTE延遲
- 累加器緩存(C)
- 輸出緩存
特别地,針對神經網路計算輸入類型和格式比較多,輸出比較單一的特點,達芬奇架構設計了多輸入方式,單一輸出方式的存儲系統。具體的說,資料的輸入可以通過L2到L1輸入緩沖,也可以直接通過MTE到緩沖A/B,甚至可以到輸出緩沖。當然這是由軟體根據需要,比如,是否需要MTE轉化,前後計算的依賴,最大并行可能等來判斷和控制的。輸入的輸出就比較單一,都是輸出到緩沖區再輸出的。
根據經驗,可以想象華為的軟硬體部門一定需要很仔細地調整了相關流程和控制,即使這樣,考慮到L1的大小有限(1M),在一些複雜的網絡結構和多輸入的情況下,估計還是很難做到不成為瓶頸的。有興趣的話,可以嘗試去計算一下核心算力的使用率來看看這個推測。
含光的存儲系統,以相對大得多的L1緩沖大小,以及合理的存儲布局,加上軟體系統的配合,避免了上述的問題。在以後的詳細介紹中,我們可以看看相關系統的設計創新點。
核間通信
傳統多核系統中,核間基本沒有直接通信和資料傳輸的,通常都是通過排程器/控制器來間接通信,資料也是需要通過L2緩存,同時也需要一緻性的保證。整個通信和傳輸相對不是特别高效,延遲高。
在深度神經網絡的計算中,比如卷積,或者矩陣乘等操作,通常參數量都非常大。由于每個核心配備的存儲大小有限,是以往往矩陣A*B,需要将矩陣B拆分成多個。比如,可以按照塊m*n的大小來份塊,也可以按照某一個次元,比如M*N的矩陣,将N分成多份,每份n,這樣就變成M*n的小矩陣,每個核心一次完成其中一個小矩陣的運算。
緩存小的時候,B的每個子矩陣M*n需要一個一個依次但又重複地拷貝到緩存中,完成整個一個個的輸入A和矩陣B的計算。但是在大容量緩存的時候,子矩陣可以常駐不同核心的緩存,這時可以通過核間通信和資料傳輸,來完成高效的運算。
這是伴随存儲系統創新産生的新的通信和資料傳輸的創新點。對解決大的模型的存儲通路效率非常關鍵。
架構特性
含光800的架構特性,在下面這張PPT裡描述得比較清楚,限于篇幅和時機的原因,這裡暫時不展開具體對每一個特性做詳細地介紹。
含光800是阿裡AI晶片的針對應用領域做優化的處理器架構(DSA)的實踐。是以我們通過前期深度調研,結合算法,軟體和硬體架構共同設計,産生了上面相關的一些特性。
但是,含光800并不局限在上面這些深度優化的算法,我們通過軟體棧的合理轉換和編譯,将它運用在更多的領域。當然在後續的晶片中,會針對更多,更新的應用模型來加入新的支援。這本身就是DSA架構的一個精髓:領域和算法專用,快速疊代。
架構對比
再回到DSA架構的話題,針對幾個不同的晶片架構做一下對比,
- CPU,最通用的計算架構。
- GPU(例如Tesla T4),可以說是一個通用的AI架構,能實作各種的AI算法,計算核心是由tensor core + cuda core一起組成。
- DaVinci架構,我的看法,也是一個比較接近GPU架構,是一個通用的AI架構,由矩陣,向量,标量計算單元組成,或者說是一種,和華為AI應用定位相關,這個核心的應用場景非常廣。當然也有華為在CPU,GPU上面的技術積累相關,做一個增量式的開發,加入矩陣/向量計算單元等AI需要的部分。
- Habana Goya,比較偏專用AI推理架構,适用大部分現有的深度學習算法
- 含光800,和Goya比較類似,同時創新的力度更大,軟硬體結合更密切。
現在估計大家對什麼是打造含光的材料和技能有了一個答案。
軟體棧架構
神兵利器一定需要絕世劍法,否則就形如破銅爛鐵!
對于“含光”來說,這劍法就是HanGuangAI軟體棧。因為在軟硬協同的DSA晶片系統中,軟體棧的重要性不言而喻。隻有依靠他,才能發揮硬體的設計優勢,得到優異的系統性能。
我們希望能過通過HanGuangAI,
- 使用者能通過主流的深度學習架構無縫使用含光NPU,
- 程式開發者能簡單友善的基于NPU做開發,
- 更高效地利用含光NPU,充分發揮它的性能
群雄争霸
深度學習,群雄混戰的時代!學習架構就有好幾大門派:Tensorflow, Pytorch, MxNet, ...。計算晶片也是遍地開花,傳統的CPU,兩家獨立GPU,還有無數的不同架構的AI晶片...。于是乎,學習架構想更好地支援更多的計算晶片,計算晶片也希望能更好地支援更多的架構!
前端
上一篇文章裡提到,各家架構嘗試使用多層IR的架構,将硬體無關的部分提煉出來,專注于與特定硬體模型無關的圖和數學相關優化。在他們的後端,都支援将他們的中間表示(IR)重定向到不同的硬體後端。
- Pytorch---GLOW,Habana積極參與的一個架構
- Tensorflow---MLIR,開發中,統一和簡化Tensorflow裡的多種中間IR
- MxNet---NNVM/Relay+TVM,外部應用最廣的一個AI棧,不少公司基于這個架構開發
需要注意的是,NNVM+TVM是一個更大範圍和目标的架構,前端,希望對接更多的架構模型,後端通過TVM Primitives對接更多的硬體相關的編譯器後端。
後端
特别的,我們看看華為MindSpore-TBE架構,當然TBE是既可以用在MindSpore架構,也可以對接到其他架構的後端。
從現在看到的材料看,Ascent AI軟體棧是以TVM的為基礎,或者說作為參考來設計實作的,增加了上面TBE後端代碼生成的部分。這樣可以利用很多現成的東西,包括TVM的計算代碼,對接更多的架構,實作Ascend AI處理器的支援。
HanGuangAI頂層架構
整體架構來說,HanGuangAI軟體棧和Goya的SynapseAI軟體棧比較接近。我們沒有利用現有的任何一個架構和編譯器,而是自己開發了自己的圖IR,将其他的模型轉化自己的内部圖,然後優化和編譯。自己也開發了對應的運作是的各種管理來負責裝置,核心,存儲,批量等深度管理。一個重要的原因是對于我們的DSA晶片來說,這樣可以最大限度地發揮硬體的能力。
HanGuangAI軟體棧的頂層架構圖如下:
整個軟體棧從上往下,分别是應用層,架構層,功能層。
-
應用層
所有深度深度學習推理的應用,例如視覺,語音,推薦等上面提到的各種應用場景。這些應用可以基于莫一種支援的深度學習架構,也可以直接掉用HanGuangAI和運作時提供的API。
-
架構層
目前我們支援TensorFlow, MXNet, Caffe,也包括獨立的模型格式ONNX。我們提供了一系列的算子庫和工具,整合到原始的架構中,使使用者能夠友善地使用HanGuang API。
-
功能層
HanGuangAI是軟體棧核心,根據功能和使用場景,主要分為兩部分:
-
- 編譯棧:轉換架構IR為HanGuang IR,然後離線量化、圖優化和編譯
- 推理運作時:轉換完的NPU模型可以直接調用運作時接口在NPU上進行推理運算。
編譯棧
編譯棧大緻可以分為以下四大部分:
- 轉化:将架構模型,轉換成HanGuangAI内部的圖IR,量化,編譯後再轉回原始的架構模型IR
- 量化:根據含光800的特性,将float模型量化為INT8/INT16的網絡模型
- 優化:圖優化,算子融合,多模型優化連結等
- 編譯:轉換成底層IR,更多的硬體ISA優化,最後根據ISA生成二進制網絡
HanGuangAI編譯棧的一些特點:
- 混合精度的量化:做到精度和性能的平衡。
- 預先優化編譯(AOT),可以做到多級優化,在模型,圖,指令各個層次針對NPU做優化。
- 多device的聯合編譯連結,做到資源的配置設定優化,充分地利用本地存儲以獲得更高的吞吐。
這裡簡單地說三點,裡面有太多的細節後面可以單獨地由量化,編譯等相關技術專家給大家進行介紹。
運作棧
運作棧也大緻可以分為以下四個層次:
- 執行引擎:基于架構和HanGuangAI運作時API組織管理裝置(device/core)和引擎等
- 執行管理器:執行的資源配置設定,批量排程,優化
- 使用者态驅動:存儲的管理,生成硬體command,command buffer排程
- 核心态驅動:核心,任務排程,硬體控制
運作棧的一些特點:
- 多裝置,多核心的優化排程
- 推理執行的排程,既保證小batch的低延遲,也保證大batch的高吞吐。
- 高效的存儲管理,使資料的輸入,運算,輸出工作在流處理模式。
這一塊也是在持續地優化改進完善中,後續根據大家的興趣點多做一些介紹。
工具鍊
我們打造了一些的工具鍊,包括
- 基于架構的模型量化,編譯前端工具Agraph,目前支援Tensorflow, MxNet
- 可以架構和HanguangAI的測試工具棧Kaleido
- 基于Agraph的性能評估工具benchmark tool
- API logger/player
- npusmi,含光800的硬體configure/query/test工具
更多的工具正在開發和計劃中。
性能解讀
Q:含光800如何獲得這麼好的性能
我們正在準備更多的性能資料,做正式的披露。鑒于時機不成熟,此處暫不對性能做更詳細的解讀。下面是官方的介紹:
“含光800性能的突破得益于軟硬體的協同創新。晶片架構方面,含光800采用創新的架構,針對深度學習中使用的大量權重參數和張量資料,在支援稀疏壓縮與量化處理的基礎上,通過獨特設計的資料訪存與流水線處理技術,大大減低了I/O需求和資料的搬移。NPU同時深度優化了卷積、矩陣乘、向量計算和各種激活函數,通過高有效的硬體資源排程和全并行的資料流處理,把AI運算的性能和能效雙雙推向極緻。
算法方面,阿裡巴巴達摩院機器智能實驗室過去兩年建構了完整的算法體系,涵蓋語音智能、語言技術、機器視覺、決策智能等方向,并且取得多個世界領先水準的成果,這些都為平頭哥研發晶片提供了幫助。
協同算法和晶片架構的設計理念效果可以說是立竿見影的。例如,功耗是人工智能晶片行業通病,但平頭哥的自研架構可大幅減少對記憶體的通路,在保證極緻性能的情況下,把晶片功耗降到最低水準。”
需要稍微解釋一下的是,官方PPT上的IPS是在保證含光800在充分地吞吐下的結果。但如果使用AI架構運作時,由于含光NPU太快了,瓶頸變成了架構或者資料往NPU的上傳/下載下傳,實際的結果看起來就會查一下。
Q:為什麼沒有含光的TOPS資料
TOPS是Tera Operations Per Second的縮寫,1TOPS代表處理器每秒鐘可進行一萬億次(10^12)操作。
AI晶片經常使用TOPS來表達處理器運算能力,但這個運算能力是理想的100%的計算單元使用率下的能力。實際的系統中,性能還有很重要的其他的因素,比如上面說的存儲系統,軟體系統等。是以不同的晶片系統,實際性能和理論TOPS差距可能各不相同,這是我們為什麼你沒有特别的提到TOPS的一個重要原因。
Q:是否隻是針對Resnet優化了
含光800雖然是領域專用AI晶片,但并不是隻局限在圖像視訊方面的應用,更不會隻是針對Resnet做優化。我們的晶片能覆寫阿裡的大部分AI應用場景。後期我們會通過論文或其他正式的形式提供更多的應用深度網絡的性能資料給大家。
後記
從摩爾定律到算法即晶片的時代慢慢開啟!
含光架構基于阿裡的AI算法研究和應用,采用了Domain Specific Architecture的理念,嘗試和實踐了先進的軟硬協同的方法。為我們以後的晶片打下了堅實的基礎。
本文的介紹比較簡單,因為涉及到一些正式流程的問題,細節沒有深入的介紹。但通過整體的介紹,讀者也應該對含光800的軟硬體有了大緻的了解。後續繼續對硬體架構,HanGuangAI API,如何發揮含光的高性能等做深度介紹。