Angel:深度學(xué)習(xí)在騰訊廣告推薦系統(tǒng)中的實(shí)踐

分享嘉賓:郭躍超 騰訊 應(yīng)用研究員
編輯整理:康德芬
出品平臺(tái):DataFunTalk
Angel機(jī)器學(xué)習(xí)平臺(tái)
廣告推薦系統(tǒng)與模型
模型訓(xùn)練和優(yōu)化
優(yōu)化效果
1. Angel機(jī)器學(xué)習(xí)平臺(tái)架構(gòu)
Angel機(jī)器學(xué)習(xí)平臺(tái)是騰訊自研的基于傳統(tǒng)Parameter Server架構(gòu)的高性能分布式的機(jī)器學(xué)習(xí)平臺(tái)如圖1所示,詳細(xì)架構(gòu)圖如圖2所示。它是一個(gè)全棧機(jī)器學(xué)習(xí)平臺(tái),支持特征工程、模型訓(xùn)練、模型服務(wù)、參數(shù)調(diào)優(yōu)等,同時(shí)支持機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、圖計(jì)算和聯(lián)邦學(xué)習(xí)等場(chǎng)景。已經(jīng)應(yīng)用在眾多業(yè)務(wù)如騰訊內(nèi)部廣告、金融和社交等場(chǎng)景,吸引了包括華為、新浪、小米等100多家外部公司的用戶和開發(fā)者。
Angel機(jī)器學(xué)習(xí)平臺(tái)設(shè)計(jì)時(shí)就考慮到了很多問題,首先是易用性,Angel機(jī)器學(xué)習(xí)平臺(tái)編程接口簡(jiǎn)單,可快速上手使用,支持訓(xùn)練數(shù)據(jù)和模型的自動(dòng)化切分,減少用戶的干預(yù),簡(jiǎn)單易用。然后是可擴(kuò)展性方面,Angel提供了PsFun接口,繼承特定的類可實(shí)現(xiàn)自定義參數(shù)更新邏輯和自定義數(shù)據(jù)格式和模型切分方式等。之后是靈活性,Angel實(shí)現(xiàn)了ANGEL_PS_WORKER和ANGEL_PS_SERVICE兩種模式,ANGEL_PS_WORKER模式下模型的訓(xùn)練和推理服務(wù)由Angel平臺(tái)自身的PS和Worker完成,這種模式主打速度。而ANGEL_PS_SERVICE模式下,Angel只啟動(dòng)Master和PS,具體的計(jì)算交給其他計(jì)算平臺(tái)(如Spark,TensorFlow)負(fù)責(zé),Angel只負(fù)責(zé)提供Parameter Server的功能,主打生態(tài)來擴(kuò)展Angel機(jī)器學(xué)習(xí)平臺(tái)的生態(tài)位。Angel通信模式支持BSP、SSP、ASP等通信協(xié)議,滿足各種復(fù)雜的實(shí)際通信環(huán)境的要求。最后是穩(wěn)定性,Angel的PS容錯(cuò)采用CheckPoint模式,Angel每隔一段時(shí)間會(huì)將PS承載的參數(shù)寫入到分布式存儲(chǔ)系統(tǒng)中,如果某個(gè)PS實(shí)例掛掉,PS會(huì)讀取最后一個(gè)CheckPoint重新進(jìn)行服務(wù)。Angel的Worker容錯(cuò)方面,如果Work掛掉,Master會(huì)重新啟動(dòng)一個(gè)Work實(shí)例,該實(shí)例會(huì)從Master上獲取掛掉時(shí)參數(shù)迭代信息。Angel的Master任務(wù)信息也會(huì)定期存儲(chǔ)到分布式存儲(chǔ)系統(tǒng)中,如果Mater掛掉,會(huì)借助Yarn Master重啟機(jī)制重新拉起一個(gè)Master并加載信息從之前的斷點(diǎn)開始任務(wù)。Angel還有有慢work檢測(cè)機(jī)制,如果某個(gè)Work運(yùn)行過慢其任務(wù)會(huì)被調(diào)度到其他的Work上進(jìn)行。
Angel機(jī)器學(xué)習(xí)平臺(tái)任務(wù)提交執(zhí)行簡(jiǎn)單,具體步驟如圖3所示,進(jìn)入Cient后,啟動(dòng)一個(gè)PS實(shí)例,該P(yáng)S會(huì)從Client端加載模型,之后Client會(huì)啟動(dòng)多個(gè)Work,Work會(huì)加載訓(xùn)練數(shù)據(jù)開始訓(xùn)練和學(xué)習(xí),push和pull會(huì)進(jìn)行參數(shù)的拉取和更新,訓(xùn)練完成后將模型存入指定的路徑。
Angel機(jī)器學(xué)習(xí)平臺(tái)在代碼結(jié)構(gòu)設(shè)計(jì)上做了很多的抽象,這樣的設(shè)計(jì)方式可擴(kuò)展性強(qiáng),整個(gè)結(jié)構(gòu)主要分為四層如圖4所示。核心層(Angel-Core)是基礎(chǔ)層,主要包括PSAgent、PSServer、Work、Network和Storage等。機(jī)器學(xué)習(xí)層(Angel-ML)提供基礎(chǔ)數(shù)據(jù)類型和方法,同時(shí)用戶可根據(jù)PsFunc定義自己的方法把私有模型接入。接口層(Angel-Client)可插拔式擴(kuò)展,支持多種用途比如接入TensorFlow和pyTorch等。算法層(Angel-MLLib)提供了封裝好的算法如GBDT、SVM等。
2. Angel機(jī)器學(xué)習(xí)平臺(tái)在深度學(xué)習(xí)方向上的拓展和應(yīng)用
深度學(xué)習(xí)常用的分布式計(jì)算范式有兩種,分別是MPI ( 基于消息模型的通信模式 ) 和Parameter Server,如圖5所示。這兩種范式均在Angel平臺(tái)上有實(shí)現(xiàn),對(duì)于Parameter Server范式的實(shí)現(xiàn)如圖6所示,Angel Work可通過Native C++的API接口接入常用的深度學(xué)習(xí)的OP如PyTorch或者Tensorflow等,在訓(xùn)練的起始端Angel PS會(huì)把模型Push到每個(gè)Worker上,Worker會(huì)加載到對(duì)應(yīng)的OP上進(jìn)行訓(xùn)練,每次訓(xùn)練完成后會(huì)將梯度信息回傳到PS上進(jìn)行融合,以及應(yīng)用優(yōu)化器得到更新的參數(shù),完成后又會(huì)分發(fā)到每個(gè)Worker上,重復(fù)上述過程直到訓(xùn)練結(jié)束,最終將模型保存到指定路徑。這種方案Angel PS提供了一個(gè)梯度PS的控制器,來接入多個(gè)分布式的Worker,每個(gè)Worker上可以運(yùn)行一些通用的深度學(xué)習(xí)框架例,這種方案PyTorch版本的工作我們已經(jīng)完成,并已經(jīng)開源了(PyTorch on Angel)。另外一種是MPI AllReduce范式如圖7所示,這種范式梯度信息是通過AllReduce方法進(jìn)行融合的,在這種范式的實(shí)現(xiàn)上,Angel PS是一個(gè)進(jìn)程控制器,會(huì)在每個(gè)Work上拉起一個(gè)進(jìn)程,這個(gè)進(jìn)程可以是PyTorch或者是Tensorflow等進(jìn)程,這種范式對(duì)用戶侵入少,用戶開發(fā)的算法不需要太多的修改即可接入到Angel平臺(tái)進(jìn)行訓(xùn)練。


