微博推薦團(tuán)隊(duì):陳雨、韓楠、蔡小娟、高家華
1.項(xiàng)目背景
熱門(mén)微博是新浪微博的重要功能之一,包含熱門(mén)流、熱點(diǎn)流、頻道流、小視頻后推薦、視頻社區(qū)等場(chǎng)景。
推薦首頁(yè) 發(fā)現(xiàn)頁(yè)推薦 沉浸視頻
weidl機(jī)器學(xué)習(xí)框架為熱門(mén)微博在線學(xué)習(xí)提供模型訓(xùn)練和推理服務(wù),推薦全鏈路中在線推理服務(wù)的性能一直是weidl框架優(yōu)化迭代的重要目標(biāo)。在線學(xué)習(xí)系統(tǒng)依托于weidl框架。其服務(wù)的吞吐量、平均響應(yīng)時(shí)間、承接上游QPS、機(jī)器資源占用等指標(biāo)相互制衡,其中weidl框架推理計(jì)算的性能至關(guān)重要,與推薦服務(wù)全鏈路的整體性能指標(biāo)及成本密切相關(guān)。探索引擎中計(jì)算圖運(yùn)行時(shí)算子計(jì)算加速的各種特性及優(yōu)化支持成為本項(xiàng)目主要方向。
DeepRec (https://github.com/alibaba/DeepRec)是阿里巴巴集團(tuán)提供的針對(duì)搜索、推薦、廣告場(chǎng)景模型的訓(xùn)練/預(yù)測(cè)引擎,在分布式、圖優(yōu)化、算子、Runtime等方面對(duì)稀疏模型進(jìn)行了深度性能優(yōu)化,同時(shí)提供了稀疏場(chǎng)景下豐富的Embedding相關(guān)功能。
本文主要介紹熱門(mén)微博推薦的整體架構(gòu)與DeepRec對(duì)熱門(mén)推薦框架性能上的提升,并詳細(xì)剖析的weidl平臺(tái)中使用的DeepRec的重要優(yōu)化點(diǎn)。
2.熱門(mén)微博推薦系統(tǒng)與weidl在線學(xué)習(xí)平臺(tái)
2.1 熱門(mén)微博推薦系統(tǒng)整體架構(gòu)
熱門(mén)微博推薦系統(tǒng)可分為前臺(tái)業(yè)務(wù)與weidl在線學(xué)習(xí)平臺(tái)兩個(gè)部分。前臺(tái)業(yè)務(wù)為各個(gè)業(yè)務(wù)的接口,負(fù)責(zé)將推薦結(jié)果返回給業(yè)務(wù)方。在線學(xué)習(xí)平臺(tái)集成了樣本拼接、模型訓(xùn)練、參數(shù)服務(wù)器、模型服務(wù)等多個(gè)模塊,為熱門(mén)推薦的多個(gè)業(yè)務(wù)實(shí)現(xiàn)了完整的推薦流程,可快速為新業(yè)務(wù)搭建一套推薦系統(tǒng)。
2.2 weidl在線學(xué)習(xí)平臺(tái)
在線學(xué)習(xí)平臺(tái)是整個(gè)系統(tǒng)最核心的部分,主要負(fù)責(zé)召回、粗排、精排等模塊。熱門(mén)推薦系統(tǒng)為全鏈路大規(guī)模深度模型的在線學(xué)習(xí)系統(tǒng),其中召回模塊有興趣召回、熱點(diǎn)召回、策略召回、模型召回等多路召回,分別從千萬(wàn)級(jí)物料庫(kù)中召回部分候選集,通過(guò)每路配額配置,將萬(wàn)級(jí)物料送入粗排模塊。粗排階段通過(guò)物料特征離線生成、用戶(hù)特征實(shí)時(shí)拉取的方式,實(shí)現(xiàn)高性能的打分服務(wù),通過(guò)粗排排序后,將千級(jí)候選集送入精排階段。精排階段模型最為復(fù)雜,物料與用戶(hù)特征實(shí)時(shí)拉取,多場(chǎng)景多目標(biāo)融合,最終通過(guò)規(guī)則系統(tǒng)的重排,選出一次曝光的博文,推薦給用戶(hù)。
在線學(xué)習(xí)平臺(tái)底層推理計(jì)算部分采用bridge模式,支持多個(gè)backend,包括DeepRec、TensorFlow、Torch、TensorRT等,同時(shí)支持基于CPU與GPU的模型訓(xùn)練與在線推理。
weidl在線學(xué)習(xí)平臺(tái)
熱門(mén)微博推薦系統(tǒng)從2018年開(kāi)始,經(jīng)過(guò)幾年的升級(jí),在實(shí)時(shí)性和規(guī)模上都有了本質(zhì)的提升。
2.2.1 實(shí)時(shí)性
實(shí)時(shí)性包括模型學(xué)習(xí)到用戶(hù)行為的速度,模型參數(shù)的更新應(yīng)用到線上模型服務(wù)的速度。推薦系統(tǒng)的更新速度越快,越能夠反應(yīng)用戶(hù)最近的用戶(hù)習(xí)慣,越能夠給用戶(hù)進(jìn)行越有時(shí)效性的推薦;模型更容易發(fā)現(xiàn)最新流行的數(shù)據(jù)pattern,越能夠讓模型反應(yīng)找到最新的流行趨勢(shì)。工程上主要通過(guò)以下幾個(gè)方面,實(shí)現(xiàn)推薦系統(tǒng)的實(shí)時(shí)性。
a. 樣本拼接作為模型訓(xùn)練的起點(diǎn),一條完整的樣本拼接完成的速度決定了模型學(xué)習(xí)用戶(hù)行為速度的上限,目前熱門(mén)推薦樣本拼接窗口為30分鐘,即用戶(hù)在客戶(hù)端的互動(dòng)行為在30分鐘內(nèi)必會(huì)生成一條樣本,送入kafka隊(duì)列。
b. 模型訓(xùn)練讀取樣本流kafka,保證kafka無(wú)積壓,所以該條樣本會(huì)在毫秒級(jí)被模型學(xué)到,并通過(guò)rpc調(diào)用,更新到訓(xùn)練的參數(shù)服務(wù)器,并將新的模型參數(shù)推入kafka隊(duì)列。
c. 參數(shù)同步服務(wù)從模型更新的kafka隊(duì)列中讀取數(shù)據(jù),將模型最新的參數(shù)通過(guò)rpc調(diào)用,發(fā)送給在線服務(wù)所用的參數(shù)服務(wù)器中,此時(shí)從用戶(hù)行為到模型更新完成。
d. 模型在線推理服務(wù)直連參數(shù)服務(wù)器,實(shí)時(shí)拉取模型最新參數(shù)進(jìn)行打分。除去樣本拼接所需的30分鐘窗口,其余流程在1分鐘內(nèi)完成。
2.2.2 大規(guī)模深度復(fù)雜模型
熱門(mén)推薦業(yè)務(wù)從最初的FM模型,到現(xiàn)在召回階段以雙塔為主,粗排階段以cold dnn為主,精排階段以多場(chǎng)景、多目標(biāo)的復(fù)雜深度模型為主,模型在特征數(shù)量、目標(biāo)個(gè)數(shù)、模型結(jié)構(gòu)復(fù)雜度上都發(fā)生了質(zhì)的變化,給業(yè)務(wù)帶來(lái)了很大的收益。
精排模型從snr模型迭代到mm模型
粗排雙塔模型迭代到cold dnn模型
模型復(fù)雜度的提升給工程架構(gòu)帶來(lái)了不小的壓力,一個(gè)multitask模型比一個(gè)單目標(biāo)的dnn模型在算力上是成倍的增加。為了復(fù)雜模型的落地,熱門(mén)微博推薦團(tuán)隊(duì)探索了多種開(kāi)源框架,包括TensorRT, XDL,TFRA等,通過(guò)測(cè)試與源碼分析,這些框架都在原生Tensorflow基礎(chǔ)上做了不同方向的優(yōu)化,但性能始終無(wú)法滿(mǎn)足要求。同時(shí),我們也通過(guò)指令集優(yōu)化、改進(jìn)TensorFlow內(nèi)存管理、算子融合等方式,優(yōu)化weidl kernel部分性能。
在不斷的優(yōu)化與開(kāi)源框架的嘗試中,發(fā)現(xiàn)DeepRec框架在性能、易用性、與weidl的兼容性上都全面勝出,最終,熱門(mén)推薦框架引擎采用DeepRec引擎,提升了訓(xùn)練與在線推理的新能,同時(shí)也給業(yè)務(wù)帶來(lái)了效果上的提升。
3.DeepRec及相關(guān)模塊優(yōu)化點(diǎn)剖析
3.1 OneDNN庫(kù)加速算子運(yùn)算
DeepRec集成了最新版本的開(kāi)源的跨平臺(tái)深度學(xué)習(xí)性能加速庫(kù)oneDNN(oneAPI Deep Neural Network Library),英特爾相關(guān)團(tuán)隊(duì)進(jìn)一步優(yōu)化將oneDNN 原有的線程池統(tǒng)一成DeepRec的Eigen線程池,減少了線程池切換開(kāi)銷(xiāo),避免了不同線程池之間競(jìng)爭(zhēng)而導(dǎo)致的性能下降問(wèn)題。oneDNN針對(duì)主流算子實(shí)現(xiàn)了性能優(yōu)化,包括MatMul、BiasAdd、LeakyReLU等在稀疏場(chǎng)景中的常見(jiàn)算子。針對(duì)熱門(mén)微博的線上模型,性能提升明顯。
在DeepRec中英特爾CESG團(tuán)隊(duì)針對(duì)搜索廣告推薦模型中存在著大量稀疏算子如Select、DynamicStitch、Transpose、Tile、SparseSegmentMean、Unique、SparseSegmentSum、SparseFillEmptyRows等一系列稀疏算子進(jìn)行了深度的優(yōu)化,下面介紹2個(gè)常用稀疏算子的優(yōu)化方法。
3.1.1 Select算子優(yōu)化
Select算子實(shí)現(xiàn)原理是依據(jù)條件來(lái)做元素的選擇,此時(shí)可采用向量化指令的mask load方式,如圖所示,以減少原先由if條件帶來(lái)大量判斷所導(dǎo)致的時(shí)間開(kāi)銷(xiāo),然后再通過(guò)批量選擇提升數(shù)據(jù)讀寫(xiě)效率,最終線上測(cè)試表明,性能提升顯著。
3.1.2 Transpose算子優(yōu)化
同樣,可以使用向量化的unpack和shuffle指令對(duì)transpose算子進(jìn)行優(yōu)化,即通過(guò)小Block的方式對(duì)矩陣進(jìn)行轉(zhuǎn)置,最終經(jīng)線上測(cè)試表明,性能提升同樣十分顯著。
3.2 關(guān)鍵路徑優(yōu)先的調(diào)度引擎
DeepRec通過(guò)對(duì)執(zhí)行引擎以及底層線程池的重新設(shè)計(jì),達(dá)到在不同的場(chǎng)景下,包括trianing和inference,能做到更佳執(zhí)行性能。保證不同線程之間的均衡性,盡量減少線程之間的steal,避免加鎖等問(wèn)題。
Executor的設(shè)計(jì)需要考慮對(duì)內(nèi)存的訪問(wèn)及其并行實(shí)現(xiàn)之間的聯(lián)系,進(jìn)行多層次任務(wù)調(diào)度,減少緩存缺失和遠(yuǎn)程內(nèi)存訪問(wèn),充分發(fā)揮多核、多節(jié)點(diǎn)CPU的并行特性,提升系統(tǒng)的運(yùn)行性能。在線程池層面,設(shè)計(jì)Cost-aware線程池,結(jié)合內(nèi)存感知以及算子類(lèi)型等信息,進(jìn)行針對(duì)性?xún)?yōu)化;在計(jì)算圖層面,對(duì)張量?jī)?nèi)存的位置進(jìn)行調(diào)度,有利于線程池的調(diào)度;在算子生成層面,進(jìn)行有利于線程池任務(wù)調(diào)度的算子任務(wù)劃分。
DeepRec提供的基于關(guān)鍵路徑優(yōu)化的執(zhí)行引擎,通過(guò)動(dòng)態(tài)采集Session Run情況,統(tǒng)計(jì)與計(jì)算多組指標(biāo),并構(gòu)建CostModel,計(jì)算出一個(gè)較優(yōu)的調(diào)度策略。該功能中包含了基于關(guān)鍵路徑的調(diào)度策略,根據(jù)CostModel patching執(zhí)行細(xì)碎算子的調(diào)度策略以及線程池Cost-aware調(diào)度策略等。
在graph執(zhí)行過(guò)程中,Collector會(huì)監(jiān)測(cè)所有算子執(zhí)行以及線程池情況,包括算子執(zhí)行時(shí)間,線程池pending任務(wù)飽和度,以及算子的前后依賴(lài)關(guān)系。這些參數(shù)會(huì)通過(guò)CostModel來(lái)計(jì)算更佳的調(diào)度策略。對(duì)于一張graph來(lái)說(shuō),存在一條或者多條關(guān)鍵路徑,即從輸入到輸出經(jīng)過(guò)的延時(shí)最長(zhǎng)的邏輯路徑。graph執(zhí)行總的時(shí)間一定是大于等于關(guān)鍵路徑時(shí)間。為了讓整個(gè)graph執(zhí)行更快,并發(fā)更佳高效 ,在graph執(zhí)行時(shí)應(yīng)當(dāng)優(yōu)先執(zhí)行關(guān)鍵路徑上的節(jié)點(diǎn)。
在稀疏模型圖中,可能會(huì)存在大量細(xì)碎算子,會(huì)帶來(lái)大量調(diào)度開(kāi)銷(xiāo)。有些可以通過(guò)算子融合來(lái)做優(yōu)化,算子融合一般通過(guò)graph pattern匹配或者手動(dòng)指定子圖來(lái)確定需要融合的對(duì)象,難以覆蓋全部算子。故而在executor層面,通過(guò)trace運(yùn)行時(shí)數(shù)據(jù)來(lái)動(dòng)態(tài)進(jìn)行批量調(diào)度執(zhí)行,這樣可以減少非必要的細(xì)碎算子調(diào)度開(kāi)銷(xiāo)。
在線程調(diào)度層面,目前的線程池調(diào)度策略比較簡(jiǎn)單,如果當(dāng)前執(zhí)行線程是inter線程,優(yōu)先將task調(diào)度到當(dāng)前線程執(zhí)行,若不是,則調(diào)度到一個(gè)random線程上。線程的balance完全由steal機(jī)制來(lái)保證。在我們的觀察中,發(fā)現(xiàn)inter線程之間存在大量的steal,這會(huì)導(dǎo)致很多鎖以及重復(fù)的線程調(diào)度等開(kāi)銷(xiāo)。CostModel executor通過(guò)采集運(yùn)行時(shí)數(shù)據(jù),來(lái)確定更佳的線程來(lái)執(zhí)行任務(wù),減少大量的steal行為。
在復(fù)雜模型上,使用DeepRec的CostModel調(diào)度,能夠生成更佳的調(diào)度策略,減少調(diào)度開(kāi)銷(xiāo)。在測(cè)試的snr模型上平均耗時(shí)穩(wěn)定優(yōu)化2ms。
3.3 動(dòng)態(tài)感知的內(nèi)存/顯存分配器
在張量?jī)?nèi)存管理方面,通常存在兩點(diǎn)問(wèn)題,一個(gè)是內(nèi)存碎片過(guò)多,另一個(gè)是沒(méi)有考慮模型結(jié)構(gòu)存在多分支的情況下算子并行帶來(lái)的內(nèi)存增長(zhǎng)。其內(nèi)存管理十分粗放,大體上都是運(yùn)行時(shí)依據(jù)內(nèi)存請(qǐng)求動(dòng)態(tài)進(jìn)行內(nèi)存釋放和分配,同時(shí)進(jìn)行一些內(nèi)存池管理。由于無(wú)法感知上層應(yīng)用的分配請(qǐng)求特點(diǎn),這種內(nèi)存管理存在著內(nèi)存碎片過(guò)多的特點(diǎn)。例如在不清楚后續(xù)內(nèi)存請(qǐng)求的情況下,由于前期的多次內(nèi)存分配和釋放,會(huì)導(dǎo)致后來(lái)的大內(nèi)存請(qǐng)求由于內(nèi)存碎片的問(wèn)題而需要一塊新的內(nèi)存或者OOM。
深度學(xué)習(xí)模型的內(nèi)存分配由于其應(yīng)用特點(diǎn)存在著明顯的規(guī)律性,訓(xùn)練時(shí)都是以一個(gè)個(gè)mini-batch的形式訓(xùn)練,每個(gè)mini-batch的分配特征大體上保持一致,訓(xùn)練時(shí)前向過(guò)程一直分配內(nèi)存,較少釋放,而反向過(guò)程中會(huì)釋放前向計(jì)算中的臨時(shí)張量,釋放大量?jī)?nèi)存,所以?xún)?nèi)存會(huì)周期性呈現(xiàn)先增長(zhǎng)后降低的特征。基于此學(xué)習(xí)到執(zhí)行過(guò)程中內(nèi)存分配pattern,從而減少內(nèi)存的動(dòng)態(tài)分配以及對(duì)內(nèi)存塊做到最佳的復(fù)用。同時(shí)自適應(yīng)內(nèi)存分配器也是graph-aware的,這樣使得不同子圖之間存在較小的相互干擾,提高分配效率。自適應(yīng)內(nèi)存分配器基本架構(gòu)如下圖所示:
自適應(yīng)內(nèi)存分配器在訓(xùn)練過(guò)程對(duì)于前面的K輪進(jìn)行一些統(tǒng)計(jì),通過(guò)Allocator模塊,對(duì)內(nèi)存的分配,包括分配的時(shí)間點(diǎn)、分配的大小,統(tǒng)計(jì)好分配的時(shí)間點(diǎn)和大小后,在K輪結(jié)束之后會(huì)使用啟發(fā)式的一些算法規(guī)劃出一個(gè)較優(yōu)的tensor cache planner,planner會(huì)創(chuàng)建allocator,并且預(yù)分配一些tensor內(nèi)存塊,后續(xù)的分配會(huì)優(yōu)先通過(guò)此allocator進(jìn)行分配。
自適應(yīng)內(nèi)存分配器基本原則是使用盡量少內(nèi)存,同時(shí)提高內(nèi)存的復(fù)用率。整體來(lái)講,自適應(yīng)內(nèi)存分配器解決了在稀疏場(chǎng)景中內(nèi)存分配上存在的一些問(wèn)題,主要包括,第一,減少了在稀疏場(chǎng)景中,大量?jī)?nèi)存分配問(wèn)題,包括小內(nèi)存和大內(nèi)存。譬如小內(nèi)存分配出現(xiàn)在特征的處理過(guò)程中,包括一些特征的拼接,或者在做一些交叉特征,這里會(huì)存在大量的小內(nèi)存的分配。同樣在模型訓(xùn)練也存在很多大的內(nèi)存,包括attention、RNN、或者全連接層,會(huì)有一些大內(nèi)存的分配。減少大內(nèi)存的分配,進(jìn)而也減少了minor pagefault數(shù)量。第二,對(duì)于tensor能做到更好的復(fù)用,減少了總體的內(nèi)存占用量。
4.DeepRec在業(yè)務(wù)中取得的收益
4.1 服務(wù)性能提升
熱門(mén)微博已于9月將weidl的backend全量替換為DeepRec,線上服務(wù)與訓(xùn)練都取得了很大的收益,最明顯的是精排多任務(wù)模型,圖計(jì)算部分DeepRec比原生TensorFlow耗時(shí)降低50%,精排階段整體耗時(shí)降低20%,單機(jī)吞吐量提升30%。
對(duì)于雙塔和cold dnn模型,圖計(jì)算部分耗時(shí)降低20%,粗排階段整體耗時(shí)降低10%, 單機(jī)吞吐量提升20%,模型訓(xùn)練模塊性能提升20%, 提升了訓(xùn)練速度并有效的改善了樣本積壓?jiǎn)栴}。
4.2 性能提升所帶來(lái)的其他收益
推薦引擎模塊整體耗時(shí)減少與吞吐量的提升,減少了推薦在訓(xùn)練與在線推理上所使用的機(jī)器資源,極大的降低了公司成本。
在線推理服務(wù)性能提升,使推薦引擎各個(gè)模塊可以計(jì)算更多的候選物料,粗排階段可以計(jì)算更多的候選物料,提升物料庫(kù)總量與擴(kuò)大召回條數(shù),精排也由1000條擴(kuò)到2000條,每個(gè)階段候選物料數(shù)的增加,都會(huì)對(duì)整體指標(biāo)有顯著的提升。
免責(zé)聲明:市場(chǎng)有風(fēng)險(xiǎn),選擇需謹(jǐn)慎!此文僅供參考,不作買(mǎi)賣(mài)依據(jù)。
關(guān)鍵詞: