ITBear旗下自媒體矩陣:

單機(jī)訓(xùn)練速度提升640倍!獨(dú)家解讀快手商業(yè)廣告模型GPU訓(xùn)練平臺(tái)Persia

   時(shí)間:2019-06-26 17:26:21 來(lái)源:AI前線(xiàn)作者:快手FeDA智能決策實(shí)驗(yàn)室編輯:星輝 發(fā)表評(píng)論無(wú)障礙通道

【導(dǎo)讀】:近期,快手宣布將在2020年春節(jié)前實(shí)現(xiàn)3億DAU,快手商業(yè)化營(yíng)收步伐也隨之加速??焓謴?018年“商業(yè)化元年”開(kāi)始推行個(gè)性化的廣告推薦。截止5月底,快手DAU已經(jīng)突破2億。隨著用戶(hù)和使用時(shí)長(zhǎng)的迅速增長(zhǎng),為了更好地挖掘海量用戶(hù)和實(shí)時(shí)數(shù)據(jù)的核心價(jià)值,推薦模型需要快速迭代,從而對(duì)用戶(hù)興趣遷移的做出迅捷的反應(yīng)。因此,模型訓(xùn)練效率成為連接商業(yè)效率和用戶(hù)興趣的關(guān)鍵一環(huán)。

作者:快手FeDA智能決策實(shí)驗(yàn)室

來(lái)源:AI前線(xiàn)(微信ID:ai-front)

基于歷史原因,行業(yè)內(nèi)推薦模型的訓(xùn)練大都通過(guò)CPU來(lái)實(shí)現(xiàn)。然而隨著模型從Logistic Regression到深度神經(jīng)網(wǎng)絡(luò)的演化以及硬件的發(fā)展,基于CPU的訓(xùn)練系統(tǒng)或許已經(jīng)不再是最合適的解決方案了。本著不盲從、不抄襲、堅(jiān)持原創(chuàng)技術(shù)路線(xiàn)的原則,快手西雅圖FeDA智能決策實(shí)驗(yàn)室推出了名為"Persia"的基于GPU的廣告推薦訓(xùn)練系統(tǒng)。以往需要50臺(tái)CPU機(jī)器訓(xùn)練20小時(shí)的系統(tǒng),如今只需要一臺(tái)普通的GPU機(jī)器在一到兩小時(shí)完成,單機(jī)效率提升高達(dá)640倍。這意味著:

· 以往使用五十臺(tái)計(jì)算機(jī),一天只能?chē)L試一個(gè)新想法,新系統(tǒng)只需一臺(tái)計(jì)算機(jī),一兩個(gè)小時(shí)就能?chē)L試一個(gè)新想法。

· 以往同時(shí)只能有一兩個(gè)同學(xué)嘗試新模型,新系統(tǒng)可以讓很多同學(xué)同時(shí)嘗試各自的新想法。

這套系統(tǒng)已經(jīng)在快手商業(yè)化內(nèi)部迅速推廣使用,讓大家可以快速試錯(cuò)和測(cè)試新模型以及特征。項(xiàng)目發(fā)起者是一位來(lái)自羅切斯特大學(xué)的實(shí)習(xí)生。他提出的GPU解決方案得到他在羅切斯特大學(xué)的導(dǎo)師、FeDA智能決策實(shí)驗(yàn)室負(fù)責(zé)人劉霽和公司內(nèi)很多算法策略專(zhuān)家的肯定。

FeDA實(shí)驗(yàn)室隨即成立了項(xiàng)目組,并決定以項(xiàng)目發(fā)起人最喜愛(ài)的漫畫(huà)角色Persia(“佩爾西亞”)命名,展開(kāi)了緊鑼密鼓的開(kāi)發(fā)。團(tuán)隊(duì)首先以PyTorch為基礎(chǔ)平臺(tái)著手解決各種技術(shù)難題,然后實(shí)現(xiàn)并優(yōu)化TensorFlow版本。經(jīng)過(guò)4個(gè)月的開(kāi)發(fā)和通力合作,Persia GPU廣告訓(xùn)練系統(tǒng)初步成型。系統(tǒng)同時(shí)支持PyTorch和TensorFlow兩套方案,以方便模型開(kāi)發(fā)同學(xué)的不同偏好。目前,Persia已支持多個(gè)業(yè)務(wù)項(xiàng)目,每位研發(fā)人員只需要一臺(tái)機(jī)器便可以迅速地迭代試錯(cuò)。

快手AI概覽

Persia背后的技術(shù)

Persia實(shí)現(xiàn)高效訓(xùn)練背后的技術(shù)包含GPU分布式訓(xùn)練、高速數(shù)據(jù)讀取等多個(gè)方面。