Parmeter Server范式
1. 騰訊的廣告推薦系統(tǒng)
騰訊大數(shù)據(jù)示意圖,如圖8所示,在線業(yè)務(wù)的數(shù)據(jù)如微信游戲等會(huì)通過消息中間件實(shí)時(shí)地傳遞到中臺(tái)系統(tǒng),中臺(tái)系統(tǒng)包括實(shí)時(shí)計(jì)算、離線計(jì)算、調(diào)度系統(tǒng)和分布式存儲(chǔ),這些數(shù)據(jù)有的會(huì)進(jìn)行實(shí)時(shí)計(jì)算有的會(huì)進(jìn)行離線計(jì)算,數(shù)據(jù)的應(yīng)用也是從消息中間件中獲取其需要的數(shù)據(jù)。
騰訊的推薦廣告推薦系統(tǒng)業(yè)務(wù)分層如圖9所示,用戶發(fā)送一個(gè)請(qǐng)求后會(huì)去拉取用戶地畫像特征,之后會(huì)對(duì)廣告庫的廣告進(jìn)行一個(gè)初步地排序和打分,打分之后會(huì)提取用戶地特征信息,同時(shí)將廣告庫的ID數(shù)量降為百級(jí)別,在這個(gè)百級(jí)范圍內(nèi)會(huì)有一個(gè)精細(xì)的排序,完成后將廣告推送給用戶。整個(gè)推薦系統(tǒng)面臨著下面的幾大挑戰(zhàn),首先是數(shù)據(jù)來源多樣化,數(shù)據(jù)既有線上數(shù)據(jù)也有歷史落盤數(shù)據(jù)。其次是數(shù)據(jù)的格式多元化,包括用戶信息、Item信息、點(diǎn)擊率和圖像等數(shù)據(jù)的多元格式。然后是增量數(shù)據(jù)多,用戶請(qǐng)求頻繁,廣告庫也在不斷更新中。最后是訓(xùn)練任務(wù)多元化,整個(gè)推薦系統(tǒng)涉及到粗排、精排、圖像檢測(cè)和OCR等任務(wù)。為了解決上述問題,我們?cè)诰珳?zhǔn)排序任務(wù)上開發(fā)了一整套的軟件框架"智凌"(基于TensorFlow)來滿足訓(xùn)練需求。
"智凌"框架結(jié)構(gòu)如圖10所示,該框架最底層C++ core封裝了MQ receiver和深度學(xué)習(xí)框架的一些OP類,最典型的是TensorFlow的dataset類,通過封裝tensorflow的dataset類來提供從MQ獲取數(shù)據(jù)的能力。數(shù)據(jù)抽象和處理在C++和Python上完成。然后是深度學(xué)習(xí)的framework(tensorflow)層提供各種深度學(xué)習(xí)的庫。最后是具體的應(yīng)用模型如DSSM、VLAD和一些圖像算法的模型等。"智凌"軟件框架具有算法封裝完整、開發(fā)新模型較快、數(shù)據(jù)和算法隔離解耦較好、預(yù)處理邏輯方便修改和更新及兼容性好等優(yōu)點(diǎn),但同時(shí)對(duì)于Tensorflow框架侵入性修改多、單機(jī)多卡性能差、多機(jī)分布式不支持、算法和OP層面優(yōu)化不夠完全等缺點(diǎn)。圖11是"智凌"在基礎(chǔ)數(shù)據(jù)上的訓(xùn)練流程圖,從圖中看到從消息中間件中讀取數(shù)據(jù)到本地的DataQueue中,DataQueue給每個(gè)在GPU節(jié)點(diǎn)上的模型分發(fā)Batch數(shù)據(jù)然后進(jìn)行訓(xùn)練,訓(xùn)練完成后讀取到CPU進(jìn)行梯度融合和備份然后分發(fā)給各個(gè)GPU進(jìn)行再訓(xùn)練,這種設(shè)計(jì)是面向單機(jī)結(jié)構(gòu)的設(shè)計(jì),CPU去實(shí)現(xiàn)梯度的融合和優(yōu)化器的功能,CPU資源消耗大,這種設(shè)計(jì)很不合理,針對(duì)這種情況我們做了很多的優(yōu)化后面會(huì)向大家介紹。

