2017年我曾經(jīng)基于Graphcore的CTO Simon Knowles的演講兩次分析了它們的AI芯片。最近,我們看到更多關(guān)于IPU的信息,包括來自第三方的詳細(xì)分析和Graphcore的幾個(gè)新的演講。基于這些信息,我們可以進(jìn)一步勾勒(推測)出IPU的架構(gòu)設(shè)計(jì)的一些有趣細(xì)節(jié)。
我們先來回顧一下IPU硬件架構(gòu)中的一些關(guān)鍵點(diǎn)。IPU采用的是大規(guī)模并行同構(gòu)眾核架構(gòu)。其最基本的硬件處理單元是IPU-Core,它是一個(gè)SMT多線程處理器,可以同時(shí)跑6個(gè)線程,更接近多線程CPU,而非GPU的 SIMD/SIMT架構(gòu)。
IPU-Tiles由IPU-Core和本地的存儲(chǔ)器(256KB SRAM)組成,共有1216個(gè)。因此,一顆IPU芯片大約有300MB的片上存儲(chǔ)器,且無外部DRAM接口。連接IPU-Tiles的互聯(lián)機(jī)制稱作IPU-Exchange,可以實(shí)現(xiàn)無阻塞的all-to-all通信,共有大約8TB的帶寬。最后,IPU-Links實(shí)現(xiàn)多芯片互聯(lián),PCIe實(shí)現(xiàn)和Host CPU的連接。
▲source: Graphcore [3]
在我們做進(jìn)一步討論之前,大家不妨先思考一下這個(gè)架構(gòu)的優(yōu)勢,劣勢和實(shí)現(xiàn)的挑戰(zhàn)。
對于一個(gè)同構(gòu)眾核架構(gòu)來說,一般不追求單個(gè)核的性能。因此,單個(gè)核的設(shè)計(jì)是比較簡單的,而芯片是通過把大量小核“復(fù)制”連接構(gòu)成的。
這種架構(gòu)的整體性能(特別是throughput)主要體現(xiàn)在大量處理器核同時(shí)工作形成的大規(guī)模并行處理能力。而主要的挑戰(zhàn)在于:
1. 算法和數(shù)據(jù)本身是否有足夠的并行性(Amdahl's law)
2. 要充分發(fā)揮眾核的效率,處理器核如何協(xié)同工作(通信,同步和數(shù)據(jù)一致性等問題)。
第一個(gè)問題的答案是肯定的。
目前的AI芯片主要是用于加速神經(jīng)網(wǎng)絡(luò)計(jì)算的,其模型和數(shù)據(jù)都有很多并行性可以挖掘,這也是幾乎各類AI芯片需求成立的基礎(chǔ)。
以前,類似的眾核結(jié)構(gòu)不是很成功,其主要原因也是沒有合適的應(yīng)用,有錘子沒釘子。從這個(gè)角度來看,IPU并不是發(fā)明了錘子,而是找到了合適的釘子。
即便如此,不同的模型和算子的并行性特征是有很大差異,比如CNN和RNN,稠密矩陣和稀疏矩陣,基本的Convolution和Grouped/Separable Convolutions。要用一個(gè)架構(gòu)高效支持所有應(yīng)用是不可能的,必須在設(shè)計(jì)中進(jìn)行權(quán)衡。
第一個(gè)架構(gòu)設(shè)計(jì)的問題來了,Q1:采用什么樣的基本操作粒度?
而第二個(gè)問題則涉及多核/眾核架構(gòu)的傳統(tǒng)挑戰(zhàn),Q2:多核如何協(xié)同工作?
此外,盡量利用片上存儲(chǔ)進(jìn)行計(jì)算的優(yōu)勢是很明顯的。但是, 300MB的片上存儲(chǔ)對控制機(jī)制和芯片實(shí)現(xiàn)都是巨大的挑戰(zhàn)。下表是IPU和CPU,GPU的片上存儲(chǔ)的一些對比,大家可以感受一下。
▲Source:Citadel Tech Report[1]
而這種設(shè)計(jì)還有一個(gè)很明顯的問題就是,Q3:沒有外部DRAM,如果模型放不下怎么辦?特別是在模型越來越大的背景情況下,這個(gè)問題可能是大家關(guān)注最多的地方。
下面就從上述三個(gè)問題出發(fā)來討論一下IPU的設(shè)計(jì)。當(dāng)然,如我多次所說,架構(gòu)設(shè)計(jì)就是trade off,IPU的設(shè)計(jì)只能說是權(quán)衡的結(jié)果,而不一定是最佳方案(其實(shí)也不一定存在最佳方案)。因此,對于我們來說,思考和討論才是本文想達(dá)到的主要目的。
01
Q2:多核如何協(xié)同工作?
我想先討論第二個(gè)問題,因?yàn)镮PU對這個(gè)問題的回答,實(shí)際上決定了IPU的編程模型,同時(shí)也對架構(gòu)設(shè)計(jì)和芯片實(shí)現(xiàn)有重大的影響。
IPU采用了一個(gè)稱為BULK SYNCHRONOUS PARALLEL (BSP)的運(yùn)行模式。這種模式把一次處理分成三步:
1. 本地計(jì)算(Computation):每個(gè)IPU-core進(jìn)程都執(zhí)行僅在本地內(nèi)存上運(yùn)行的計(jì)算。在此階段,進(jìn)程之間沒有通信。前提是本地?cái)?shù)據(jù)要準(zhǔn)備好。
2. 同步(BSP Sync),在所有進(jìn)程都達(dá)到同步點(diǎn)之前,任何進(jìn)程都不會(huì)繼續(xù)進(jìn)行到下一個(gè)步驟。除了同步點(diǎn)本身以外,此階段都不會(huì)進(jìn)行計(jì)算或通信。
3. 通信(Exchange):進(jìn)程交換數(shù)據(jù), 每個(gè)進(jìn)程可以向每個(gè)期望的目的存儲(chǔ)器發(fā)送消息(單向)。在此階段不進(jìn)行任何計(jì)算。這里要指出的是,數(shù)據(jù)交換不是僅限于單個(gè)IPU,而是可以通過IPU-Link把數(shù)據(jù)發(fā)送給同一板卡或不同板卡上的其它IPU。
▲Source:Graphcore[4]
上圖給出了BSP模式的優(yōu)勢,在我看來,這個(gè)模式最大的優(yōu)勢就是簡單。
首先,使用這個(gè)模式,眾核設(shè)計(jì)中一系列頭疼的問題要么大大簡化,要么就基本不存在了。第一,通信是單向,只需要從源位置寫到目的位置即可,且通信的同時(shí)是不進(jìn)行運(yùn)算的,芯片的所有能源都可以用作通信,有利于保證通信的性能。如果不是這種簡化,很難想象IPU是如何實(shí)現(xiàn)8TB帶寬all-to-all通信的。同步機(jī)制也很輕松,只需要支持發(fā)送簡單消息即可,也沒有時(shí)序上的風(fēng)險(xiǎn)了。數(shù)據(jù)一致性的問題不存在了。
第二,這個(gè)機(jī)制中,處理器核只操作本地存儲(chǔ)器,這樣可以大大簡化處理器核的訪存設(shè)計(jì)。
第三,片上存儲(chǔ)在同一時(shí)間只有一個(gè)master在訪問,控制邏輯也可以大大簡化。這個(gè)應(yīng)該也是IPU能夠?qū)崿F(xiàn)這么多的片上存儲(chǔ)的原因之一。[1]中的實(shí)驗(yàn)配置里,IPU可以工作在1.6GHz??紤]到IPU使用的是16nm工藝,如果不是大幅簡化了片上存儲(chǔ)和通信機(jī)制,整體達(dá)到這個(gè)時(shí)鐘頻率是相當(dāng)困難的。
那么,缺點(diǎn)呢?也很明顯。
第一,計(jì)算和通信必須是串行的。我們經(jīng)常看到的AI系統(tǒng)優(yōu)化里提到計(jì)算時(shí)間掩蓋通信時(shí)間的策略,目的是支持計(jì)算和數(shù)據(jù)搬移并行執(zhí)行,縮短整體消耗的時(shí)間。Graphcore對串行機(jī)制的解釋是,在Dennard scaling難以為繼的背景下,芯片工作的限制在于功耗,大芯片在實(shí)際工作時(shí)是不可能所有晶體管同時(shí)工作的(Dark Silicon問題)。
因此,他們把計(jì)算和通信串行來做,兩者都可以在功耗限制下發(fā)揮最高性能,整體時(shí)間來看并不比并行要差(詳見我之前的文章)。遺憾的是,要嚴(yán)格的比較串行和并行模式的實(shí)際性能是非常困難的,所以這里我們也只能留下個(gè)疑問。
第二,所有的處理器核(包括多芯片情況)都必須按照統(tǒng)一的同步點(diǎn)來工作,如果任務(wù)不平衡,就一定會(huì)出現(xiàn)處理器核空閑等待的情況。[2]中就給出了一個(gè)實(shí)際的例子,使用同一個(gè)板卡上的2個(gè)IPU實(shí)現(xiàn)BERT inference的情況。可以看出,開始由于無法平衡的分配任務(wù),IPU0的利用率就比較低。
▲Source:Microsoft[2]
總得來說,BSP模式?jīng)Q定了IPU的硬件設(shè)計(jì)和編程方法,簡化了硬件設(shè)計(jì)難度的同時(shí),給軟件工具帶來了更多的挑戰(zhàn)。這里插一張facebook的slides,大家可以參考一下。
回到主題,[1]中對IPU的片上和片間互聯(lián)做了大量討論和benchmark,具體數(shù)據(jù)也挺有意思,可以推測到一些實(shí)現(xiàn)細(xì)節(jié),大家感興趣的話不妨看看。不過,在理解的IPU的基本設(shè)計(jì)思路之后,各種測試結(jié)果也就很容易理解了。
02
Q1:“采用什么樣的處理粒度?”
上述討論中,我們可以看到,在設(shè)計(jì)多核協(xié)同工作模式的時(shí)候,IPU選擇了一個(gè)粗粒度的模式。而在處理器核的設(shè)計(jì)中,IPU則選擇了細(xì)粒度和更高的靈活性。
從目前的資料來看,IPU-core是一個(gè)相對比較通用的處理器,支持6個(gè)線程,包括了一個(gè)Accumulating Matrix Product (AMP)單元,每周期可以實(shí)現(xiàn)64個(gè)混合精度或者16個(gè)單精度浮點(diǎn)數(shù)的操作。
但是,IPU-core訪問本地SRAM的端口并不寬,讀寫端口最大都是128 bit(據(jù)說有兩讀一寫三個(gè)端口)。因此,IPU-core的處理粒度的比較細(xì)的,不是Nvidia GPU的TensorCore這個(gè)粒度的,更不是NVDLA的處理粒度。
這也意味著在處理稠密矩陣運(yùn)算的時(shí)候,IPU-core并不能最大限度的利用模型和數(shù)據(jù)的并行特征。[1]中所作的GEMM Benchmark也證實(shí)了這一點(diǎn)。單片IPU的混合精度處理能力是124.5T,和V100的TensorCore處理能力125T,是類似的。但實(shí)際IPU的GEMM運(yùn)算效率只能達(dá)到50%左右,比TensorCore低不少。
▲Source:Citadel Tech Report[1]
同樣的原因,IPU執(zhí)行傳統(tǒng)Convolution操作的效率也不算很高(參考[1]中的Benchmark)。
當(dāng)然,這種設(shè)計(jì)的好處是處理器核有更好的通用性和靈活性。如果考慮稀疏模型,圖網(wǎng)絡(luò),和一些特殊的Convolution運(yùn)算,比如Grouped或者Separate Convolution的時(shí)候,這種細(xì)粒度的處理架構(gòu)就會(huì)表現(xiàn)出相對優(yōu)勢。這也可以從[1]中的ResNeXt網(wǎng)絡(luò)的Benchmark結(jié)果反應(yīng)出來。
從最近Graphcore給出的Benchmark和宣傳來看,他們在努力擴(kuò)展IPU的應(yīng)用場景,或者說尋找IPU架構(gòu)能夠發(fā)揮更大效率的應(yīng)用和算法,比如金融領(lǐng)域。他們還提了個(gè)IPU thinking的概念,即在做算法的時(shí)候考慮充分利用IPU架構(gòu)的特點(diǎn)。讓大家從GPU thinking轉(zhuǎn)換到IPU thinking可能是個(gè)很艱巨的任務(wù)。但與其和Nvidia正面競爭,試圖取代GPU,可能還不如多培育更適合自己的應(yīng)用(新的釘子),找到能夠和CPU,GPU共存的空間。
03
Q3:“沒有外部存儲(chǔ),如果模型放不下怎么辦?”
從設(shè)計(jì)之初,IPU就是想兼顧data center的training和inference的。而和其它的data center芯片(特別是training芯片)相比,IPU最大的一個(gè)差別就是沒有外部DRAM。在最近的NeurIPS 2019的一個(gè)講演中,Graphcore的Tom Wilsonk分享了利用IPU做BERT training和inference的示例,正好可以幫助我們分析這個(gè)問題。
總的來說,Graphcore的解決方式包括了幾個(gè)方面。
第一,是多芯片互聯(lián)。這個(gè)說起來很簡單,一個(gè)芯片放不下就多來幾個(gè),但實(shí)現(xiàn)中對片間互聯(lián)機(jī)制的要求很高。前面介紹了IPU可以通過IPU-Link進(jìn)行多芯片擴(kuò)展,從[1]中可以看出,多個(gè)IPU芯片可以構(gòu)成一個(gè)大的虛擬IPU(如下圖所示,最大8張卡16顆芯片)。虛擬IPU的編程模型和單個(gè)IPU是類似的,差別僅在于,數(shù)據(jù)交換階段,數(shù)據(jù)要發(fā)送到最遠(yuǎn)的IPU需要更長的延時(shí)。更詳細(xì)的延時(shí)數(shù)據(jù),大家可以在[1]中查到。
▲Source:CitadelTech Report[1]
第二是模型并行,即把模型分布到多個(gè)核甚至多個(gè)芯片來執(zhí)行inference或training。下面兩個(gè)圖分別是BERT模型的inference和training的配置。其中一路inference可以用兩顆IPU芯片實(shí)現(xiàn)(和[2]分析的類似),training則使用7張卡,14顆IPU芯片采用pipeline的模式實(shí)現(xiàn)。
▲Source:Graphcore[3]
具體的training模型并行pipeline模式如下圖。這里還有一個(gè)trick,就是通過re-compute前向activation來減少存儲(chǔ)的需求。
▲Source:Graphcore[3]
從上述例子我們可以看出Graphcore解決存儲(chǔ)容量問題的一些思路。Benchmark我就不貼了,大家可以看[3]。
更近一步,一個(gè)有趣的問題是,Graphcore是否會(huì)在下一代產(chǎn)品中加上外部存儲(chǔ)的接口呢?如果要加的話,基于BSP的編程模型是否需要修改?片上通信是否也需要做比較大的改動(dòng)以匹配外部存儲(chǔ)的數(shù)據(jù)帶寬呢?片上的處理器核數(shù)量或者SRAM數(shù)量是否要減少呢?等等。
感覺這個(gè)改動(dòng)有可能會(huì)對IPU架構(gòu)設(shè)計(jì)的基礎(chǔ)產(chǎn)生很大影響,也許并不是單純加個(gè)DDR/HBM接口這么簡單?;蛘?,可以不改變基本的架構(gòu)設(shè)計(jì)理念,而是通過chiplet的模式直接在封裝里擴(kuò)展更多的IPU... ...
讓我們拭目以待吧。