2016 年 9 月,《連線》(Wired)雜志發(fā)表了一篇《微軟把未來押注在 FPGA 上》的報(bào)道 [3],講述了 Catapult 項(xiàng)目的前世今生。緊接著,Catapult 項(xiàng)目的老大 Doug Burger 在 Ignite 2016 大會(huì)上與微軟 CEO Satya Nadella 一起做了 FPGA 加速機(jī)器翻譯的演示。
Ignite 2016 上的演示:每秒 1 Exa-op (10^18) 的機(jī)器翻譯運(yùn)算能力
這里就給大家八一八這個(gè)每秒 1 Exa-op 的數(shù)字是怎么算出來的。每塊生產(chǎn)環(huán)境中部署的 Stratix V FPGA 有 1.8 T ops 的計(jì)算能力,每臺(tái)服務(wù)器上插一塊 FPGA。實(shí)際使用時(shí),每 8 臺(tái)服務(wù)器為一組,一臺(tái)服務(wù)器作為 FPGA 的控制節(jié)點(diǎn)??刂乒?jié)點(diǎn)的 CPU 也可以做機(jī)器翻譯的計(jì)算,但是每個(gè) CPU 核只能做 0.1 T ops,相比 FPGA 是聊勝于無。非控制節(jié)點(diǎn)上的 FPGA 通過網(wǎng)絡(luò)從其他 FPGA 收發(fā)數(shù)據(jù),不需要本地 CPU 處理數(shù)據(jù)平面。
截至演示時(shí),微軟 Azure 云有 46 萬臺(tái)服務(wù)器部署了 FPGA,必應(yīng)有 1.5 萬臺(tái),Exchange 服務(wù)有 9.5 萬臺(tái),共計(jì) 57 萬臺(tái)。乘起來得到總的計(jì)算能力是 103 萬 T ops,也就是 1.03 Exa-op,相當(dāng)于 10 萬塊頂級(jí) GPU 計(jì)算卡。一塊 FPGA(加上板上內(nèi)存和網(wǎng)絡(luò)接口等)的功耗大約是 30 W,僅增加了整個(gè)服務(wù)器功耗的十分之一。
A 并不是一帆風(fēng)順的。對(duì)于把 FPGA 部署在哪里這個(gè)問題,大致經(jīng)歷了三個(gè)階段:
專用的 FPGA 集群,里面插滿了 FPGA
每臺(tái)機(jī)器一塊 FPGA,采用專用網(wǎng)絡(luò)連接
每臺(tái)機(jī)器一塊 FPGA,放在網(wǎng)卡和交換機(jī)之間,共享服務(wù)器網(wǎng)絡(luò)
微軟 FPGA 部署方式的三個(gè)階段,來源:[3]
第一個(gè)階段是專用集群,里面插滿了 FPGA 加速卡,就像是一個(gè) FPGA 組成的超級(jí)計(jì)算機(jī)。下圖是最早的 BFB 實(shí)驗(yàn)板,一塊 PCIe 卡上放了 6 塊 FPGA,每臺(tái) 1U 服務(wù)器上又插了 4 塊 PCIe 卡。
最早的 BFB 實(shí)驗(yàn)板,上面放了 6 塊 FPGA。來源:[1]
只要規(guī)模足夠大,對(duì) FPGA 價(jià)格過高的擔(dān)心將是不必要的。
最早的 BFB 實(shí)驗(yàn)板,1U 服務(wù)器上插了 4 塊 FPGA 卡。來源:[1]
像超級(jí)計(jì)算機(jī)一樣的部署方式,意味著有專門的一個(gè)機(jī)柜全是上圖這種裝了 24 塊 FPGA 的服務(wù)器(下圖左)。這種方式有幾個(gè)問題:
不同機(jī)器的 FPGA 之間無法通信,F(xiàn)PGA 所能處理問題的規(guī)模受限于單臺(tái)服務(wù)器上 FPGA 的數(shù)量;
數(shù)據(jù)中心里的其他機(jī)器要把任務(wù)集中發(fā)到這個(gè)機(jī)柜,構(gòu)成了 in-cast,網(wǎng)絡(luò)延遲很難做到穩(wěn)定。
FPGA 專用機(jī)柜構(gòu)成了單點(diǎn)故障,只要它一壞,誰都別想加速了;
裝 FPGA 的服務(wù)器是定制的,冷卻、運(yùn)維都增加了麻煩。
部署 FPGA 的三種方式,從中心化到分布式。來源:[1]
一種不那么激進(jìn)的方式是,在每個(gè)機(jī)柜一面部署一臺(tái)裝滿 FPGA 的服務(wù)器(上圖中)。這避免了上述問題 (2)(3),但 (1)(4) 仍然沒有解決。
第二個(gè)階段,為了保證數(shù)據(jù)中心中服務(wù)器的同構(gòu)性(這也是不用 ASIC 的一個(gè)重要原因),在每臺(tái)服務(wù)器上插一塊 FPGA(上圖右),F(xiàn)PGA 之間通過專用網(wǎng)絡(luò)連接。這也是微軟在 ISCA'14 上所發(fā)表論文采用的部署方式。
Open Compute Server 在機(jī)架中。來源:[1]
Open Compute Server 內(nèi)景。紅框是放 FPGA 的位置。來源:[1]
插入 FPGA 后的 Open Compute Server。來源:[1]
FPGA 與 Open Compute Server 之間的連接與固定。來源:[1]
FPGA采用Stratix V D5,有172K個(gè)ALM,2014個(gè)M20K片上內(nèi)存,1590個(gè) DSP。板上有一個(gè)8GB DDR3-1333內(nèi)存,一個(gè)PCIe Gen3 x8接口,兩個(gè)10 Gbps網(wǎng)絡(luò)接口。一個(gè)機(jī)柜之間的FPGA采用專用網(wǎng)絡(luò)連接,一組10G網(wǎng)口8個(gè)一組連成環(huán),另一組10G網(wǎng)口6個(gè)一組連成環(huán),不使用交換機(jī)。
機(jī)柜中 FPGA 之間的網(wǎng)絡(luò)連接方式。來源:[1]
這樣一個(gè) 1632 臺(tái)服務(wù)器、1632 塊 FPGA 的集群,把必應(yīng)的搜索結(jié)果排序整體性能提高到了 2 倍(換言之,節(jié)省了一半的服務(wù)器)。如下圖所示,每 8 塊 FPGA 穿成一條鏈,中間用前面提到的 10 Gbps 專用網(wǎng)線來通信。這 8 塊 FPGA 各司其職,有的負(fù)責(zé)從文檔中提取特征(黃色),有的負(fù)責(zé)計(jì)算特征表達(dá)式(綠色),有的負(fù)責(zé)計(jì)算文檔的得分(紅色)。
FPGA 加速必應(yīng)的搜索排序過程。來源:[1]
除了加速搜索結(jié)果的排序(RaaS,Ranking as a Service),F(xiàn)PGA 還被用來加速從倒排索引中取出相關(guān)文檔并譯碼的過程(SaaS,Selection as a Service)。為了加快文檔數(shù)據(jù)結(jié)構(gòu)的訪問,F(xiàn)PGA 把服務(wù)器主存里常用的 4K 內(nèi)存頁面緩存在 FPGA 板上的 DDR 上。
FPGA 不僅降低了必應(yīng)搜索的延遲,還顯著提高了延遲的穩(wěn)定性。來源:[4]
本地和遠(yuǎn)程的 FPGA 均可以降低搜索延遲,遠(yuǎn)程 FPGA 的通信延遲相比搜索延遲可忽略。來源:[4]
FPGA 在必應(yīng)的部署取得了成功,Catapult 項(xiàng)目繼續(xù)在公司內(nèi)擴(kuò)張。微軟內(nèi)部擁有最多服務(wù)器的,就是云計(jì)算 Azure 部門了。Azure 部門急需解決的問題是網(wǎng)絡(luò)和存儲(chǔ)虛擬化帶來的開銷。Azure 把虛擬機(jī)賣給客戶,需要給虛擬機(jī)的網(wǎng)絡(luò)提供防火墻、負(fù)載均衡、隧道、NAT 等網(wǎng)絡(luò)功能。由于云存儲(chǔ)的物理存儲(chǔ)跟計(jì)算節(jié)點(diǎn)是分離的,需要把數(shù)據(jù)從存儲(chǔ)節(jié)點(diǎn)通過網(wǎng)絡(luò)搬運(yùn)過來,還要進(jìn)行壓縮和加密。
在 1 Gbps 網(wǎng)絡(luò)和機(jī)械硬盤的時(shí)代,網(wǎng)絡(luò)和存儲(chǔ)虛擬化的 CPU 開銷不值一提。隨著網(wǎng)絡(luò)和存儲(chǔ)速度越來越快,網(wǎng)絡(luò)上了 40 Gbps,一塊 SSD 的吞吐量也能到 1 GB/s,CPU 漸漸變得力不從心了。例如 Hyper-V 虛擬交換機(jī)只能處理 25 Gbps 左右的流量,不能達(dá)到 40 Gbps 線速,當(dāng)數(shù)據(jù)包較小時(shí)性能更差;AES-256 加密和 SHA-1 簽名,每個(gè) CPU 核只能處理 100 MB/s,只是一塊 SSD 吞吐量的十分之一。
網(wǎng)絡(luò)隧道協(xié)議、防火墻處理 40 Gbps 需要的 CPU 核數(shù)。來源:[5]
為了加速網(wǎng)絡(luò)功能和存儲(chǔ)虛擬化,微軟把 FPGA 部署在網(wǎng)卡和交換機(jī)之間。如下圖所示,每個(gè) FPGA 有一個(gè) 4 GB DDR3-1333 DRAM,通過兩個(gè) PCIe Gen3 x8 接口連接到一個(gè) CPU socket(物理上是 PCIe Gen3 x16 接口,因?yàn)?FPGA 沒有 x16 的硬核,邏輯上當(dāng)成兩個(gè) x8 的用)。物理網(wǎng)卡(NIC)就是普通的 40 Gbps 網(wǎng)卡,僅用于宿主機(jī)與網(wǎng)絡(luò)之間的通信。
Azure 服務(wù)器部署 FPGA 的架構(gòu)。來源:[6]
FPGA(SmartNIC)對(duì)每個(gè)虛擬機(jī)虛擬出一塊網(wǎng)卡,虛擬機(jī)通過 SR-IOV 直接訪問這塊虛擬網(wǎng)卡。原本在虛擬交換機(jī)里面的數(shù)據(jù)平面功能被移到了 FPGA 里面,虛擬機(jī)收發(fā)網(wǎng)絡(luò)數(shù)據(jù)包均不需要 CPU 參與,也不需要經(jīng)過物理網(wǎng)卡(NIC)。這樣不僅節(jié)約了可用于出售的 CPU 資源,還提高了虛擬機(jī)的網(wǎng)絡(luò)性能(25 Gbps),把同數(shù)據(jù)中心虛擬機(jī)之間的網(wǎng)絡(luò)延遲降低了 10 倍。
網(wǎng)絡(luò)虛擬化的加速架構(gòu)。來源:[6]
這就是微軟部署 FPGA 的第三代架構(gòu),也是目前「每臺(tái)服務(wù)器一塊 FPGA」大規(guī)模部署所采用的架構(gòu)。FPGA 復(fù)用主機(jī)網(wǎng)絡(luò)的初心是加速網(wǎng)絡(luò)和存儲(chǔ),更深遠(yuǎn)的影響則是把 FPGA 之間的網(wǎng)絡(luò)連接擴(kuò)展到了整個(gè)數(shù)據(jù)中心的規(guī)模,做成真正 cloud-scale 的「超級(jí)計(jì)算機(jī)」。第二代架構(gòu)里面,F(xiàn)PGA 之間的網(wǎng)絡(luò)連接局限于同一個(gè)機(jī)架以內(nèi),F(xiàn)PGA 之間專網(wǎng)互聯(lián)的方式很難擴(kuò)大規(guī)模,通過 CPU 來轉(zhuǎn)發(fā)則開銷太高。
第三代架構(gòu)中,F(xiàn)PGA 之間通過 LTL (Lightweight Transport Layer) 通信。同一機(jī)架內(nèi)延遲在 3 微秒以內(nèi);8 微秒以內(nèi)可達(dá) 1000 塊 FPGA;20 微秒可達(dá)同一數(shù)據(jù)中心的所有 FPGA。第二代架構(gòu)盡管 8 臺(tái)機(jī)器以內(nèi)的延遲更低,但只能通過網(wǎng)絡(luò)訪問 48 塊 FPGA。為了支持大范圍的 FPGA 間通信,第三代架構(gòu)中的 LTL 還支持 PFC 流控協(xié)議和 DCQCN 擁塞控制協(xié)議。
縱軸:LTL 的延遲,橫軸:可達(dá)的 FPGA 數(shù)量。來源:[4]
FPGA 內(nèi)的邏輯模塊關(guān)系,其中每個(gè) Role 是用戶邏輯(如 DNN 加速、網(wǎng)絡(luò)功能加速、加密),外面的部分負(fù)責(zé)各個(gè) Role 之間的通信及 Role 與外設(shè)之間的通信。來源:[4]
FPGA 構(gòu)成的數(shù)據(jù)中心加速平面,介于網(wǎng)絡(luò)交換層(TOR、L1、L2)和傳統(tǒng)服務(wù)器軟件(CPU 上運(yùn)行的軟件)之間。來源:[4]
通過高帶寬、低延遲的網(wǎng)絡(luò)互聯(lián)的 FPGA 構(gòu)成了介于網(wǎng)絡(luò)交換層和傳統(tǒng)服務(wù)器軟件之間的數(shù)據(jù)中心加速平面。除了每臺(tái)提供云服務(wù)的服務(wù)器都需要的網(wǎng)絡(luò)和存儲(chǔ)虛擬化加速,F(xiàn)PGA 上的剩余資源還可以用來加速必應(yīng)搜索、深度神經(jīng)網(wǎng)絡(luò)(DNN)等計(jì)算任務(wù)。
對(duì)很多類型的應(yīng)用,隨著分布式 FPGA 加速器的規(guī)模擴(kuò)大,其性能提升是超線性的。例如 CNN inference,當(dāng)只用一塊 FPGA 的時(shí)候,由于片上內(nèi)存不足以放下整個(gè)模型,需要不斷訪問 DRAM 中的模型權(quán)重,性能瓶頸在 DRAM;如果 FPGA 的數(shù)量足夠多,每塊 FPGA 負(fù)責(zé)模型中的一層或者一層中的若干個(gè)特征,使得模型權(quán)重完全載入片上內(nèi)存,就消除了 DRAM 的性能瓶頸,完全發(fā)揮出 FPGA 計(jì)算單元的性能。當(dāng)然,拆得過細(xì)也會(huì)導(dǎo)致通信開銷的增加。把任務(wù)拆分到分布式 FPGA 集群的關(guān)鍵在于平衡計(jì)算和通信。
從神經(jīng)網(wǎng)絡(luò)模型到 HaaS 上的 FPGA。利用模型內(nèi)的并行性,模型的不同層、不同特征映射到不同 FPGA。來源:[4]
在 MICRO'16 會(huì)議上,微軟提出了 Hardware as a Service (HaaS)的概念,即把硬件作為一種可調(diào)度的云服務(wù),使得 FPGA 服務(wù)的集中調(diào)度、管理和大規(guī)模部署成為可能。
Hardware as a Service (HaaS)。來源:[4]
從第一代裝滿 FPGA 的專用服務(wù)器集群,到第二代通過專網(wǎng)連接的 FPGA 加速卡集群,到目前復(fù)用數(shù)據(jù)中心網(wǎng)絡(luò)的大規(guī)模 FPGA 云,三個(gè)思想指導(dǎo)我們的路線:
硬件和軟件不是相互取代的關(guān)系,而是合作的關(guān)系;
必須具備靈活性,即用軟件定義的能力;
必須具備可擴(kuò)放性(scalability)。