2. 騰訊的廣告推薦系統(tǒng)中的模型
DSSM增強(qiáng)語義模型如圖12,在這里我們用該模型來計(jì)算用戶和推薦ID之間的相關(guān)性并在此基礎(chǔ)上計(jì)算用戶對(duì)給定推薦ID的點(diǎn)擊率,相關(guān)性和點(diǎn)擊率計(jì)算公式分別是:


DSSM模型較為簡(jiǎn)單,分為Quey Id和Item Id并表達(dá)為低維語義向量,然后通過余弦距離來計(jì)算兩個(gè)語義向量之間的距離。通過模型計(jì)算Query和Item之間的相關(guān)性,打分最高點(diǎn)就是我們要推薦的Item, 廣告推薦系統(tǒng)中的DSSM模型要支持以下一些新的需求點(diǎn):
ID類特征維度億級(jí)別;
變化快,每周有25%是新條目,支持增量訓(xùn)練。
VLAD/NetVLAD/NeXtVLAD等模型我們主要用來判斷兩個(gè)廣告之間的距離關(guān)系,傳統(tǒng)的VLAD可以理解為一個(gè)聚類合并的模型,其向量計(jì)算公式為:

NeXtVLAD如圖13則通過將ak符號(hào)函數(shù)變成一個(gè)可導(dǎo)函數(shù)來得到一個(gè)更好距離效果,NeXtVLAD的向量計(jì)算公式為:

其中,
。
YOLO V3如圖14是圖像處理模型,在這里我們將其應(yīng)用在OCR業(yè)務(wù)最前端做初檢,它的特點(diǎn)是圖片輸入尺寸大(608*608,1024*1024),也因此YOLO模型的Loss部分占據(jù)比較大的計(jì)算。