一、 GPU 分布式運(yùn)算加速模型訓(xùn)練效率

近年來(lái),GPU訓(xùn)練已在圖像識(shí)別、文字處理等應(yīng)用上取得巨大成功。GPU訓(xùn)練以其在卷積等數(shù)學(xué)運(yùn)算上的獨(dú)特效率優(yōu)勢(shì),極大地提升了訓(xùn)練機(jī)器學(xué)習(xí)模型,尤其是深度神經(jīng)網(wǎng)絡(luò)的速度。然而,在廣告模型中,由于大量的稀疏樣本存在(比如用戶(hù)id),每個(gè)id在模型中都會(huì)有對(duì)應(yīng)的Embedding向量,因此廣告模型常常體積十分巨大,以至于單GPU無(wú)法存下模型。目前往往將模型存在內(nèi)存中,由CPU進(jìn)行這部分巨大的Embedding層的運(yùn)算操作。這既限制了訓(xùn)練的速度,又導(dǎo)致實(shí)際生產(chǎn)中無(wú)法使用比較復(fù)雜的模型——因?yàn)槭褂脧?fù)雜模型會(huì)導(dǎo)致CPU對(duì)給定輸入計(jì)算時(shí)間過(guò)長(zhǎng),無(wú)法及時(shí)響應(yīng)請(qǐng)求。

廣告模型的構(gòu)成:在廣告模型中,模型往往由下圖中的三部分構(gòu)成:

l 用戶(hù)id、廣告id 等構(gòu)成的Embedding層。每個(gè)id對(duì)應(yīng)一個(gè)預(yù)設(shè)大小的向量,由于id數(shù)量往往十分巨大,這些向量常常會(huì)占據(jù)整個(gè)模型體積的99%以上。假設(shè)我們有m1種這樣的id: {idi}i=1m1,它們對(duì)應(yīng)的Embedding層 {Ei}i=1m1將會(huì)輸出m1個(gè)向量:{Ei(idi)}i=1 m1。

l 圖像信息、LDA等實(shí)數(shù)向量特征。這部分將會(huì)與id對(duì)應(yīng)的Embedding vector 組合在一起,輸入到DNN中預(yù)測(cè)點(diǎn)擊率等。假設(shè)我們有m2種這樣的向量:{densei}i=1m2。

l DNN。這部分是一個(gè)傳統(tǒng)神經(jīng)網(wǎng)絡(luò),接受Embedding vector和實(shí)數(shù)向量特征,輸出點(diǎn)擊率等希望預(yù)測(cè)的量:prediction=DNN([E1(idi),E2(id2),…,Em1(idm1),dense1,dense2,…,densem2])。

Persia使用多種技術(shù)訓(xùn)練廣告模型,我們將在接下來(lái)幾節(jié)依次介紹。

1. 大模型Embedding分片訓(xùn)練

廣告模型的Embedding部分占模型體積和計(jì)算量的大部分。很有可能無(wú)法放入單個(gè)GPU的顯存中。為了使用GPU運(yùn)算以解決CPU運(yùn)算速度過(guò)慢的問(wèn)題,但又不受制于單GPU顯存對(duì)模型大小的限制,Persia系統(tǒng)使用多GPU分散存儲(chǔ)模型,每個(gè)GPU只存儲(chǔ)模型一部分,并進(jìn)行多卡協(xié)作查找Embedding向量訓(xùn)練模型的模式。

Persia將第i個(gè)Embedding層Ei 放入第 (i%總顯卡數(shù)) 個(gè)顯卡中,從而使每個(gè)顯卡只存放部分Embedding。與此同時(shí),實(shí)數(shù)向量特征和DNN部分則置于第0個(gè)顯卡中。在使用Persia時(shí),它將自動(dòng)在各個(gè)顯卡中計(jì)算出 {Ei}i=1m1的值(如果對(duì)于一個(gè)Embedding輸入了多個(gè)id,則計(jì)算其中每個(gè)值對(duì)應(yīng)的Embedding vector的平均),并傳送給第0個(gè)顯卡。第0個(gè)顯卡會(huì)合并這些Embedding vector和實(shí)數(shù)向量特征,輸入DNN中進(jìn)行預(yù)測(cè)。

當(dāng)求解梯度時(shí),第0個(gè)顯卡會(huì)將各個(gè)Embedding層輸出處的導(dǎo)數(shù)傳回各個(gè)顯卡,各個(gè)顯卡各自負(fù)責(zé)各自Embedding的反向傳播算法求梯度。大致結(jié)構(gòu)如下圖所示:

