從上圖的Wide and Deep模型結(jié)構(gòu)可以看出,稀疏訓(xùn)練主要由Embedding階段, 特征交叉(feature interation)階段和多層感知器(MLP)階段組成,其中Embedding階段在PS范式的訓(xùn)練下占據(jù)了至少50%以上的訓(xùn)練時(shí)間。
經(jīng)過分析發(fā)現(xiàn),Embedding階段的算子主要以訪存密集型(memory access
intensive)和通信密集型的算子(communication intensive)為主,主要需要的硬件資源是內(nèi)存和網(wǎng)絡(luò)的帶寬,而后兩個(gè)階段的算子則是計(jì)算密集型的算子占主導(dǎo), 需要的資源是算力。這意味著在PS的范式訓(xùn)練下,任何一個(gè)階段都有可能存在某一種硬件資源成為瓶頸而其他硬件資源被浪費(fèi)的現(xiàn)象。以GPU的算力資源為例,我們觀察GPU使用率(SM Util)在不同的訓(xùn)練階段之間呈現(xiàn)脈沖式變化(pulse)。
算子細(xì)碎化(fragmentation)
生產(chǎn)實(shí)際中的模型往往擁有上百路的Embedding特征查詢,每一路的特征查詢?cè)赥ensorflow內(nèi)都會(huì)調(diào)用數(shù)十個(gè)算子操作(operations)。TensorFlow的引擎在調(diào)度上千級(jí)別的大量的算子操作需要額外的CPU線程開銷; 對(duì)于GPU設(shè)備來(lái)說(shuō), 過多的CUDA kernel提交到流處理器上(Tensorflow下每個(gè)GPU設(shè)備只有一個(gè)stream抽象)造成了GPU Stream Multiprocessor (SM)的調(diào)度開銷,同時(shí)每個(gè)算子處理數(shù)據(jù)的并發(fā)度又不高,從而很難打滿GPU的計(jì)算單元。類似的問題在CV,NLP等稠密模型的訓(xùn)練中也有涉及,一般采用基于編譯技術(shù)的優(yōu)化手段進(jìn)行算子合并。在Wide and Deep模型這樣的稀疏場(chǎng)景下,Embedding階段的這些算子又往往具有dynamic shape的特點(diǎn),在Tensorflow靜態(tài)構(gòu)圖階段無(wú)法獲取準(zhǔn)確的算子尺寸進(jìn)行優(yōu)化,導(dǎo)致類似Tensorflow-XLA等技術(shù)在此類場(chǎng)景下沒有明顯的收益。
這些問題說(shuō)明,想要發(fā)揮出GPU等高性能硬件資源的極致性價(jià)比,提高單位成本下的訓(xùn)練吞吐,就必須設(shè)計(jì)新的訓(xùn)練框架。據(jù)我們了解,擁有大型搜索,廣告,推薦業(yè)務(wù)的國(guó)內(nèi)外企業(yè)以及硬件廠商都在著手進(jìn)行新框架的研發(fā),比如NVIDIA的Merlin-HugeCTR[1]等,然而集團(tuán)內(nèi)云上集群普遍部署的是通用計(jì)算節(jié)點(diǎn),且集群上需要執(zhí)行多種異構(gòu)的任務(wù),換用專用硬件是很昂貴且不切實(shí)際的?;谶@種實(shí)際需求,我們推出了HybridBackend,同時(shí)能夠適應(yīng)集團(tuán)內(nèi)多元化且不斷演進(jìn)的稀疏模型技術(shù)。下文中我們將簡(jiǎn)要介紹HybridBackend背后的系統(tǒng)架構(gòu)設(shè)計(jì)和技術(shù)亮點(diǎn)。
應(yīng)對(duì)破局:HybridBackend的系統(tǒng)架構(gòu)
傳統(tǒng)的參數(shù)服務(wù)器(PS)訓(xùn)練范式,體現(xiàn)的是通過擴(kuò)展硬件數(shù)量來(lái)適應(yīng)模型訓(xùn)練規(guī)模的思路,而我們的系統(tǒng)則是同時(shí)考慮到了硬件和軟件(模型)兩個(gè)層面的特點(diǎn)而做到協(xié)同設(shè)計(jì)。高性能GPU集群的硬件特性決定了基本的訓(xùn)練范式,而稀疏模型本身的結(jié)構(gòu)特點(diǎn)和數(shù)據(jù)分布帶來(lái)的問題則通過更精細(xì)的系統(tǒng)優(yōu)化手段來(lái)解決。
利用大Batch Size進(jìn)行同步訓(xùn)練
因?yàn)镚PU設(shè)備相對(duì)于CPU帶來(lái)的巨大的算力提升,以往需要上百臺(tái)CPU節(jié)點(diǎn)的集群可以用幾十臺(tái)機(jī)器的GPU集群來(lái)代替。要保持相同的總訓(xùn)練規(guī)模,同時(shí)提升單個(gè)GPU節(jié)點(diǎn)上的資源利用率,提升單個(gè)GPU worker上的batch size成為必然的選項(xiàng),同時(shí)因?yàn)榧阂?guī)模的縮小,可以通過同步訓(xùn)練的方式來(lái)有效避免過期梯度(staleness)從而提升模型訓(xùn)練的精度。相對(duì)于CPU設(shè)備之間通過PCIe以及TCP進(jìn)行網(wǎng)絡(luò)通信,高性能的GPU集群在單個(gè)節(jié)點(diǎn)內(nèi)的多個(gè)GPU設(shè)備之間往往配備了高速的網(wǎng)絡(luò)互連(NVLink, NVSwitch), 這些高速連接的帶寬通常是TCP網(wǎng)絡(luò)帶寬的數(shù)百倍(第一代NVLINK標(biāo)定達(dá)到300GB/s), 而在多個(gè)機(jī)器節(jié)點(diǎn)之間也可以配備基于RDMA技術(shù)的高速網(wǎng)絡(luò)設(shè)備,達(dá)到100-200Gbps的帶寬。選擇同步訓(xùn)練的第二個(gè)好處是可以利用高性能的集合通信算子庫(kù)(NVIDIA NCCL, 阿里自研的ACCL等)來(lái)有效地利用硬件機(jī)器的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)來(lái)提升通信的性能,這些通信庫(kù)已經(jīng)在CV, NLP之類的基于數(shù)據(jù)并行的同步訓(xùn)練任務(wù)上取得了很好的效果。
使用資源異構(gòu)而角色同構(gòu)的訓(xùn)練單元
PS訓(xùn)練范式在系統(tǒng)的邏輯層面會(huì)指定不同的訓(xùn)練角色, 比如server, worker, evaluator。比如server節(jié)點(diǎn)一般分配具有大內(nèi)存的CPU機(jī)器,而worker節(jié)點(diǎn)則會(huì)被分配到高主頻的計(jì)算型CPU硬件上。這樣形成了訓(xùn)練單元-任務(wù)角色-同構(gòu)資源的耦合,通過增加訓(xùn)練單元數(shù)量來(lái)水平擴(kuò)展(scale out)訓(xùn)練的規(guī)模。而在高性能的GPU集群上,一個(gè)物理的機(jī)器節(jié)點(diǎn)往往包括多種異構(gòu)的硬件資源,如CPU, GPU處理器,GPU之間的高速互連,DRAM內(nèi)存,Non-volatile Memory等。這樣除了水平擴(kuò)展節(jié)點(diǎn)數(shù)量外,還可以通過垂直擴(kuò)展利用多種異構(gòu)硬件資源來(lái)達(dá)到擴(kuò)大訓(xùn)練規(guī)模的目標(biāo)。針對(duì)這種硬件架構(gòu),我們的系統(tǒng)設(shè)計(jì)中只保留統(tǒng)一的一種訓(xùn)練單元(Executor), 每個(gè)Executor通過內(nèi)部的異構(gòu)硬件資源來(lái)執(zhí)行不同的訓(xùn)練任務(wù)角色。一方面,Executor內(nèi)部任務(wù)執(zhí)行時(shí)可以有效地利用底層硬件資源之間的locality來(lái)加速訓(xùn)練,另一方面,Executor內(nèi)部的硬件資源可以同時(shí)滿足不同的分布式訓(xùn)練范式所需要的硬件資源,而方便我們?cè)谀P徒Y(jié)構(gòu)的不同部分進(jìn)行混合的并行訓(xùn)練策略。
深入優(yōu)化:HybridBackend的技術(shù)亮點(diǎn)
在上述的系統(tǒng)架構(gòu)設(shè)計(jì)之下,因?yàn)橄∈枘P徒Y(jié)構(gòu)和訓(xùn)練數(shù)據(jù)本身的特性,階段性的資源需求變化和算子細(xì)碎化的問題還是會(huì)影響GPU等硬件設(shè)備的使用率。舉例來(lái)說(shuō),同步訓(xùn)練范式下所有Executor在通過集合通信進(jìn)行embedding的shuffle時(shí),網(wǎng)絡(luò)帶寬資源成為瓶頸,而GPU的計(jì)算資源被閑置。一種解決思路是對(duì)硬件資源進(jìn)行定制化,比如增加網(wǎng)絡(luò)帶寬資源來(lái)消除通信瓶頸,但是這樣的做法會(huì)使得硬件的資源配置和特定的模型結(jié)構(gòu)耦合,是專用推薦系統(tǒng)的老思路。我們的目標(biāo)還是希望系統(tǒng)可以架構(gòu)在云服務(wù)上可得的,數(shù)量容易水平擴(kuò)展的通用硬件配置之上(commodity hardware)。某些硬件廠商也嘗試通過Huge kernel的形式(將Embedding層所有的計(jì)算手工融合到一個(gè)kernel內(nèi))來(lái)解決
算子細(xì)碎化的問題, 這樣的做法也很難支持模型結(jié)構(gòu)快速迭代的需求,
背離了通用編程架構(gòu)的設(shè)計(jì)初衷。
據(jù)此,我們從軟硬協(xié)同的思路出發(fā),設(shè)計(jì)了如下的幾個(gè)系統(tǒng)優(yōu)化手段:
基于數(shù)據(jù)和算子感知的合并
根據(jù)稀疏模型的結(jié)構(gòu)特點(diǎn),大部分細(xì)碎的算子來(lái)源于龐大的Embedding特征查詢(lookup)數(shù)量,我們?cè)O(shè)計(jì)了D-Packing這一優(yōu)化技術(shù)。對(duì)于每一路查詢,盡管輸入的訓(xùn)練數(shù)據(jù)不同,但使用的算子組合是相同的。對(duì)于這種具有數(shù)據(jù)并行特點(diǎn)的模式,具有相同屬性(維度、初始化器、標(biāo)定特征組等)的Embedding表將被合并為一張新的Embedding表,而后后續(xù)的訪存查詢算子也可以被合并為一個(gè)新的大算子。合并算子可以用多線程的方式有序查詢Embedding,相對(duì)于亂序查詢或分成若干小表查詢,能有顯著的性能提升。查詢完畢后,再依原有代碼需要進(jìn)行反去重和歸位,真正做到了對(duì)用戶透明。此外通過分析特征查詢階段各個(gè)算子在分布式環(huán)境下的語(yǔ)義,我們將部分的kernel進(jìn)行融合K-Packing, 比如通過融合shuffle和stitch算子來(lái)消除冗余的數(shù)據(jù)拷貝。通過數(shù)據(jù)和算子兩個(gè)維度的基于語(yǔ)義的融合,我們既減少了總體的算子數(shù)量,降低fragmentation, 同時(shí)又避免了所有算子融合在一起而丟失了下文敘述的通過算子間穿插遮掩來(lái)提升硬件利用率的優(yōu)化機(jī)會(huì)。
基于硬件資源瓶頸感知的交錯(cuò)執(zhí)行
為了消除同時(shí)執(zhí)行相同硬件資源需求的算子而造成的瓶頸, 我們?cè)O(shè)計(jì)了兩種算子穿插遮掩執(zhí)行(interleaving)的優(yōu)化手段。1) D-Interleaving是通過對(duì)訓(xùn)練數(shù)據(jù)batch的切分利用pipeline的機(jī)制來(lái)調(diào)度穿插不同資源類型的算子,這樣可以在訓(xùn)練的任何階段緩解某一種資源的瓶頸。比如在大batch size的訓(xùn)練場(chǎng)景下,稀疏模型的MLP階段也會(huì)產(chǎn)生很高的feature map顯存占用,通過D-Interleaving就可以有效降低單個(gè)GPU設(shè)備上的峰值顯存占用,從而使得更大的batch size訓(xùn)練成為可能。2)K-Interleaving是在Embedding Layer內(nèi)部不同的特征查詢路數(shù)之間做算子的穿插和遮掩,比如將通信密集的Shuffle操作和內(nèi)存訪問密集的Gather進(jìn)行遮掩,可以有效提升這兩種資源的使用率。
基于數(shù)據(jù)頻次感知的參數(shù)緩存
在解決Executor內(nèi)部多個(gè)級(jí)別的存儲(chǔ)(GPU顯存,DRAM等)之間的帶寬和延遲問題上,我們針對(duì)稀疏模型訓(xùn)練數(shù)據(jù)的分布特點(diǎn),提出了一種感知數(shù)據(jù)訪問頻次分布的caching機(jī)制。通過統(tǒng)計(jì)訓(xùn)練數(shù)據(jù)的ID,將最熱的訪問數(shù)據(jù)緩存到GPU的顯存中,而冷數(shù)據(jù)以及哈希表結(jié)構(gòu)則存放在主內(nèi)存中,主內(nèi)存中的數(shù)據(jù)將根據(jù)ID的訪問頻率變化,定期將topk的高頻ID對(duì)應(yīng)的embeddings刷新到GPU顯存上的緩存中。這樣的混合存儲(chǔ)可以同時(shí)結(jié)合GPU顯存的高帶寬和DRAM的容量,后續(xù)這套混合存儲(chǔ)的設(shè)計(jì)還可以擴(kuò)展到包含Intel Persistent Memory, Non-volatile Memory等更多的硬件設(shè)備上。
業(yè)務(wù)落地
HybridBackend已經(jīng)成功在阿里媽媽智能引擎訓(xùn)練引擎團(tuán)隊(duì)定向廣告業(yè)務(wù)中有了落地,本文的實(shí)驗(yàn)中也介紹了在阿里媽媽CAN模型下HybridBackend相對(duì)于上一代的XDL訓(xùn)練框架獲得的性能優(yōu)勢(shì),在下表中可以看到在訓(xùn)練時(shí)長(zhǎng)等多個(gè)指標(biāo)下獲得的顯著提升。
同時(shí)我們還以阿里媽媽定向廣告一年累計(jì)的訓(xùn)練數(shù)據(jù)上對(duì)模型的規(guī)模增長(zhǎng)下的HybridBackend性能表現(xiàn)做了測(cè)試,結(jié)果如下表所示??梢钥吹皆谑褂?28張GPU進(jìn)行千億規(guī)模參數(shù)模型的訓(xùn)練時(shí),同樣是消費(fèi)1年的數(shù)據(jù)量,高性能集群上的HybridBackend僅僅需要2天的時(shí)間完成訓(xùn)練任務(wù),而普通集群上的XDL-PS模式則需要約1個(gè)月的時(shí)間。
本文作者:石浪、滿神