1. 數(shù)據(jù)流優(yōu)化
前面的介紹中我們知道"智凌"軟件框架是單管道數(shù)據(jù)流,現(xiàn)在我們將其優(yōu)化為多管道如圖15所示,即通過多機(jī)多數(shù)據(jù)流來解決單機(jī)IO瓶頸問題。原來的單管道數(shù)據(jù)中會(huì)有DataQueue,如果數(shù)據(jù)流很大會(huì)對(duì)IO造成很大的壓力,優(yōu)化為多對(duì)管道后為每一個(gè)訓(xùn)練進(jìn)程GPU定義了一個(gè)DataQueue,通過這種分布式方法來有效解決IO瓶頸問題。這種情況下的管理工作是通過Angel PS(AllReduce版本)進(jìn)程控制器來進(jìn)行管理的。
2. Embedding計(jì)算優(yōu)化
Embedding Lookup過程常會(huì)碰到如果在hash之前進(jìn)行SparseFillEmptyRows操做會(huì)對(duì)空行填充默認(rèn)值,增加過多的字符串操做,優(yōu)化后我們先做hash操做然后再做SparseFillEmptyRows操做,去除耗時(shí)過多的字符串操作 ( 百萬級(jí)別 ),節(jié)省CPU算力來提升QPS,此優(yōu)化單卡性能約有6%的提升。
3. 模型算法層面優(yōu)化
YOLO的Loss計(jì)算量較大,我們對(duì)其進(jìn)行了特殊的優(yōu)化。YOLO模型有三個(gè)Feature map層,傳統(tǒng)尋找正負(fù)樣本的時(shí)候,真正的Bounding box會(huì)在Feature map上會(huì)做一個(gè)遍歷比較,先橫向遍歷然后再縱向遍歷,遍歷的過程中尋找Feature map點(diǎn)和Bounding box IOU最大的值作為正樣本。因?yàn)閳D像的size很大,所以Feature map也很大,這使計(jì)算Loss耗時(shí)過長(zhǎng)。計(jì)算Loss優(yōu)化方法如下,由于x軸方向上的塊和y軸方向上的塊關(guān)于對(duì)角線對(duì)稱,所以我們計(jì)算Feature map和Bounding box 的IOU的時(shí)候按照中軸線對(duì)角點(diǎn)方向進(jìn)行遍歷如圖16所示。先計(jì)算對(duì)角線方向上的的塊,然后再計(jì)算每個(gè)feature map塊兩邊的塊。這種優(yōu)化方法可減少大量的計(jì)算量。另外,在某個(gè)點(diǎn)上向兩邊遍歷所有的Feature map塊的時(shí)候有一些計(jì)算技巧特點(diǎn),比如往右上開始遍歷的時(shí)候,x軸與y軸是關(guān)于對(duì)角線對(duì)稱變化的,我們可以預(yù)估這種變化,從而有意識(shí)地去尋找最大的Anchor位置,然后丟棄其他信息,通過這樣的優(yōu)化方法也可以大量的減少計(jì)算量。我么通過上述方法優(yōu)化了Loss計(jì)算之后單卡性能有約10%的提升。
通過在模型層面和數(shù)據(jù)層面的優(yōu)化,以及Angel平臺(tái)應(yīng)用到整個(gè)控制流程中,DSSM的單卡性能有33倍的提升,VLAD有22倍的提升,YOLO有2.5倍的提升如圖17所示。圖18、19、20是詳細(xì)測(cè)評(píng)結(jié)果,它們有三種類型的測(cè)試模式,分別是訓(xùn)練數(shù)據(jù)通過TDbank(騰訊自研的MQ系統(tǒng))線上拉取(時(shí)延包括網(wǎng)絡(luò)傳輸、數(shù)據(jù)packing等);本地?cái)?shù)據(jù)讀取,訓(xùn)練數(shù)據(jù)預(yù)先存放本地磁盤(時(shí)延包括磁盤IO,數(shù)據(jù)映射預(yù)處理);Benchmark模式訓(xùn)練數(shù)據(jù)放內(nèi)存(時(shí)延僅包括數(shù)據(jù)映射預(yù)處理)。從圖18中看到Benchmark不考慮數(shù)據(jù)讀取前的延時(shí)基本能把整個(gè)系統(tǒng)計(jì)的算能力跑滿這是一個(gè)準(zhǔn)線性地提升。考慮到實(shí)際的數(shù)據(jù)是從MQ中讀取,在1卡中提升不大TPS為3000多,2卡QPS為4000多,兩機(jī)兩卡TPS達(dá)到6000多,所以隨著多機(jī)越多,訓(xùn)練性能達(dá)到線性的提升, VLAD-CTR模型的測(cè)試具有相同的結(jié)果。YOLO V3優(yōu)化后1機(jī)1卡有2.5倍的性能提升,1機(jī)8卡有7.2倍的提升。
今天主要和大家分享了三部分的內(nèi)容,第一部分內(nèi)容是介紹了騰訊的Angel機(jī)器學(xué)習(xí)平臺(tái)和其在深度學(xué)習(xí)方向上的拓展和應(yīng)用,第二部分的內(nèi)容是介紹了騰訊廣告推薦系統(tǒng)的特點(diǎn)和常用模型,最后一部分的內(nèi)容介紹了Angel深度學(xué)習(xí)在騰訊廣告推薦系統(tǒng)中的應(yīng)用,模型訓(xùn)練和優(yōu)化,以及取得的效果。
嘉賓介紹:

郭躍超
騰訊?|?應(yīng)用研究員
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:
長(zhǎng)按訂閱更多精彩▼
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!