GPU分配的負(fù)載均衡:由于將 Embedding 依次分配在每個(gè)GPU上,可能導(dǎo)致部分GPU負(fù)載顯著高于其他GPU,為了讓每個(gè)GPU都能充分發(fā)揮性能,Persia訓(xùn)練系統(tǒng)還支持對(duì)Embedding運(yùn)算在GPU上進(jìn)行負(fù)載均衡。

給定k個(gè)GPU,當(dāng)模型的m1 個(gè)Embedding層對(duì)應(yīng)GPU負(fù)載分別為 l1,l2,…,lm1,Persia將會(huì)嘗試將Embedding分為k 組S1,S2,…,Sk,并分別存放在對(duì)應(yīng)GPU 上,使得每組∑i∈Sjli,∀j 大致相等。這等價(jià)于如下優(yōu)化問(wèn)題:

minS1,…,SkVariancej[∑i∈Sjli],

s.t. ∑i∈SjVi≤C,

其中Vi 是第i個(gè)模型的大小,C是單個(gè)GPU的顯存大小。Persia使用貪心算法得到該問(wèn)題的一個(gè)近似解,并依此將不同Embedding均勻分散在不同GPU上,以達(dá)到充分利用GPU的目的。當(dāng)需要精確求解最優(yōu)的Embedding放置位置時(shí),Persia還可以通過(guò)integer optimization給出精確解。

2. 簡(jiǎn)化小模型多 GPU 分布訓(xùn)練

當(dāng)模型大小可以放入單個(gè)GPU時(shí),Persia也支持切換為目前在圖像識(shí)別等任務(wù)中流行的AllReduce分布訓(xùn)練模式。這樣不僅可以使訓(xùn)練算法更加簡(jiǎn)單,在某些情景下還可以加快訓(xùn)練速度。

使用這種訓(xùn)練模式時(shí),每個(gè)GPU都會(huì)擁有一個(gè)同樣的模型,各自獲取樣本進(jìn)行梯度計(jì)算。在梯度計(jì)算后,每個(gè)GPU只更新自己顯存中的模型。需要注意的是即使模型可以置于一個(gè)GPU的顯存中,往往Embedding部分也比較大,如果每次更新都同步所有GPU上的模型,會(huì)大大拖慢運(yùn)算速度。因此Persia在AllReduce模式下,每次更新模型后,所有GPU使用AllReduce同步DNN部分,而Embedding部分每隔幾個(gè)更新才同步一次。這樣,即不會(huì)損失太多信息,又保持了訓(xùn)練速度。

此外,在TensorFlow上,Persia還支持TensorFlow的"Replicated", "PS", "PS" + "Asynchronous" 模式多卡訓(xùn)練,它們的主要區(qū)別如下圖:

二、 模型準(zhǔn)確度提升

同步更新:由于普遍使用的傳統(tǒng)異步 SGD 有梯度的延遲問(wèn)題,若有n臺(tái)計(jì)算機(jī)參與計(jì)算,每臺(tái)計(jì)算機(jī)的梯度的計(jì)算實(shí)際上基于n個(gè)梯度更新之前的模型。在數(shù)學(xué)上,對(duì)于第t步的模型xt,傳統(tǒng)異步SGD的更新為:

xt+1←xt−learning rate×g(xt−τt),

其中g(shù)(xt−τt)是訓(xùn)練樣本的損失函數(shù)在τt 個(gè)更新之前的模型上的梯度。而 τt 的大小一般與計(jì)算機(jī)數(shù)量成正比,當(dāng)計(jì)算機(jī)數(shù)量增多,xt−τt 與 xt 相差就越大,不可避免地導(dǎo)致模型質(zhì)量的降低。Persia的訓(xùn)練模式在Embedding分片存儲(chǔ)時(shí)沒(méi)有這種延遲問(wèn)題,而在AllReduce模式下也僅在Embedding層有常數(shù)量級(jí)的延遲,因此模型質(zhì)量也有所提升。

優(yōu)化算法:與此同時(shí),Persia還可以使用Adam等momentum optimizer,并為其實(shí)現(xiàn)了sparse版本的更新方式,比PyTorch/TensorFlow內(nèi)置的dense版本更新在廣告任務(wù)上快3x-5x。這些算法在很多時(shí)候可以在同樣時(shí)間內(nèi)得到比使用 SGD或Adagrad更好的模型。

三、 訓(xùn)練數(shù)據(jù)分布式實(shí)時(shí)處理

