微軟在數(shù)據(jù)中心里大規(guī)模部署和應(yīng)用FPGA的最初實(shí)踐,來自于他的“Catapult項(xiàng)目”。這個項(xiàng)目的主要成就,是搭建了一個基于FPGA的數(shù)據(jù)中心硬件加速平臺,包括各種必要的軟硬件基礎(chǔ)設(shè)施。通過三個階段的發(fā)展,Catapult已經(jīng)成功的幫助微軟在其遍布全球的云數(shù)據(jù)中心里部署了成千上萬的FPGA加速資源。
從2015年末開始,微軟就在其購買的幾乎每臺新服務(wù)器上部署Catapult FPGA板卡。這些服務(wù)器被用于微軟的必應(yīng)搜索、Azure云服務(wù)以及其他應(yīng)用。這也使得微軟成為了世界上最大的FPGA客戶之一。
Catapult FPGA加速卡及服務(wù)器
更重要的是,Catapult項(xiàng)目通過深入的學(xué)術(shù)研究和工程實(shí)踐,為微軟積累了豐富的FPGA開發(fā)、部署、運(yùn)維的相關(guān)經(jīng)驗(yàn)和人才。在人工智能快速發(fā)展的今天,使用Catapult平臺進(jìn)行AI應(yīng)用的FPGA加速,就成了合理自然的下一步。這便是微軟“腦波項(xiàng)目(Project Brainwave)”的源起。
FPGA如何解決實(shí)時AI的兩大痛點(diǎn)
與現(xiàn)有的其他FPGA云平臺相比,Catapult平臺的最主要特點(diǎn)就是構(gòu)建了一個遍布全球的FPGA資源池,并能對資源池中的FPGA硬件資源進(jìn)行靈活的分配和使用。相比其他方案,這種對FPGA的池化有著巨大的優(yōu)勢。
首先,F(xiàn)PGA池化打破了CPU和FPGA的界限。在傳統(tǒng)的FPGA使用模型中,F(xiàn)PGA往往作為硬件加速單元,用于卸載和加速原本在CPU上實(shí)現(xiàn)的軟件功能,因此與CPU緊耦合,嚴(yán)重依賴于CPU的管理,同時與CPU涇渭分明。
在Catapult平臺里,F(xiàn)PGA一躍成為“一等公民”,不再完全受限于CPU的管理。如下圖右所示,在Catapult加速卡中,F(xiàn)PGA直接與數(shù)據(jù)中心網(wǎng)絡(luò)的TOR交換機(jī)相連,而不需要通過CPU和網(wǎng)卡的轉(zhuǎn)發(fā),這使得同一數(shù)據(jù)中心、甚至不同數(shù)據(jù)中心里的FPGA可以直接通過高速網(wǎng)絡(luò)互連和通信,從而構(gòu)成FPGA資源池。管理軟件可以直接對FPGA資源進(jìn)行劃分,而無需通過與資源池中每個FPGA互連的CPU完成,從而實(shí)現(xiàn)了FPGA與CPU的有效解耦。
與CPU平行的FPGA資源池
第二,F(xiàn)PGA池化打破了單一FPGA的資源界限。從邏輯層面上看,Catapult的數(shù)據(jù)中心池化FPGA架構(gòu)相當(dāng)于在傳統(tǒng)的基于CPU的計(jì)算層之上,增加了一層平行的FPGA計(jì)算資源,并可以獨(dú)立的實(shí)現(xiàn)多種服務(wù)與應(yīng)用的計(jì)算加速,如上圖左所示。在微軟當(dāng)前的數(shù)據(jù)中心里,池化FPGA的數(shù)量級以十萬記,而這些FPGA的通信延時只有大約十微秒左右。
對于人工智能應(yīng)用,特別是基于深度學(xué)習(xí)的應(yīng)用來說,很多應(yīng)用場景對實(shí)時性有著嚴(yán)格的要求,例如搜索、語音識別等等。同時對于微軟來說,它有著很多富文本的AI應(yīng)用場景,例如網(wǎng)絡(luò)搜索、語音到文本的轉(zhuǎn)換、翻譯與問答等。與傳統(tǒng)CNN相比,這些富文本應(yīng)用和模型對內(nèi)存帶寬有著更加嚴(yán)苛的需求。
如果結(jié)合“低延時”和“高帶寬”這兩點(diǎn)需求,傳統(tǒng)的深度學(xué)習(xí)模型和硬件的通常解決方法是對神經(jīng)網(wǎng)絡(luò)進(jìn)行剪枝和壓縮,從而減少模型的大小,直到滿足NPU芯片有限的硬件資源為止。然而,這種方法最主要的問題就是會對模型的精度和質(zhì)量造成不可避免的損失,而且這些損失往往是不可修復(fù)的。
與之相比,Catapult平臺里的FPGA資源可以看成是“無限”的,因此可以將一個大的DNN模型分解成若干小部分,每個小部分可以完整映射到單個FPGA上實(shí)現(xiàn),然后各部分再通過高速數(shù)據(jù)中心網(wǎng)絡(luò)互連。這樣不僅保證了低延時與高帶寬的性能要求,也保持了模型的完整性,不會造成精度和質(zhì)量損失。
腦波項(xiàng)目:系統(tǒng)架構(gòu)
腦波項(xiàng)目的主要目標(biāo),是利用Catapult的大規(guī)模FPGA基礎(chǔ)設(shè)施,為沒有硬件設(shè)計(jì)經(jīng)驗(yàn)的用戶提供深度神經(jīng)網(wǎng)絡(luò)的自動部署和硬件加速,同時滿足系統(tǒng)和模型的實(shí)時性和低成本的要求。
為了實(shí)現(xiàn)這個目標(biāo),腦波項(xiàng)目提出了一個完整的軟硬件解決方案,主要包含以下三點(diǎn):
對已訓(xùn)練的DNN模型根據(jù)資源和需求進(jìn)行自動區(qū)域劃分的工具鏈;
對劃分好的子模型進(jìn)行FPGA和CPU映射的系統(tǒng)架構(gòu);
在FPGA上實(shí)現(xiàn)并優(yōu)化的NPU軟核和指令集。
下圖展示了使用腦波項(xiàng)目進(jìn)行DNN加速的完整流程。對于一個訓(xùn)練好的DNN模型,工具會首先將其表示為計(jì)算流圖的形式,稱為這個模型的“中間表示”(Intermediate Representation - IR)。
腦波項(xiàng)目DNN加速的完整流程
其中,圖的節(jié)點(diǎn)表示張量運(yùn)算,如矩陣乘法等,而連接節(jié)點(diǎn)的邊表示不同運(yùn)算之間的數(shù)據(jù)流,如下圖所示。
IR表示完成后,工具會繼續(xù)將整張大圖分解成若干小圖,使得每個小圖都可以完整映射到單個FPGA上實(shí)現(xiàn)。對于模型中可能存在的不適合在FPGA上實(shí)現(xiàn)的運(yùn)算和操作,則可以映射到與FPGA相連的CPU上實(shí)現(xiàn)。這樣就實(shí)現(xiàn)了基于Catapult架構(gòu)的DNN異構(gòu)加速系統(tǒng)。
在FPGA上進(jìn)行具體的邏輯實(shí)現(xiàn)時,為了解決前文提到的“低延時”與“高帶寬”兩個關(guān)鍵性需求,腦波項(xiàng)目采用了兩種主要的技術(shù)措施。
首先,完全棄用了板級DDR內(nèi)存,全部數(shù)據(jù)存儲都通過片上高速RAM完成。相比其他方案,不管使用ASIC還是FPGA,這一點(diǎn)對于單一芯片的方案都是不可能實(shí)現(xiàn)的。
在腦波項(xiàng)目所使用的英特爾Stratix 10 FPGA上,有著11721個512x40b的SRAM模塊,相當(dāng)于30MB的片上內(nèi)存容量,以及在600MHz運(yùn)行頻率下35Tbps的等效帶寬。這30MB片上內(nèi)存對于DNN應(yīng)用是完全不夠的,但正是基于Catapult的超大規(guī)模FPGA的低延時互聯(lián),才使得在單一FPGA上十分有限的片上RAM能夠組成看似“無限”的資源池,并極大的突破了困擾DNN加速應(yīng)用已久的內(nèi)存帶寬限制。
第二,腦波項(xiàng)目采用了自定義的窄精度數(shù)據(jù)位寬。這個其實(shí)也是DNN加速領(lǐng)域的常見方法。項(xiàng)目提出了8~9位的浮點(diǎn)數(shù)表達(dá)方式,稱為ms-fp8和ms-fp9。與相同精度的定點(diǎn)數(shù)表達(dá)方式相比,這種表達(dá)需要的邏輯資源數(shù)量大致相同,但能夠表達(dá)更廣的動態(tài)范圍和更高的精度。
與傳統(tǒng)的32位浮點(diǎn)數(shù)相比,使用8~9位浮點(diǎn)表示的精度損失很小,如下圖所示。值得注意的是,通過對模型的重新訓(xùn)練,就可以補(bǔ)償這種方法帶來的精度損失。
腦波項(xiàng)目的核心單元,是一款在FPGA上實(shí)現(xiàn)的軟核NPU,及其對應(yīng)的NPU指令集。這個軟核NPU實(shí)質(zhì)上是在高性能與高靈活性之間的一種折中。從宏觀上看,DNN的硬件實(shí)現(xiàn)可以使用諸如CPU、GPU、FPGA或者ASIC等多種方式實(shí)現(xiàn)。在前文中講過,CPU有著最高的靈活性,但性能不盡如人意;ASIC方案與之相反。而FPGA能夠在性能和靈活性之間達(dá)到良好的平衡。
從微觀上看,F(xiàn)PGA方案本身對于DNN的實(shí)現(xiàn),既可以使用編寫底層RTL的方式,對特定的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行針對性的優(yōu)化;也可以采用高層次綜合(HLS)的方法,通過高層語言對網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行快速描述。
但是,前者需要豐富的FPGA硬件設(shè)計(jì)與開發(fā)經(jīng)驗(yàn),并伴隨著很長的開發(fā)周期;而后者由于開發(fā)工具等限制,最終得到的硬件系統(tǒng)在性能上往往很難滿足設(shè)計(jì)要求。
因此,微軟采用了軟核NPU與特定指令集的方式。這種方法一方面兼顧了性能,使硬件工程師可以對NPU的架構(gòu)和實(shí)現(xiàn)方式進(jìn)行進(jìn)一步優(yōu)化,另一方面兼顧了靈活性,使軟件工程師可以通過指令集對DNN算法進(jìn)行快速描述。
腦波NPU的架構(gòu)圖如下所示,NPU的核心是一個進(jìn)行矩陣向量乘的算術(shù)單元MVU。它針對FPGA的底層硬件結(jié)構(gòu)進(jìn)行了深度優(yōu)化,并采用了上文提到的“片上內(nèi)存”和“低精度”的方法進(jìn)一步提高系統(tǒng)性能。
NPU的最主要特點(diǎn)之一是采用了“超級SIMD”的指令集架構(gòu),這與GPU的SIMD指令集類似,但是NPU的一條指令可以生成超過一百萬個運(yùn)算,等效于在英特爾Stratix 10 FPGA上實(shí)現(xiàn)每個時鐘周期13萬次運(yùn)算。
腦波項(xiàng)目:性能提升
腦波NPU在不同F(xiàn)PGA上的峰值性能如下圖所示,當(dāng)使用ms-fp8精度時,腦波NPU在Stratix 10 FPGA上可以得到90 TFLOPS的峰值性能,這一數(shù)據(jù)也可以和現(xiàn)有的高端NPU芯片方案相媲美。
腦波項(xiàng)目還對微軟的必應(yīng)搜索中的Turing Prototype(TP1)和DeepScan兩個DNN模型進(jìn)行了加速試驗(yàn)。由于必應(yīng)搜索的嚴(yán)格實(shí)時性要求,如果使用CPU實(shí)現(xiàn)這兩種DNN模型,勢必要對參數(shù)和運(yùn)輸量進(jìn)行大規(guī)模削減,從而嚴(yán)重影響結(jié)果精度。相比之下,腦波方案可以實(shí)現(xiàn)超過十倍的模型規(guī)模,同時得到超過十倍的延時縮減。
在Stratix 10 FPGA的測試版產(chǎn)品上,當(dāng)運(yùn)行在300MHz的頻率時可以得到的等效算力和峰值算力分別為39.5 TFLOPS和48 TFLOPS。預(yù)計(jì)在量產(chǎn)版的Stratix 10上,穩(wěn)定運(yùn)行頻率將達(dá)到550MHz,從而再帶來83%的性能提升,以期達(dá)到將近90 TFLOPS。同時,Stratix 10 FPGA的滿載功耗約為125W,這意味著腦波項(xiàng)目可以達(dá)到720 GOPs/watt的峰值吞吐量。
結(jié)語
腦波項(xiàng)目充分利用了微軟遍布全球數(shù)據(jù)中心的FPGA基礎(chǔ)架構(gòu),使用FPGA解決了AI應(yīng)用中“低延時”和“高帶寬”兩大痛點(diǎn),并成功構(gòu)建了基于軟核NPU和自定義指令集的實(shí)時AI系統(tǒng)。
腦波項(xiàng)目的成功實(shí)踐,再一次為業(yè)界使用FPGA作為AI加速器提供了嶄新的思路和借鑒。老石相信,在人工智能時代,F(xiàn)PGA必將在更多應(yīng)用領(lǐng)域得到更加廣泛的使用。
評論