謝旻暉 陸游游 馮楊洋 舒繼武
(清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系 北京 100084)
我們正身處一個(gè)信息過(guò)載的時(shí)代,全球內(nèi)容生產(chǎn)呈指數(shù)型增長(zhǎng):新浪微博每天產(chǎn)生1.17 億條微博[1],快手每天有千萬(wàn)條新發(fā)布的短視頻[2].在如此龐大的規(guī)模下,用戶很難從中找到自己可能感興趣的內(nèi)容.推薦系統(tǒng)負(fù)責(zé)從中篩選出可能感興趣的內(nèi)容個(gè)性化地推薦給每個(gè)用戶,被認(rèn)為是解決信息過(guò)載的有效手段.近年來(lái),隨著深度學(xué)習(xí)的快速發(fā)展,新型深度學(xué)習(xí)模型[3-6]已廣泛應(yīng)用至現(xiàn)代推薦系統(tǒng)之中,顯著提升了個(gè)性化推薦的準(zhǔn)確率.根據(jù)Meta 公司的統(tǒng)計(jì)[3],推薦模型預(yù)估(inference)耗時(shí)在其數(shù)據(jù)中心的人工智能服務(wù)總耗時(shí)的占比高達(dá)80%.因此,推薦模型預(yù)估系統(tǒng)設(shè)計(jì)已成為數(shù)據(jù)中心人工智能系統(tǒng)設(shè)計(jì)中的一個(gè)關(guān)鍵問(wèn)題.
與計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理中的計(jì)算密集型深度學(xué)習(xí)模型不同,推薦模型包含一個(gè)巨大且訪存密集的嵌入層(embedding layer).該嵌入層用于映射對(duì)應(yīng)輸入的特征ID 至低維嵌入?yún)?shù)(embedding vector),由于推薦模型接受的輸入包含海量高維稀疏的特征ID(例如用戶ID、近期觀看過(guò)的視頻ID),而深度神經(jīng)網(wǎng)絡(luò)無(wú)法直接從高維稀疏特征中學(xué)習(xí).所有低維嵌入?yún)?shù)拼接后,一同輸入深度神經(jīng)網(wǎng)絡(luò)擬合樣本標(biāo)簽.由于特征交叉技術(shù)[5]的廣泛使用與每個(gè)特征本身的海量ID 空間,嵌入層中包含的參數(shù)可多達(dá)千億級(jí),占模型總體參數(shù)的99.99%以上[7].受限于GPU 的內(nèi)存大小,嵌入?yún)?shù)通常存儲(chǔ)在內(nèi)存(dynamic RAM,DRAM)與固態(tài)硬盤(solid state disk,SSD)等較為廉價(jià)的硬件資源上[8-10].
現(xiàn)有推薦模型預(yù)估系統(tǒng)[11]依賴于CPU 對(duì)存儲(chǔ)資源上的嵌入?yún)?shù)進(jìn)行訪問(wèn)(后文稱為基于CPU 訪問(wèn)存儲(chǔ)架構(gòu)).具體地,由CPU 接收經(jīng)GPU 去重后的特征ID,訪問(wèn)相應(yīng)DRAM 或SSD 獲得嵌入?yún)?shù)后,再將所需嵌入?yún)?shù)額外聚集(gather)到一塊連續(xù)的內(nèi)存空間,通過(guò)直接存儲(chǔ)器訪問(wèn)(direct memory access,DMA)引擎?zhèn)鬏斨罣PU.GPU 收到嵌入?yún)?shù)后,完成后續(xù)的神經(jīng)網(wǎng)絡(luò)計(jì)算任務(wù).
然而,我們發(fā)現(xiàn)該架構(gòu)存在2 個(gè)問(wèn)題:一方面,GPU 所需的任何數(shù)據(jù)均需交由CPU 訪問(wèn)再傳回GPU,CPU 和GPU 的頻繁交互帶來(lái)的通信開(kāi)銷增加了參數(shù)訪問(wèn)的時(shí)延;另一方面,聚集操作引入的額外內(nèi)存拷貝消耗了CPU 資源與內(nèi)存帶寬,為訪存密集的嵌入層帶來(lái)了嚴(yán)重的性能損失.
針對(duì)上述問(wèn)題,本文提出一種基于GPU 直訪存儲(chǔ)架構(gòu)的推薦模型預(yù)估系統(tǒng)GDRec.GDRec 的核心思想是在嵌入?yún)?shù)的訪問(wèn)路徑上移除CPU 參與,由GPU 通過(guò)零拷貝的方式直接訪問(wèn)DRAM,SSD 等存儲(chǔ)資源,以減少主機(jī)端CPU 與DRAM 的開(kāi)銷.具體地,GDRec 包含2 個(gè)直訪存儲(chǔ)機(jī)制:內(nèi)存直訪機(jī)制(用于訪問(wèn)位于DRAM 上的參數(shù))與外存直訪機(jī)制(用于訪問(wèn)位于SSD 上的參數(shù)).
內(nèi)存直訪機(jī)制利用設(shè)備商提供的統(tǒng)一虛擬地址(unified virtual address,UVA)特性[12],將嵌入?yún)?shù)所在的DRAM 內(nèi)存區(qū)域映射至GPU 內(nèi)存虛擬地址空間.由此,GPU 核心函數(shù)(kernel)可以繞過(guò)主機(jī)端CPU,直接通過(guò)load/store 指令以字節(jié)粒度直接訪問(wèn)DRAM.由于跨PCIe 總線訪問(wèn)主機(jī)DRAM 內(nèi)存有一定開(kāi)銷,GDRec 進(jìn)一步地提出訪問(wèn)合并與訪問(wèn)對(duì)齊2 個(gè)優(yōu)化,通過(guò)調(diào)度GPU 線程讀取嵌入?yún)?shù)的方式,盡可能減少GPU 發(fā)出的PCIe 事務(wù)數(shù)量.
外存直訪機(jī)制在GPU上實(shí)現(xiàn)了一個(gè)類似于存儲(chǔ)性能開(kāi)發(fā)套件(storage performance development kit, SPDK)[13]的用戶態(tài)NVMe(non-volatile memory express)驅(qū)動(dòng)程序,允許GPU 線程直接向SSD 提交讀寫請(qǐng)求,同時(shí)也允許SSD 通過(guò)DMA 引擎將讀取到的硬盤數(shù)據(jù)直接寫入GPU 內(nèi)存.整個(gè)過(guò)程無(wú)需主機(jī)端的CPU 與內(nèi)存參與.
在每次推薦模型的預(yù)估過(guò)程中,GDRec 首先利用GPU 高效地將特征ID 去重,然后根據(jù)對(duì)應(yīng)的嵌入?yún)?shù)所在的位置將請(qǐng)求分流至內(nèi)存直訪機(jī)制與外存直訪機(jī)制.待所有嵌入?yún)?shù)的讀取請(qǐng)求完成后,類似于傳統(tǒng)的預(yù)估系統(tǒng),GDRec 進(jìn)行后續(xù)的神經(jīng)網(wǎng)絡(luò)計(jì)算.
我們?cè)? 個(gè)公開(kāi)的點(diǎn)擊率預(yù)估數(shù)據(jù)集上進(jìn)行了測(cè)試,實(shí)驗(yàn)表明:與NVIDIA 公司深度優(yōu)化的推薦模型預(yù)估系統(tǒng)HugeCTR[11](HugeCTR-Inference)相比,GDRec 可以提升超過(guò)1 個(gè)數(shù)量級(jí)的吞吐量;相比于使用SPDK 高度優(yōu)化后的HugeCTR,GDRec 仍有多達(dá)1.9 倍的吞吐量提升.
綜上所述,本文的主要貢獻(xiàn)有3 個(gè)方面:
1) 分析了現(xiàn)有推薦模型預(yù)估系統(tǒng)(基于CPU 訪問(wèn)存儲(chǔ)架構(gòu))的性能問(wèn)題;
2) 提出了一種基于GPU 直訪存儲(chǔ)架構(gòu)的推薦模型預(yù)估系統(tǒng)GDRec,其包含內(nèi)存直訪與外存直訪2 個(gè)機(jī)制,分別使能GPU 直訪DRAM 與SSD 上的參數(shù);
3) 使用實(shí)驗(yàn)說(shuō)明GDRec 設(shè)計(jì)的有效性,特別地,在3 個(gè)公開(kāi)的點(diǎn)擊率預(yù)估數(shù)據(jù)集上,GDRec 在性能上優(yōu)于高度優(yōu)化后的基于CPU 訪問(wèn)存儲(chǔ)的同類系統(tǒng),吞吐提升多達(dá)1.9 倍.
本節(jié)主要介紹深度學(xué)習(xí)推薦模型的基本結(jié)構(gòu)與現(xiàn)有預(yù)估系統(tǒng)的主要處理流程,同時(shí)分析現(xiàn)有系統(tǒng)使用CPU 訪問(wèn)存儲(chǔ)架構(gòu)導(dǎo)致的性能問(wèn)題.
自微軟公司的Deep Cross[6]與谷歌公司的Wide&Deep 模型[5]發(fā)布以來(lái),推薦模型已全面步入深度學(xué)習(xí)時(shí)代.與傳統(tǒng)機(jī)器學(xué)習(xí)模型相比,深度學(xué)習(xí)推薦模型的表達(dá)能力更強(qiáng),可以挖掘出用戶(user)與物品(item)之間更深層次的聯(lián)系,從而更好地推測(cè)出用戶的喜好.
深度學(xué)習(xí)推薦模型的輸入特征主要包含2 種類型:稠密特征和稀疏特征.稠密特征亦稱數(shù)值型特征、連續(xù)特征,指具有數(shù)值意義的特征,如用戶的年齡、商品被訪問(wèn)的次數(shù)等;稀疏特征亦稱類別型特征、ID 型特征,指如用戶ID、視頻ID 列表等以獨(dú)熱(onehot)或多熱(multi-hot)形式存在的高維特征.稀疏特征一般被編碼為ID 的列表,如某用戶近期觀看過(guò)的視頻為[視頻ID1, 視頻ID4, 視頻ID5].
圖1 展示了典型的深度學(xué)習(xí)推薦模型結(jié)構(gòu),它由2 個(gè)部分組成:嵌入層(embedding)與多層感知機(jī)(multi-layer perceptrons,MLP).由于深度神經(jīng)網(wǎng)絡(luò)無(wú)法直接從高維稀疏特征中學(xué)習(xí)[14],嵌入層用于將稀疏特征映射至稠密的嵌入?yún)?shù).具體地,嵌入層由多個(gè)嵌入表(embedding table)組成,如用戶、視頻嵌入表.每個(gè)表用于映射對(duì)應(yīng)的輸入特征ID 至低維嵌入?yún)?shù),嵌入?yún)?shù)的維度稱為嵌入維度(embedding dimension),映射的過(guò)程類似于哈希表查詢.在嵌入層映射完稀疏特征后,所有嵌入?yún)?shù)會(huì)與樣本中的稠密特征拼接,得到包含樣本所有特征的特征向量.模型將特征向量輸入MLP,MLP 對(duì)特征向量各個(gè)維度進(jìn)行復(fù)雜的交叉組合,最后擬合樣本的標(biāo)簽(例如某用戶是否可能觀看某視頻).典型的工業(yè)級(jí)推薦模型神經(jīng)網(wǎng)絡(luò)包括:Wide&Deep[5],DeepFM[15],DCN[16],DIN[17],DIEN[18].各模型在具體模型結(jié)構(gòu)上有所不同,但模型主體結(jié)構(gòu)都符合embedding 和MLP 兩個(gè)部分的結(jié)構(gòu).
圖1 深度學(xué)習(xí)推薦模型結(jié)構(gòu)Fig.1 Structure of deep learning recommendation model
從圖1 還可以看到,深度學(xué)習(xí)推薦模型的參數(shù)可分為2 類:稀疏參數(shù)(由嵌入層組成,用于處理稀疏特征)與稠密參數(shù)(由MLP 層組成,用于處理稠密特征與稀疏特征經(jīng)嵌入表映射后的中間結(jié)果).這2 類參數(shù)在計(jì)算模式與存儲(chǔ)特征上有著本質(zhì)的區(qū)別.對(duì)于計(jì)算模式,只有樣本包含的特征ID 涉及到的一部分稀疏參數(shù)會(huì)參與計(jì)算,而全部的稠密參數(shù)都會(huì)參與計(jì)算;對(duì)于存儲(chǔ)特征,稠密參數(shù)通常只有百兆級(jí),而稀疏參數(shù)可多達(dá)千億級(jí),這一方面是由于每個(gè)稀疏特征ID 空間巨大,另一方面也由于廣泛使用的特征交叉技術(shù)[5]可以將多個(gè)特征做笛卡兒積(Cartesian product),從而形成ID 空間更大的新特征.
許多公司報(bào)告(如阿里巴巴[19]、Meta[3]),在它們生產(chǎn)環(huán)境的模型中,嵌入層通常占據(jù)模型端到端預(yù)估的時(shí)延60%以上.其原因在于嵌入層引入了大量對(duì)存儲(chǔ)資源的隨機(jī)訪問(wèn).因此,針對(duì)嵌入層的系統(tǒng)設(shè)計(jì)與優(yōu)化是提升推薦模型預(yù)估系統(tǒng)性能的關(guān)鍵所在.
文獻(xiàn)[2,7,20]表明,更大的參數(shù)量往往能帶來(lái)更好的推薦質(zhì)量,在過(guò)去幾年中,推薦模型參數(shù)量級(jí)已從百億級(jí)迅速膨脹至千億級(jí),海量參數(shù)使得純內(nèi)存存儲(chǔ)方案成本過(guò)高.另一方面,隨著Optane 等高速存儲(chǔ)介質(zhì)的發(fā)展,現(xiàn)代高性能SSD 的平均延遲不斷降低.例如,Intel 公司在2018 年推出的905P SSD 的4 KB隨機(jī)讀延遲僅為10 μs.為了提高存儲(chǔ)性價(jià)比,學(xué)術(shù)界與工業(yè)界的許多工作[7-8,10,21-23]都已遷移至內(nèi)存外存混合存儲(chǔ)方案.針對(duì)1.1 節(jié)所述的推薦模型結(jié)構(gòu)與稠密、稀疏參數(shù)在計(jì)算、存儲(chǔ)上的特點(diǎn),現(xiàn)有推薦系統(tǒng)比較通用的做法是將稠密參數(shù)緩存在GPU 的內(nèi)存中,而將稀疏參數(shù)存儲(chǔ)在DRAM,SSD 等相對(duì)廉價(jià)存儲(chǔ)介質(zhì)中.
如圖2 所示,現(xiàn)有系統(tǒng)采用基于CPU 訪問(wèn)存儲(chǔ)架構(gòu).一次典型的預(yù)估處理流程為:
圖2 典型預(yù)估流程Fig.2 Typical inference process
①去重.一次預(yù)估輸入往往包含一批樣本,其中樣本包含大量重復(fù)的特征ID[11].CPU 會(huì)首先將所有特征ID 傳輸給GPU,由GPU 將特征ID 去重.得益于GPU 的高并行性,GPU 去重可以獲得比CPU 去重更好的性能.
②查詢.GPU 將去重后的特征ID 傳輸回CPU,CPU 根據(jù)去重后的特征ID,查取DRAM 以及SSD 上的嵌入表,得到特征ID 對(duì)應(yīng)的嵌入?yún)?shù).
③聚集.CPU 將上一步查詢得到的嵌入?yún)?shù)聚集至DRAM 內(nèi)存上一塊連續(xù)的區(qū)域,再傳輸給GPU.
④神經(jīng)網(wǎng)絡(luò)計(jì)算.GPU 將嵌入?yún)?shù)與樣本中的稠密特征拼接,輸入MLP 計(jì)算,得到最后的預(yù)估結(jié)果.
然而,我們發(fā)現(xiàn)該架構(gòu)存在2 個(gè)問(wèn)題:
1) CPU 與GPU 之間的通信開(kāi)銷大.如圖2 所示,GPU 需要將訪問(wèn)相關(guān)的元數(shù)據(jù)(即去重后的ID)傳輸至CPU,CPU 訪問(wèn)存儲(chǔ)資源得到數(shù)據(jù)后,再傳輸回GPU.2 次通信交互均涉及到GPU 上DMA 引擎的啟動(dòng)、同步,以及包含數(shù)次用戶態(tài)-內(nèi)核態(tài)切換,這些開(kāi)銷增加了嵌入層參數(shù)訪問(wèn)的時(shí)延.
2) 聚集操作引入的額外拷貝,消耗了CPU 資源與內(nèi)存帶寬,同時(shí)增加了嵌入層的時(shí)延.為了便于GPU 上的DMA 引擎拷貝,CPU 需將訪問(wèn)得到的嵌入?yún)?shù)額外聚集至一塊連續(xù)的內(nèi)存空間,再由DMA 引擎?zhèn)鬏斀oGPU.這一步額外的拷貝帶來(lái)了3 方面弊端.首先,浪費(fèi)寶貴的CPU 資源,除處理嵌入層外,CPU 還需服務(wù)于網(wǎng)絡(luò)棧、模型預(yù)處理等過(guò)程.CPU 訪問(wèn)存儲(chǔ)架構(gòu)浪費(fèi)了一部分CPU 資源用于訪問(wèn)存儲(chǔ)、嵌入?yún)?shù)聚集.在面對(duì)包含復(fù)雜預(yù)處理的模型或單機(jī)多GPU 卡等場(chǎng)景下,CPU 可能成為瓶頸而影響全局性能[24].其次,消耗了內(nèi)存帶寬,給訪存密集的嵌入層帶來(lái)了嚴(yán)重的性能損失.最后,CPU 單線程逐參數(shù)拷貝性能低下,這增加了端到端預(yù)估時(shí)延.
本文提出一種基于GPU 直訪存儲(chǔ)架構(gòu)的推薦模型預(yù)估系統(tǒng)GDRec.GDRec 同時(shí)使用GPU 顯存、DRAM內(nèi)存與SSD 外存 3 個(gè)層級(jí)的存儲(chǔ)資源,參數(shù)存儲(chǔ)方式與現(xiàn)有系統(tǒng)類似:GPU 顯存中存儲(chǔ)稠密參數(shù),DRAM 與SSD 分層存儲(chǔ)稀疏參數(shù).具體地,在加載模型時(shí),類似于現(xiàn)有工作[25],GDRec 根據(jù)參數(shù)訪問(wèn)熱度對(duì)稀疏參數(shù)進(jìn)行降序排序,并對(duì)參數(shù)ID 重編號(hào).GDRec 將最熱的一部分參數(shù)緩存于DRAM,剩余部分存儲(chǔ)于SSD.
圖3 描述了GDRec 的總體結(jié)構(gòu)與一次預(yù)估過(guò)程.CPU 上的特征ID 會(huì)首先傳輸至GPU 進(jìn)行去重;GPU根據(jù)去重后的特征ID,分別通過(guò)內(nèi)存直訪機(jī)制與外存直訪機(jī)制,以零拷貝的方式直接訪問(wèn)主機(jī)端DRAM和SSD 上對(duì)應(yīng)的嵌入?yún)?shù);參數(shù)聚集操作直接在GPU 上完成;最后,模型正常進(jìn)行神經(jīng)網(wǎng)絡(luò)計(jì)算.
圖3 GDRec 架構(gòu)Fig.3 Architecture of GDRec
相比于傳統(tǒng)CPU訪存的架構(gòu),GDRec這種基于GPU直訪存儲(chǔ)的架構(gòu)帶來(lái)了3 點(diǎn)優(yōu)勢(shì):1)GPU 訪存可以享受GPU 高并行性帶來(lái)的高性能,GPU 在并行訪問(wèn)DRAM、并行提交SSD 請(qǐng)求等方面可以獲得比CPU更好的性能;2)在訪存時(shí)僅涉及1 次CPU 與GPU 之間的通信,即去重前的ID 從CPU 傳入GPU,之后所有過(guò)程均由GPU 單獨(dú)完成;3)GPU 直訪機(jī)制節(jié)省了聚集過(guò)程中的額外拷貝,參數(shù)可直接被讀取到位于GPU 內(nèi)存的目的地址,無(wú)需經(jīng)由DRAM 緩存,這節(jié)省了CPU 資源、DRAM 內(nèi)存帶寬,同時(shí)降低了端到端延遲.
需要說(shuō)明的是,GDRec 的實(shí)現(xiàn)基于NVIDIA 公司推出的GPU,同時(shí)本文主要關(guān)注于CUDA(compute unified device architecture)編程模型;對(duì)其他廠商的GPU 以及編程模型(如AMD 與ROCm)的支持將是我們的未來(lái)工作.
本節(jié)將逐一介紹GDRec 的2 個(gè)關(guān)鍵技術(shù),包括內(nèi)存直訪機(jī)制與外存直訪機(jī)制.
根據(jù)1.2 節(jié)的問(wèn)題分析,GDRec 內(nèi)存直訪機(jī)制的核心思想是讓GPU 以零拷貝的方式從DRAM 中讀取數(shù)據(jù),避免已有系統(tǒng)中CPU 額外的聚集操作與DMA 引擎啟動(dòng)的開(kāi)銷.為了達(dá)到這個(gè)目標(biāo),GDRec的內(nèi)存直訪機(jī)制利用了CUDA 提供的UVA 特性[12].該特性可以將一塊DRAM 內(nèi)存地址空間映射至GPU內(nèi)存虛擬地址空間,GPU kernel 以讀寫指令(load/store)直接對(duì)DRAM 進(jìn)行訪問(wèn).整個(gè)過(guò)程無(wú)需主機(jī)端CPU的參與.
GDRec 精心挑選了內(nèi)存直訪機(jī)制的實(shí)現(xiàn)方式.CUDA 提供了下面2 種方式使一段內(nèi)存可供GPU 直訪.1)如果內(nèi)存尚未分配,可以通過(guò)cudaMallocHost函數(shù)同時(shí)實(shí)現(xiàn)內(nèi)存的分配與地址空間的映射,該函數(shù)返回的指針可同時(shí)被CPU 與GPU 兩種處理器讀寫;2)如果內(nèi)存已經(jīng)分配,使用函數(shù)cudaHostRegister首先將該段內(nèi)存區(qū)域鎖頁(yè),再使用函數(shù)cudaGet-DevicePointer 獲得該區(qū)域在GPU 虛擬地址空間的指針.GDRec 使用方式2,原因是我們發(fā)現(xiàn)其可以使用大頁(yè)(huge page)分配內(nèi)存,而方式1 不可以.大頁(yè)的使用可以減少轉(zhuǎn)換檢測(cè)緩沖區(qū)(translation lookaside buffer,TLB)缺失,從而提升嵌入層訪存時(shí)的性能.在系統(tǒng)初始化分配DRAM 上的嵌入表后,GDRec 將對(duì)應(yīng)的UVA 虛擬地址指針傳入GPU.
內(nèi)存直訪機(jī)制使得GPU 細(xì)粒度地訪問(wèn)DRAM上的稀疏參數(shù)成為可能,但細(xì)粒度的訪問(wèn)同時(shí)也可能帶來(lái)PCIe 開(kāi)銷大的問(wèn)題.一般來(lái)說(shuō),對(duì)于傳輸同樣大小的數(shù)據(jù),越多的PCIe 事務(wù)意味著傳輸所需的元數(shù)據(jù)也越多,相應(yīng)地訪存的有效吞吐量也會(huì)降低.例如,對(duì)于PCIe 4.0 標(biāo)準(zhǔn),每個(gè)事務(wù)層數(shù)據(jù)包(transaction layer packet,TLP)包含12 B 或16 B 的包頭,如果數(shù)據(jù)包僅攜帶32 B 有效數(shù)據(jù),直訪內(nèi)存機(jī)制將遭受27%~36%的PCIe 開(kāi)銷.由于PCIe 帶寬是有限的,這導(dǎo)致GPU 直訪內(nèi)存的有效帶寬受限.為了解決該問(wèn)題,GDRec 通過(guò)調(diào)整GPU 線程讀取嵌入?yún)?shù)的方式,盡可能地減少GPU 發(fā)出的PCIe 數(shù)據(jù)包數(shù)量,調(diào)整方式具體包括2 個(gè)部分:訪問(wèn)合并與訪問(wèn)對(duì)齊.對(duì)于訪問(wèn)合并,現(xiàn)代GPU 支持以最大128 B 的內(nèi)存事務(wù)訪問(wèn)主機(jī)端的內(nèi)存.GDRec 令GPU 線程束(warp,32 個(gè)線程為1 束)讀取連續(xù)的內(nèi)存區(qū)域,每個(gè)線程讀取4 B.這樣,當(dāng)該內(nèi)存區(qū)域首地址是128 B 對(duì)齊時(shí),這個(gè)線程束的內(nèi)存訪問(wèn)將被硬件合并為1 個(gè)PCIe 事務(wù).對(duì)于訪問(wèn)對(duì)齊,其處理的情況是當(dāng)訪問(wèn)的參數(shù)首地址非128 B 對(duì)齊時(shí),例如參數(shù)尺寸非128 B 的整數(shù)倍.一種簡(jiǎn)單的方法是位移參數(shù),將每個(gè)嵌入?yún)?shù)的首地址對(duì)齊至128 B 的倍數(shù),但這會(huì)引入額外的內(nèi)存空間開(kāi)銷.相對(duì)地,GDRec 沒(méi)有改變參數(shù)在內(nèi)存中的布局,而是調(diào)整了GPU 線程讀取嵌入?yún)?shù)的方式.具體而言,如圖4 所示,當(dāng)訪問(wèn)的內(nèi)存區(qū)域非128 B 對(duì)齊時(shí),GDRec 所有線程束向高地址方向讀取對(duì)齊的1 個(gè)128 B,并額外分配1 個(gè)線程束讀取頭部剩余的字節(jié).這樣,假設(shè)要訪問(wèn)的內(nèi)存區(qū)域大小為X(單位為B),我們只需發(fā)出「X/(128B)■個(gè)PCIe 事務(wù),就可達(dá)到最優(yōu)情況.
圖4 訪問(wèn)對(duì)齊Fig.4 Aligned access
現(xiàn)有推薦模型預(yù)估系統(tǒng)在訪問(wèn)外存時(shí)并不高效,它們將嵌入?yún)?shù)視為鍵值,并依賴于已有的SSD 鍵值存儲(chǔ)系統(tǒng).例如NVIDIA 公司的HugeCTR 使用RocksDB系統(tǒng)[26]讀寫SSD.這種做法不僅面臨著大量?jī)?nèi)核存儲(chǔ)I/O 棧的開(kāi)銷,其以CPU 為中心的訪存架構(gòu)同樣存在著如1.2 節(jié)中所述的CPU-GPU 通信開(kāi)銷大、額外拷貝引起的內(nèi)存帶寬消耗與CPU 資源浪費(fèi)這2 個(gè)問(wèn)題.
對(duì)此,GDRec 提供了GPU 上的NVMe 驅(qū)動(dòng)以實(shí)現(xiàn)GPU 外存直訪機(jī)制,進(jìn)而優(yōu)化推薦模型預(yù)估系統(tǒng)的外存訪問(wèn)路徑.GDRec 的外存直訪機(jī)制具有3 個(gè)特點(diǎn):1)純用戶態(tài).類似于SPDK 繞過(guò)Linux 內(nèi)核I/O 棧,允許在用戶態(tài)直接訪問(wèn)SSD.2)GPU 直訪.GDRec 使得GPU kernel 可以直接向SSD 發(fā)起讀取請(qǐng)求,讀取到的數(shù)據(jù)直接寫入GPU 內(nèi)存,控制路徑與數(shù)據(jù)路徑皆無(wú)需途經(jīng)CPU,這減少了CPU-GPU 通信開(kāi)銷、主機(jī)端CPU 和DRAM 的使用;3)GPU 并行快速提交I/O 請(qǐng)求,GDRec 充分利用GPU 并行性,允許大量線程并行提交一次預(yù)估過(guò)程中所需參數(shù)對(duì)應(yīng)的I/O 請(qǐng)求至NVMe 提交隊(duì)列(submission queue, SQ),以進(jìn)一步縮短控制路徑上的時(shí)延.
我們?cè)贕PU 內(nèi)存上分配NVMe SSD 的提交隊(duì)列、完成隊(duì)列等空間,并將這些隊(duì)列注冊(cè)給SSD,同時(shí)分配可供SSD DMA 傳輸參數(shù)的數(shù)據(jù)緩存區(qū),基于GPUDirect RDMA 機(jī)制,這些空間可以被暴露給SSD 讀寫訪問(wèn);然后將SSD 的門鈴寄存器(doorbell register),包括提交門鈴寄存器與完成門鈴寄存器,映射至GPU 內(nèi)存虛擬地址空間,此操作需要2 步:首先使用函數(shù)mmap 將SSD 的門鈴寄存器所在地址映射至用戶進(jìn)程地址空間,再使用函數(shù)cudaHostRegister 將其進(jìn)一步注冊(cè)至GPU 內(nèi)存虛擬地址空間.
GDRec 的每次預(yù)估過(guò)程涉及一批位于SSD 上的嵌入?yún)?shù)的查詢(假設(shè)有N個(gè)),直訪外存的具體流程如下.首先,GPU 接收到一批已經(jīng)去過(guò)重后的特征ID,計(jì)算出對(duì)應(yīng)的嵌入?yún)?shù)所在的邏輯塊號(hào);其次,GDRec 為每個(gè)計(jì)算單元SM 分配了單獨(dú)的SSD,請(qǐng)求提交隊(duì)列與完成隊(duì)列,并充分利用GPU 并行性將I/O 命令批量寫入提交隊(duì)列;同一批次的讀請(qǐng)求中如果有多個(gè)參數(shù)在同一個(gè)邏輯塊中,GDRec 會(huì)將對(duì)應(yīng)的I/O 命令合并以減少SSD 讀取的數(shù)據(jù)量.然后,GDRec 單獨(dú)分配1 個(gè)線程用于更新提交門鈴寄存器以通知SSD,利用門鈴批處理(doorbell batching)機(jī)制,提交讀請(qǐng)求時(shí)GPU 產(chǎn)生的跨PCIe 總線寫次數(shù)可以從N次降低至1 次;SSD 在收到提交門鈴寄存器的更新后,拉取位于GPU 內(nèi)存上的提交隊(duì)列,處理其中的NVMe 命令;SSD 在完成I/O 命令后,會(huì)向位于GPU內(nèi)存上的完成隊(duì)列寫入完成項(xiàng),并更新完成門鈴寄存器.GPU 通過(guò)輪詢完成隊(duì)列得知SSD 讀取的完成情況.
GDRec 還采用2 個(gè)優(yōu)化進(jìn)一步提升外存直訪性能:
1)由于嵌入?yún)?shù)的尺寸通常在128~512 B,GDRec通過(guò)NVMe format 命令調(diào)整SSD 的邏輯塊大小,其優(yōu)勢(shì)在于對(duì)于大小恰為邏輯塊的嵌入?yún)?shù),GDRec可以將目的地址直接填入NVMe 讀命令,并加入提交隊(duì)列,以減少1 次從I/O 緩存區(qū)到目的地址的拷貝,并實(shí)現(xiàn)零拷貝.
2)GDRec 盡可能地將所有嵌入?yún)?shù)均勻地分布在SSD 整個(gè)空間上,如圖5(b)所示.相比于簡(jiǎn)單的連續(xù)存放,如圖5(a)所示,這種方式可以更充分地綜合利用SSD 內(nèi)部不同存儲(chǔ)芯片資源.當(dāng)多個(gè)模型需要共享1 塊SSD 的存儲(chǔ)空間時(shí),GDRec 將各個(gè)模型的參數(shù)交錯(cuò)存儲(chǔ),如圖5(c)所示.
圖5 SSD 嵌入?yún)?shù)放置策略Fig.5 Embedding placement strategy in SSD
GDRec 目前的實(shí)現(xiàn)有2 方面的局限性:
1)GDRec 僅支持靜態(tài)模型的預(yù)估,無(wú)法支持增量更新[2]的動(dòng)態(tài)模型.其原因是GDRec 的直訪機(jī)制要求在GPU 內(nèi)完成每個(gè)嵌入?yún)?shù)地址的定位,動(dòng)態(tài)模型需要額外維護(hù)從特征ID 到嵌入?yún)?shù)地址的索引,而這通常會(huì)超過(guò)GPU 顯存容量.也因?yàn)橥瑯拥脑颍珿DRec 目前不支持冷熱數(shù)據(jù)在SSD 和DRAM間的遷移.
2)GDRec 僅支持部分型號(hào)的GPU.由于GDRec外存直訪機(jī)制需要GPU 支持GPUDirect RDMA 機(jī)制.因此,對(duì)于NVIDIA 公司推出的GPU,GDRec 的外存直訪機(jī)制可以在NVIDIA Tesla 與Quadro 系列的GPU上運(yùn)行,但無(wú)法在NVIDIA GeForce 系列GPU 上運(yùn)行.
本節(jié)將通過(guò)實(shí)驗(yàn)對(duì)比和分析GDRec 與現(xiàn)有系統(tǒng)的性能差異.首先,使用微觀基準(zhǔn)測(cè)試說(shuō)明GDRec的GPU 直訪架構(gòu)相比于傳統(tǒng)CPU 訪存架構(gòu)在性能上的優(yōu)越性;其次,使用真實(shí)世界的推薦模型與數(shù)據(jù)集對(duì)比測(cè)試所有系統(tǒng)的端到端吞吐量、延遲-吞吐曲線;最后,對(duì)比測(cè)試純內(nèi)存場(chǎng)景下,小型推薦模型預(yù)估時(shí)所有系統(tǒng)的性能.
1)實(shí)驗(yàn)平臺(tái).本文實(shí)驗(yàn)使用的實(shí)驗(yàn)平臺(tái)配置信息如表1 所示.本文實(shí)驗(yàn)使用的GPU 為NVIDIA Tesla A30,其包含24 GB 顯存,使用的SSD 為Intel Optane P5800X,其4 KB 隨機(jī)讀延遲為5 μs.實(shí)驗(yàn)機(jī)器擁有2 個(gè)非統(tǒng)一內(nèi)存訪問(wèn)(non uniform memory access, NUMA)架構(gòu)節(jié)點(diǎn),為避免跨NUMA 訪問(wèn)帶來(lái)的性能下降,本文實(shí)驗(yàn)只使用同一NUMA 下的CPU,GPU,DRAM,SSD.
Table 1 Configuration Information of Experiment Platform表1 實(shí)驗(yàn)平臺(tái)配置信息
2)數(shù)據(jù)集.本文實(shí)驗(yàn)共選用3 個(gè)數(shù)據(jù)集,具體信息如表2 所示.數(shù)據(jù)集來(lái)自Avazu 與Criteo 這2 家公司對(duì)真實(shí)世界點(diǎn)擊率(click-through rate, CTR)負(fù)載的采樣.在所有數(shù)據(jù)集上,我們訓(xùn)練一個(gè)深度交叉網(wǎng)絡(luò)(deep cross network,DCN)作為推薦模型負(fù)載,該模型包含6 個(gè)交叉層與形狀為(1 024, 1 024)的MLP 層.對(duì)于Avazu 與Criteo-Kaggle 數(shù)據(jù)集,嵌入?yún)?shù)的維度被設(shè)為32;對(duì)于Criteo-TB 數(shù)據(jù)集,維度被設(shè)為128.
Table 2 Datasets for Test表2 測(cè)試用數(shù)據(jù)集
3)對(duì)比系統(tǒng).本文實(shí)驗(yàn)將GDRec 與HugeCTR 進(jìn)行性能對(duì)比.HugeCTR 是NVIDIA 公司推出的針對(duì)推薦模型負(fù)載特別優(yōu)化的預(yù)估系統(tǒng).HugeCTR 使用RocksDB系統(tǒng)存儲(chǔ)SSD 上的參數(shù),其會(huì)導(dǎo)致嚴(yán)重的內(nèi)核I/O 棧開(kāi)銷,同時(shí)其采用的LSM-Tree(log-structured merge-tree)數(shù)據(jù)結(jié)構(gòu)對(duì)推薦模型點(diǎn)查詢的負(fù)載并不友好.為了公平對(duì)比與充分展現(xiàn)基于GPU 直訪架構(gòu)的優(yōu)勢(shì),我們基于SPDK 重新實(shí)現(xiàn)了SSD 參數(shù)存儲(chǔ)模塊,并替換RocksDB,后文簡(jiǎn)稱該系統(tǒng)為HugeCTR-OPT.HugeCTROPT 可被視為極致優(yōu)化的基于CPU 訪存架構(gòu)的系統(tǒng),其與GDRec 僅在I/O 提交方式上有區(qū)別.
在系統(tǒng)配置方面,如不作特殊說(shuō)明,我們默認(rèn)設(shè)置DRAM 大小為5%的模型,模型剩余部分存儲(chǔ)于SSD中.對(duì)于HugeCTR,我們使用NVIDIA 提供的原生配置(RocksDB 開(kāi)啟10 b 布隆過(guò)濾器, 8 MB 塊緩存大?。?HugeCTR 與GDRec 均使用單個(gè)CPU 線程處理預(yù)估請(qǐng)求.
所有代碼使用GCC 9.3 與NVCC 11.3 編譯,優(yōu)化選項(xiàng)為-O2.對(duì)于GPU,我們使用的CUDA 版本為11.3,cuDNN 版本為8.2.
本節(jié)測(cè)試對(duì)比基于CPU 訪存與GPU 直訪的2 種架構(gòu)在訪問(wèn)DRAM 與SSD 時(shí)的基準(zhǔn)性能.測(cè)試過(guò)程為:在GPU 中以均勻分布隨機(jī)生成一定數(shù)量的特征ID,由2 種架構(gòu)分別訪問(wèn)DRAM 和SSD 得到對(duì)應(yīng)參數(shù),并將參數(shù)拷貝至GPU 中.該測(cè)試過(guò)程對(duì)應(yīng)于推薦模型訪問(wèn)嵌入?yún)?shù)時(shí)的過(guò)程,我們分別選擇HugeCTROPT 與GDRec 系統(tǒng)的對(duì)應(yīng)功能實(shí)現(xiàn)用作本節(jié)的測(cè)試.
圖6 展示了當(dāng)參數(shù)完全位于DRAM 上時(shí)2 種架構(gòu)的性能.對(duì)于同樣數(shù)量的特征ID,GDRec 的完成時(shí)延要比HugeCTR-OPT 低1.5~3.6 倍.這一方面由于GDRec 無(wú)需CPU-GPU 之間多次通信,另一方面得益于GDRec 避免了聚集時(shí)CPU 額外拷貝造成的時(shí)延.
圖6 內(nèi)存嵌入?yún)?shù)訪問(wèn)性能Fig.6 Performance of accessing in-memory embeddings
此外,當(dāng)查詢的特征數(shù)目較少時(shí),例如100,Huge-CTR-OPT 單就CPU-GPU 通信時(shí)延(包括將ID 從GPU傳至CPU、將參數(shù)從CPU 傳至GPU),已與GDRec 完成的總體時(shí)延相近,這充分說(shuō)明了GDRec 內(nèi)存直訪機(jī)制設(shè)計(jì)的優(yōu)越性.
圖7 則展示了當(dāng)參數(shù)完全位于SSD 上時(shí)2 種架構(gòu)的性能.GDRec 相比于HugeCTR-OPT 性能有1.2~2.0 倍的提升.其原因一方面類似于內(nèi)存直訪機(jī)制,外存直訪機(jī)制同樣節(jié)省了CPU-GPU 通信開(kāi)銷與聚集步驟的額外拷貝;另一方面,外存直訪機(jī)制在提交SSD 的I/O 請(qǐng)求時(shí)可以充分利用GPU 的高并行性并行提交,減少了參數(shù)讀取時(shí)延.
圖7 外存嵌入?yún)?shù)訪問(wèn)性能Fig.7 Performance of accessing in-SSD embeddings
對(duì)比圖6 和圖7,我們發(fā)現(xiàn)相比于在DRAM 上,GDRec 在SSD 上獲得的性能提升更少.其原因是SSD有著比DRAM 更高的硬件讀取延遲,這導(dǎo)致GDRec可優(yōu)化的軟件部分時(shí)延占端到端的比例減少,進(jìn)而在SSD 上性能提升更少.
圖8(a)展示了在不同批處理大小下,GDRec 與對(duì)比系統(tǒng)的預(yù)估樣本吞吐量情況.從圖8(a)中可知:
圖8 系統(tǒng)吞吐量對(duì)比Fig.8 System throughput comparison
1) 當(dāng)批處理變大時(shí),所有系統(tǒng)的吞吐量都隨之上升,這是由于大的批處理可以更充分地利用GPU的并行性;
2) HugeCTR 系統(tǒng)吞吐最低,且與另外2 個(gè)系統(tǒng)有著數(shù)量級(jí)上的差距,其原因是RocksDB 適合范圍查詢、寫密集場(chǎng)景,并未針對(duì)推薦模型的點(diǎn)查詢、讀密集場(chǎng)景做定制優(yōu)化;
3) HugeCTR-OPT 使用SPDK 定制了點(diǎn)查詢友好的SSD 參數(shù)存儲(chǔ)模塊,相比于HugeCTR 獲得了性能提升,但其CPU 訪存的架構(gòu)仍然面臨1.2 節(jié)所述的2個(gè)問(wèn)題;
4) 相比于HugeCTR-OPT,GDRec 在Avazu,Criteo-Kaggle,Criteo-TB 這3 個(gè)數(shù)據(jù)集上分別獲得1.1~1.4 倍、1.1~1.9 倍與1.3~1.9 倍的性能提升,性能提升來(lái)自于GDRec 的GPU 直訪存儲(chǔ)設(shè)計(jì),內(nèi)存直訪機(jī)制與外存直訪機(jī)制將CPU 與GPU 的通信次數(shù)均降低為1,同時(shí)零拷貝的設(shè)計(jì)消除了額外的拷貝開(kāi)銷,而GPU 并行提交I/O 命令縮短了讀取SSD 時(shí)控制路徑的時(shí)間;
5)隨著批處理變大,GDRec 相對(duì)于HugeCTROPT 提升的性能更多,這是由于大批次樣本情況下查詢SSD 的時(shí)間占比更多,此時(shí)GDRec 的GPU 外存直訪機(jī)制的優(yōu)勢(shì)更得以充分體現(xiàn).
進(jìn)一步地,由于GDRec 的所有設(shè)計(jì)僅針對(duì)于嵌入層,我們?cè)趫D8(b)單獨(dú)展示不同系統(tǒng)在模型嵌入層的吞吐量.可以看到,在Avazu,Criteo-Kaggle,Criteo-TB 這3 個(gè)數(shù)據(jù)集上,相比于HugeCTR-OPT,GDRec分別可以獲得1.1~2.1 倍、1.4~2.4 倍與1.4~2.7 倍的性能提升.此測(cè)試排除了GDRec 未優(yōu)化的模型MLP 層,因此,相比于端到端預(yù)估,GDRec 可以獲得更多的性能提升.
圖9 展示了HugeCTR-OPT 與GDRec 在3 個(gè)數(shù)據(jù)集上的端到端預(yù)估中位數(shù)延遲-樣本吞吐曲線.由于HugeCTR 的性能與它們有數(shù)量級(jí)的差異,因此省去其測(cè)試結(jié)果.
圖9 端到端中位數(shù)延遲-吞吐量曲線Fig.9 Curves of throughput vs.end-to-end median latency
從圖9 發(fā)現(xiàn),相比于HugeCTR-OPT,GDRec 可以達(dá)到更高的樣本吞吐量與更低的預(yù)估時(shí)延.在Criteo-TB 數(shù)據(jù)集上,給定中位數(shù)延遲為2 ms 的情況下,GDRec提升樣本吞吐量1.9 倍,這主要是由于GDRec 充分利用GPU 并行性對(duì)內(nèi)存與外存進(jìn)行直訪,可以達(dá)到更高的嵌入層吞吐量,同時(shí)避免CPU 訪存架構(gòu)在嵌入層的瓶頸現(xiàn)象;給定樣本吞吐量為15 萬(wàn)樣本/s,GDRec 可以降低74%的中位數(shù)延遲,這一方面由于在數(shù)據(jù)路徑上GPU 直訪省去了CPU 聚集時(shí)在內(nèi)存上的額外拷貝與大部分CPU-GPU 通信開(kāi)銷,另一方面,GPU 可以并行提交DRAM 的訪存指令和SSD 的I/O 命令,在控制路徑上具有更低的時(shí)延.
本節(jié)實(shí)驗(yàn)考慮小模型預(yù)估場(chǎng)景,即當(dāng)模型可以完全存儲(chǔ)在DRAM 中時(shí)的情況.
圖10 展示了GDRec 和HugeCTR-OPT 在不同批處理大小下的樣本吞吐量.因?yàn)镃riteo-TB 數(shù)據(jù)集對(duì)應(yīng)的模型容量已遠(yuǎn)超過(guò)CPU 的DRAM 內(nèi)存大小,本節(jié)測(cè)試用的數(shù)據(jù)集選擇了Avazu 與Criteo-Kaggle.從圖10 可知:
圖10 小模型端到端吞吐量Fig.10 End-to-end throughput when models fit in DRAM
1) GDRec 可以在純內(nèi)存場(chǎng)景下在Avazu 與Criteo-Kaggle 上分別獲得1.1~1.3 倍、1.2~1.3 倍的吞吐性能提升,這完全得益于GDRec 的內(nèi)存直訪機(jī)制;
2) GDRec 的相對(duì)性能提升在較大的批處理大小情況下更少,其原因是此時(shí)GPU 去重、CPU-GPU 通信等操作的時(shí)延增加,導(dǎo)致訪問(wèn)內(nèi)存時(shí)延占比變少,因此內(nèi)存直訪機(jī)制可以提升的部分有限.
本節(jié)從推薦模型預(yù)估系統(tǒng)與基于GPU 直訪存儲(chǔ)架構(gòu)的系統(tǒng)2 方面介紹相關(guān)工作.
1)推薦模型預(yù)估系統(tǒng).由于推薦模型獨(dú)特的訪存特性,大量工作對(duì)此設(shè)計(jì)定制化的預(yù)估系統(tǒng).我們根據(jù)使用的硬件將它們分為兩類.
一類工作僅使用CPU,GPU 等通用硬件.HugeCTRInference[11]是NVIDIA 公司推出的高度優(yōu)化的預(yù)估系統(tǒng),其構(gòu)建GPU 顯存、DRAM、SSD 多層級(jí)參數(shù)服務(wù)器存儲(chǔ)模型參數(shù).Fleche[27]在HugeCTR-Inference 的基礎(chǔ)上優(yōu)化了嵌入?yún)?shù)顯存緩存的組織形式與查詢方式,以減少緩存缺失率并提升預(yù)估性能.MERCI[25]基于物化視圖的思想緩存同時(shí)出現(xiàn)的嵌入?yún)?shù)經(jīng)池化后的結(jié)果,以減少內(nèi)存訪問(wèn)量,提升性能.Bandana[10]系統(tǒng)利用NVMe SSD 存儲(chǔ)模型以降低DRAM 成本,其使用超圖劃分算法將可能同時(shí)出現(xiàn)的參數(shù)放置于同一個(gè)數(shù)據(jù)塊中,以減少塊設(shè)備的讀寫放大現(xiàn)象.EVSTORE[8]為SSD 參數(shù)存儲(chǔ)設(shè)計(jì)了混合型DRAM緩存,混合使用了組緩存、混合精度緩存和近似緩存,可以在幾乎不影響模型準(zhǔn)確率的情況下充分降低DRAM 的使用量.文獻(xiàn)[11, 27]工作雖然在不同場(chǎng)景下緩解了嵌入層訪存瓶頸問(wèn)題,但它們?cè)诒举|(zhì)上仍屬于傳統(tǒng)CPU 訪存架構(gòu),并未解決CPU-GPU 通信開(kāi)銷高、內(nèi)存上的額外拷貝等問(wèn)題.
另一類工作使用FPGA、近內(nèi)存計(jì)算(near memory processing, NMP)等定制硬件加速嵌入層的處理.MicroRec[28]與FleetRec[19]利用帶有高帶寬內(nèi)存的FPGA 加速嵌入層的訪存操作.RecNMP[29],Tensor-DIMM[30],F(xiàn)AFNIR[31]使用近內(nèi)存計(jì)算的方式,將池化操作卸載至內(nèi)存; 類似地,F(xiàn)lashEmbedding[22]與RecSSD[23]將嵌入層的訪存與計(jì)算操作卸載至SSD控制器.在數(shù)據(jù)中心中部署這些工作需要付出額外的硬件開(kāi)銷,而GDRec 則可以完全使用現(xiàn)有服務(wù)器硬件部署.
2) 基于GPU 直訪存儲(chǔ)架構(gòu)的系統(tǒng).圖計(jì)算、圖神經(jīng)網(wǎng)絡(luò)、推薦系統(tǒng)等新興應(yīng)用催生了GPU 對(duì)存儲(chǔ)資源進(jìn)行大量隨機(jī)、細(xì)粒度的訪問(wèn)需求.傳統(tǒng)架構(gòu)依賴CPU 對(duì)存儲(chǔ)資源進(jìn)行訪問(wèn),但造成CPU-GPU 通信開(kāi)銷大、CPU 處理時(shí)延高等問(wèn)題,嚴(yán)重影響GPU 計(jì)算效率.在此背景下,一些工作繞開(kāi)CPU,使GPU 直訪存儲(chǔ)并加速各類應(yīng)用.EMOGI[32]針對(duì)GPU 上的圖遍歷負(fù)載,利用細(xì)粒度主機(jī)內(nèi)存直訪加速圖數(shù)據(jù)結(jié)構(gòu)的訪問(wèn).伊利諾伊大學(xué)厄巴納-香檳分校、IBM、NVIDIA 等單位合作于2021 年提出的圖卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練系統(tǒng)[33],使用少量GPU 線程以零拷貝的方式從主機(jī)內(nèi)存預(yù)取圖節(jié)點(diǎn)特征至GPU 內(nèi)存,重疊計(jì)算與訪存,獲得了多達(dá)92%的訓(xùn)練吞吐量提升.BaM[34]將SSD 抽象成可供GPU 直訪的大數(shù)組,并在其之上運(yùn)行圖分析與數(shù)據(jù)分析應(yīng)用.文獻(xiàn)[32–34]的工作僅面向單一的內(nèi)存或外存GPU 直訪,且尚無(wú)現(xiàn)有工作針對(duì)推薦模型預(yù)估的獨(dú)特訪存流程與混合存儲(chǔ)場(chǎng)景做定制設(shè)計(jì).
推薦模型的參數(shù)訪存已成為模型預(yù)估的性能瓶頸.現(xiàn)有基于CPU 訪存架構(gòu)的預(yù)估系統(tǒng)存在著CPUGPU 同步開(kāi)銷大和額外內(nèi)存拷貝2 個(gè)問(wèn)題,其性能已無(wú)法滿足模型高速增長(zhǎng)的訪存需求.本文提出一種基于GPU 直訪存儲(chǔ)架構(gòu)的推薦模型預(yù)估系統(tǒng)GDRec,通過(guò)在參數(shù)訪存路徑上移除CPU 參與,由GPU 以零拷貝的方式高效直訪內(nèi)存、外存資源.實(shí)驗(yàn)顯示,相比于現(xiàn)有預(yù)估系統(tǒng),GDRec 可以大幅度提升模型預(yù)估的吞吐量,同時(shí)降低預(yù)估延遲.
作者貢獻(xiàn)聲明:謝旻暉參與論文設(shè)計(jì)、代碼實(shí)現(xiàn)測(cè)試,撰寫論文;陸游游參與研究思路討論,修改論文;馮楊洋參與前期實(shí)驗(yàn)方案的討論設(shè)計(jì)與論文修改;舒繼武參與研究思路討論.