快手Persia的高速GPU訓(xùn)練,需要大量數(shù)據(jù)實(shí)時(shí)輸入到訓(xùn)練機(jī)中,由于不同模型對(duì)樣本的需求不同,對(duì)于每個(gè)新實(shí)驗(yàn)需要的數(shù)據(jù)格式可能也不同。因此 Persia需要:

· 簡(jiǎn)單靈活便于修改的數(shù)據(jù)處理流程,

· 可以輕易并行的程序架構(gòu),

· 節(jié)約帶寬的數(shù)據(jù)傳輸方式。

為此,Persia系統(tǒng)實(shí)現(xiàn)了基于Hadoop集群的實(shí)時(shí)數(shù)據(jù)處理系統(tǒng),可以應(yīng)不同實(shí)驗(yàn)需求從HDFS中使用任意多計(jì)算機(jī)分布式讀取數(shù)據(jù)進(jìn)行多級(jí)個(gè)性化處理傳送到訓(xùn)練機(jī)。傳輸使用高效消息隊(duì)列,并設(shè)置多級(jí)緩存。傳輸過(guò)程實(shí)時(shí)進(jìn)行壓縮以節(jié)約帶寬資源。

1. 并行數(shù)據(jù)處理

數(shù)據(jù)處理pipeline:為了使Persia獲取數(shù)據(jù)的方式更靈活,Persia使用dataflow構(gòu)建數(shù)據(jù)處理pipeline。在Persia中可以定義每一步處理,相當(dāng)于一個(gè)函數(shù),輸入為上一個(gè)處理步驟的輸出,輸出提供給下一個(gè)處理步驟。我們定義這些函數(shù)為 {fi}i=1p。在Persia中,這些函數(shù)可以單獨(dú)定義修改。在每個(gè)函數(shù)的入口和出口,Persia有數(shù)據(jù)隊(duì)列緩存,以減少每個(gè)函數(shù)獲取下一個(gè)輸入的時(shí)間。這些函數(shù)的運(yùn)行可以完全并行起來(lái),這也是pipeline的主要目的。以在食堂就餐為例,pipeline的運(yùn)行就像這樣:

數(shù)據(jù)壓縮和傳輸:全部處理之后,數(shù)據(jù)處理任務(wù)會(huì)將數(shù)據(jù)組成mini-batch并使用zstandard高速壓縮每個(gè)batch,通過(guò)ZeroMQ將壓縮數(shù)據(jù)傳輸給訓(xùn)練機(jī)進(jìn)行訓(xùn)練。定義batching操作為函數(shù) B,壓縮操作為函數(shù)C,則每個(gè)數(shù)據(jù)處理任務(wù)相當(dāng)于一個(gè)函數(shù)C(B(fp(fp−1(?f1(raw data from HDFS))))) 。

Queue server:在Hadoop集群中Persia將啟動(dòng)多個(gè)數(shù)據(jù)處理任務(wù),每個(gè)數(shù)據(jù)處理任務(wù)之間完全獨(dú)立。數(shù)據(jù)處理任務(wù)本身并不知道處理哪些數(shù)據(jù),而是通過(guò)請(qǐng)求訓(xùn)練機(jī)得知訓(xùn)練數(shù)據(jù)的位置。這樣的好處是,在Persia中訓(xùn)練機(jī)可以應(yīng)自己需求動(dòng)態(tài)控制使用什么樣的訓(xùn)練數(shù)據(jù),而數(shù)據(jù)處理任務(wù)相當(dāng)于一個(gè)無(wú)狀態(tài)的服務(wù),即使訓(xùn)練機(jī)更換了新的訓(xùn)練任務(wù)也不需要重啟數(shù)據(jù)處理任務(wù)。具體來(lái)說(shuō),在Persia中訓(xùn)練機(jī)會(huì)啟動(dòng)一個(gè)queue server進(jìn)程,該queue server將會(huì)應(yīng)數(shù)據(jù)處理任務(wù)的請(qǐng)求返回下一個(gè)需要讀取的數(shù)據(jù)文件。Persia的每個(gè)數(shù)據(jù)處理任務(wù)會(huì)同時(shí)從queue server請(qǐng)求多個(gè)文件,并行從HDFS讀取這些文件。

整個(gè)系統(tǒng)的構(gòu)造如下圖:

2. 實(shí)時(shí)訓(xùn)練

由于Persia的數(shù)據(jù)處理任務(wù)在獲取數(shù)據(jù)時(shí)完全依賴(lài)于訓(xùn)練機(jī)的指示,Persia支持對(duì)剛剛生成的數(shù)據(jù)進(jìn)行在線(xiàn)訓(xùn)練的場(chǎng)景,只需要使queue server返回最近生成的數(shù)據(jù)文件即可。因此,Persia在訓(xùn)練時(shí)的數(shù)據(jù)讀取模式上非常靈活,對(duì)queue server非常簡(jiǎn)單的修改即可支持任意數(shù)據(jù)讀取的順序,甚至可以一邊訓(xùn)練一邊決定下一步使用什么數(shù)據(jù)。

3. 更快的數(shù)據(jù)讀取速度:訓(xùn)練機(jī)共享內(nèi)存讀取數(shù)據(jù)

由于訓(xùn)練機(jī)要同時(shí)接收從不同數(shù)據(jù)處理任務(wù)發(fā)送來(lái)的大量數(shù)據(jù),并進(jìn)行解壓縮和傳輸給訓(xùn)練進(jìn)程進(jìn)行實(shí)際訓(xùn)練的操作,接收端必須能夠進(jìn)行并行解壓和高速數(shù)據(jù)傳輸。為此,Persia使用ZeroMQ device接收多個(gè)任務(wù)傳輸而來(lái)的壓縮數(shù)據(jù),并使用多個(gè)解壓進(jìn)程讀取該device。每個(gè)解壓進(jìn)程獨(dú)立進(jìn)行解壓,并與訓(xùn)練進(jìn)程共享內(nèi)存。當(dāng)結(jié)束解壓后,解壓進(jìn)程會(huì)將可以直接使用的batch樣本放入共享內(nèi)存中,訓(xùn)練任務(wù)即可直接使用該batch進(jìn)行訓(xùn)練,而無(wú)需進(jìn)一步的序列化反序列化操作。

訓(xùn)練效果

Persia系統(tǒng)在單機(jī)上目前實(shí)現(xiàn)了如下訓(xùn)練效果:

· 數(shù)據(jù)大小:百T數(shù)據(jù)。

· 樣本數(shù)量:25億訓(xùn)練樣本。

· 8卡V100計(jì)算機(jī),25Gb帶寬:總共1小時(shí)訓(xùn)練時(shí)間,每秒64萬(wàn)樣本。

· 8卡1080Ti計(jì)算機(jī),10Gb帶寬:總共不到2小時(shí)訓(xùn)練時(shí)間,每秒40萬(wàn)樣本。

· 4卡1080Ti達(dá)30萬(wàn)樣本/秒,2卡1080Ti達(dá)20萬(wàn)樣本/秒。

· Persia同樣數(shù)據(jù)上Test AUC高于原ASGD CPU平臺(tái)。

· Persia支持很大batch size,例如25k。

綜上,Persia不僅訓(xùn)練速度上遠(yuǎn)遠(yuǎn)超過(guò)CPU平臺(tái),并且大量節(jié)省了計(jì)算資源,使得同時(shí)嘗試多種實(shí)驗(yàn)變得非常方便。

展望:分布式多機(jī)訓(xùn)練

未來(lái),Persia系統(tǒng)將展開(kāi)分布式多GPU計(jì)算機(jī)訓(xùn)練。有別于成熟的計(jì)算機(jī)視覺(jué)等任務(wù),由于在廣告任務(wù)中模型大小大為增加,傳統(tǒng)分布式訓(xùn)練方式面臨計(jì)算機(jī)之間的同步瓶頸會(huì)使訓(xùn)練效率大為降低。Persia系統(tǒng)將支持通訊代價(jià)更小、系統(tǒng)容災(zāi)能力更強(qiáng)的去中心化梯度壓縮訓(xùn)練算法。據(jù)快手FeDA智能決策實(shí)驗(yàn)室負(fù)責(zé)人劉霽介紹,該算法結(jié)合新興的異步去中心化訓(xùn)練 (Asynchronous decentralized parallel stochastic gradient descent, ICML 2018) 和梯度壓縮補(bǔ)償算法 (Doublesqueeze: parallel stochastic gradient descent with double-pass error-compensated compression, ICML 2019),并有嚴(yán)格理論保證,快手Persia系統(tǒng)在多機(jī)情景下預(yù)計(jì)還將在單機(jī)基礎(chǔ)上做到數(shù)倍到數(shù)十倍效率提升。

舉報(bào) 0 收藏 0 打賞 0評(píng)論 0
 
 
更多>同類(lèi)資訊
全站最新
熱門(mén)內(nèi)容
網(wǎng)站首頁(yè)  |  關(guān)于我們  |  聯(lián)系方式  |  版權(quán)聲明  |  網(wǎng)站留言  |  RSS訂閱  |  違規(guī)舉報(bào)  |  開(kāi)放轉(zhuǎn)載  |  滾動(dòng)資訊  |  English Version