- 《架構(gòu)師》2018年7月
- InfoQ中文站
- 9298字
- 2019-01-09 14:05:38
獨(dú)家揭秘:騰訊千億級(jí)參數(shù)分布式ML系統(tǒng)無(wú)量背后的秘密

AI前線導(dǎo)讀:千億參數(shù)規(guī)模的模型已經(jīng)被業(yè)界證明能夠有效提高業(yè)務(wù)效果。如何高效訓(xùn)練出這樣的模型?百GB級(jí)別的模型如何在線上實(shí)現(xiàn)毫秒級(jí)的響應(yīng)?這些能力在各個(gè)大廠都被視為核心技術(shù)競(jìng)爭(zhēng)力和機(jī)器學(xué)習(xí)能力的技術(shù)壁壘。要具備這樣的能力,對(duì)相關(guān)系統(tǒng)有什么樣的挑戰(zhàn)?本文將從系統(tǒng)的角度去詳細(xì)分析這些問(wèn)題,并給出騰訊公司的無(wú)量系統(tǒng)對(duì)這些問(wèn)題的解答。
簡(jiǎn)介
在互聯(lián)網(wǎng)場(chǎng)景中,億級(jí)的用戶每天產(chǎn)生著百億規(guī)模的用戶數(shù)據(jù),形成了超大規(guī)模的訓(xùn)練樣本。如何利用這些數(shù)據(jù)訓(xùn)練出更好的模型并用這些模型為用戶服務(wù),給機(jī)器學(xué)習(xí)平臺(tái)帶來(lái)了巨大的挑戰(zhàn)。下面以網(wǎng)頁(yè)/圖文/視頻推薦場(chǎng)景分析這些挑戰(zhàn),下文中均稱為推薦場(chǎng)景。
1.樣本數(shù)量大。在推薦場(chǎng)景下,每天的樣本量可以達(dá)到百億量級(jí)。如果需要按一個(gè)月的樣本進(jìn)行訓(xùn)練,樣本量會(huì)在千億級(jí)別。如果每個(gè)樣本平均500特征值,單個(gè)樣本的大小就是5KB左右,一千億樣本的大小就是500TB。即便只使用一周內(nèi)的樣本,樣本數(shù)據(jù)的大小也在100TB這個(gè)級(jí)別。
2.特征維度多。巨大的樣本量使高維度模型的訓(xùn)練成為可能。為了給用戶提供更合理的推薦結(jié)果,需要對(duì)用戶和被推薦的文章/圖片/視頻進(jìn)行詳細(xì)的描述。各個(gè)業(yè)務(wù)都會(huì)建立起豐富的用戶模型,也會(huì)對(duì)文章/圖片/視頻進(jìn)行多維度的標(biāo)注。
3.在系統(tǒng)進(jìn)行推薦時(shí),還會(huì)使用到用戶現(xiàn)在的上下文信息,比如:時(shí)間,位置,之前瀏覽的頁(yè)面等。當(dāng)這些特征被引入到模型中時(shí),會(huì)導(dǎo)致特征規(guī)模的迅速增加。如果再考慮交叉等特征轉(zhuǎn)換操作,模型的特征維度會(huì)輕松地膨脹到千億甚至萬(wàn)億級(jí)別。
訓(xùn)練性能要求高。我們面對(duì)的是百TB的樣本和百億/千億參數(shù)的模型。而業(yè)務(wù)需要在短時(shí)間內(nèi)訓(xùn)練出一個(gè)性能指標(biāo)好的模型,以便快速上線驗(yàn)證。這對(duì)機(jī)器學(xué)習(xí)平臺(tái)訓(xùn)練能力有很高的要求。
前面1~3點(diǎn),提出的是超大規(guī)模模型的訓(xùn)練框架面臨的挑戰(zhàn),然而訓(xùn)練出模型只是重要的第一步。最終模型需要上線為用戶提供服務(wù)才能體現(xiàn)其業(yè)務(wù)價(jià)值。對(duì)于以往的機(jī)器學(xué)習(xí)中的中小模型,模型上線服務(wù)并不是一個(gè)特別被關(guān)注的事情。但是,當(dāng)最終模型文件很大,甚至超過(guò)單機(jī)的內(nèi)存大小時(shí),模型上線服務(wù)就變成了棘手的問(wèn)題。
1)模型大但用戶需要毫秒級(jí)響應(yīng)。以最簡(jiǎn)單的LR模型為例,一個(gè)10億特征的模型的大小也會(huì)達(dá)到12GB(每個(gè)參數(shù)需要一個(gè)8Byte的key和4Byte的float value)。如果是DNN模型,模型大小到達(dá)TB也是可能的。當(dāng)訓(xùn)練好一個(gè)模型后,模型就被上線,為用戶提供預(yù)測(cè)服務(wù)。
為了達(dá)到良好的用戶體驗(yàn),預(yù)測(cè)服務(wù)的響應(yīng)時(shí)間需要在10ms這個(gè)量級(jí)。以手機(jī)用戶的推薦場(chǎng)景為例,從用戶在手機(jī)上刷新頁(yè)面到看到推薦結(jié)果,時(shí)間不能超過(guò)1s,扣除掉網(wǎng)絡(luò)通訊的開(kāi)銷,IDC內(nèi)在線服務(wù)的響應(yīng)時(shí)間需要控制在200ms以內(nèi)。但是,整個(gè)推薦的流程至少有召回,排序和展示控制三個(gè)階段。
在排序階段,需要對(duì)200個(gè)以上的文章進(jìn)行特征拼接和點(diǎn)擊率預(yù)估,所以模型對(duì)這200個(gè)文章進(jìn)行點(diǎn)擊率預(yù)估的總時(shí)間要在30ms以內(nèi)。如何使用這么大規(guī)模的模型進(jìn)行高性能,高并發(fā)的預(yù)測(cè)也對(duì)平臺(tái)能力的重大考驗(yàn)。
2)模型實(shí)時(shí)上線。對(duì)于資訊推薦類場(chǎng)景,用戶的關(guān)注點(diǎn)變化很快。系統(tǒng)需要根據(jù)最新的用戶行為數(shù)據(jù)調(diào)整模型,然后以最快的速度將如此大規(guī)模的模型更新到多個(gè)地區(qū)的在線預(yù)測(cè)服務(wù)。
為了解決以上挑戰(zhàn),我們:
1.開(kāi)發(fā)了一個(gè)基于參數(shù)服務(wù)器架構(gòu)的機(jī)器學(xué)習(xí)計(jì)算框架——無(wú)量框架,已經(jīng)能夠完成百億樣本/百億參數(shù)模型的小時(shí)級(jí)訓(xùn)練能力。無(wú)量框架提供多種機(jī)器學(xué)習(xí)算法,不但能進(jìn)行任務(wù)式的離線訓(xùn)練,還能支持以流式樣本為輸入的7*24小時(shí)的在線訓(xùn)練。
2.在無(wú)量框架的基礎(chǔ)上,我們構(gòu)建起自動(dòng)化模型管理系統(tǒng)——無(wú)量模型管理,模型能夠在離線訓(xùn)練任務(wù),在線訓(xùn)練集群和在線預(yù)測(cè)服務(wù)之間無(wú)縫地高效流轉(zhuǎn),實(shí)現(xiàn)10GB級(jí)模型的分鐘級(jí)上線。
3.為了提高大模型的線上預(yù)測(cè)服務(wù),我們還開(kāi)發(fā)了高性能的預(yù)測(cè)模塊和服務(wù)——無(wú)量預(yù)測(cè)服務(wù),對(duì)于數(shù)十GB的模型,只需幾毫秒即可完成100個(gè)樣本的預(yù)測(cè)。
無(wú)量框架,無(wú)量模型管理和無(wú)量預(yù)測(cè)服務(wù)共同構(gòu)成了無(wú)量系統(tǒng)的主要部分。下面我們將對(duì)無(wú)量系統(tǒng)的架構(gòu)和各個(gè)主要組成部分進(jìn)行詳細(xì)的介紹。
1.系統(tǒng)流程與架構(gòu)
工作流程在廣告/推薦等場(chǎng)景下,模型的生產(chǎn)和使用過(guò)程,大致分為幾個(gè)步驟:
1.日志采集與樣本生成。通過(guò)收集用戶的線上行為信息,生成模型需要的樣本。這些樣本可以被存儲(chǔ)起來(lái)用于離線訓(xùn)練,也可以使用流式數(shù)據(jù)的方式推送給在線訓(xùn)練集群。
2.模型訓(xùn)練。有了樣本之后,在訓(xùn)練集群中訓(xùn)練出具體的模型。開(kāi)發(fā)人員通過(guò)調(diào)整的超參數(shù)或模型結(jié)構(gòu)來(lái)獲取好的模型。
3.模型評(píng)估。在模型被放到線上服務(wù)之前,需要對(duì)模型進(jìn)行一些評(píng)估工作。
4.模型上線預(yù)測(cè)。無(wú)量系統(tǒng)目前包括以上步驟中的模型訓(xùn)練,模型評(píng)估和上線預(yù)測(cè)。

為了讓模型從訓(xùn)練集群到在線預(yù)測(cè)服務(wù)順利地流轉(zhuǎn),無(wú)量系統(tǒng)提供了模型管理功能,能夠自動(dòng)化地將從訓(xùn)練機(jī)器導(dǎo)出新模型到在線預(yù)測(cè)服務(wù)。業(yè)務(wù)也能夠在模型自動(dòng)化上線過(guò)程中定義模型評(píng)估操作,避免訓(xùn)練效果差的模型被放到在線預(yù)測(cè)服務(wù)中。另外當(dāng)模型上線之后,也需要驗(yàn)證線上的模型是否有問(wèn)題。
在模型的開(kāi)發(fā)過(guò)程中,超參數(shù)調(diào)試耗費(fèi)了模型開(kāi)發(fā)人員大量的時(shí)間。無(wú)量系統(tǒng)通過(guò)與般若系統(tǒng)結(jié)合,實(shí)現(xiàn)了模型訓(xùn)練效果的實(shí)時(shí)監(jiān)控,為自動(dòng)化調(diào)參提供了決策數(shù)據(jù)。無(wú)量系統(tǒng)正在進(jìn)行自動(dòng)調(diào)參工具的開(kāi)發(fā)。算法人員也可以基于這些數(shù)據(jù)上實(shí)現(xiàn)自定義自動(dòng)調(diào)參功能。
系統(tǒng)架構(gòu)
在一個(gè)機(jī)器學(xué)習(xí)系統(tǒng)中,機(jī)器學(xué)習(xí)算法的代碼只是訓(xùn)練或預(yù)測(cè)過(guò)程中非常小的一部分。以下是Google對(duì)其機(jī)器學(xué)習(xí)系統(tǒng)的一個(gè)統(tǒng)計(jì)。

[1] Hidden Technical Debt in Machine Learning Systems, Google.
為了讓機(jī)器學(xué)習(xí)任務(wù)運(yùn)行起來(lái),需要大量的配套服務(wù)設(shè)施的支持,包括數(shù)據(jù)管理與存儲(chǔ),訓(xùn)練框架,在線預(yù)測(cè)框架和資源管理等多個(gè)模塊。無(wú)量系統(tǒng)的系統(tǒng)架構(gòu)如下所示:

系統(tǒng)架構(gòu)圖
無(wú)量系統(tǒng)的訓(xùn)練任務(wù)運(yùn)行在MIG專門(mén)針對(duì)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)任務(wù)的般若調(diào)度系統(tǒng)上,在線訓(xùn)練集群和在線預(yù)測(cè)服務(wù)部署在Sumeru系統(tǒng)上。般若系統(tǒng)和Sumeru系統(tǒng)均是基于docker容器化技術(shù)構(gòu)建,為無(wú)量系統(tǒng)的快速部署和擴(kuò)展提供了可靠的基礎(chǔ)設(shè)施保障。
下層存儲(chǔ)系統(tǒng)支持HDFS和ceph兩種分布式網(wǎng)絡(luò)存儲(chǔ)。HDFS作為常用的分布式網(wǎng)絡(luò)存儲(chǔ),與其他的數(shù)據(jù)分析系統(tǒng)無(wú)縫對(duì)接。Ceph以其高性能與靈活的文件操作,彌補(bǔ)了Hdfs在文件操作上的不便。
日志采集使用MIG的燈塔系統(tǒng),并配合了自研的流式數(shù)據(jù)處理服務(wù)實(shí)時(shí)生成訓(xùn)練樣本。
通過(guò)自研的基于參數(shù)服務(wù)器架構(gòu)的無(wú)量計(jì)算框架,無(wú)量系統(tǒng)支持了千億級(jí)模型的任務(wù)型離線訓(xùn)練和流式在線訓(xùn)練。無(wú)量計(jì)算框架采用C++實(shí)現(xiàn)以達(dá)到優(yōu)異的性能,并支持了推薦和搜索場(chǎng)景常用的LR/FM/FFM/DNN等模型,用戶只需做簡(jiǎn)單的配置即可實(shí)現(xiàn)超大規(guī)模模型的訓(xùn)練。
對(duì)于千億級(jí)參數(shù)的模型,模型大小至少會(huì)有幾十GB。無(wú)量系統(tǒng)為業(yè)務(wù)的在線預(yù)測(cè)服務(wù)提供了兩種模型使用模式:
? 模型服務(wù)組件。模型服務(wù)組件包含了模型版本管理和模型預(yù)測(cè)兩個(gè)主要功能。由于模型服務(wù)組件對(duì)內(nèi)存管理進(jìn)行深度優(yōu)化,業(yè)務(wù)能夠在自己的預(yù)測(cè)服務(wù)中直接加載和使用100G以下的模型。
? 模型存儲(chǔ)服務(wù)。當(dāng)模型大小超過(guò)單機(jī)能夠存放的大小時(shí),就需要分布式的模型存儲(chǔ)服務(wù)來(lái)進(jìn)行模型管理和提供預(yù)測(cè)服務(wù)。
在樣本生成,模型訓(xùn)練,在線預(yù)測(cè)模塊之上,是無(wú)量系統(tǒng)的平臺(tái)服務(wù)。用戶在這里管理自己的數(shù)據(jù),訓(xùn)練任務(wù)和模型。
至此,我們簡(jiǎn)單介紹了無(wú)量系統(tǒng)的各個(gè)部分。讓讀者能夠?qū)o(wú)量系統(tǒng)有一個(gè)整體的了解。下面,我們將重點(diǎn)介紹無(wú)量計(jì)算框架,模型管理與模型預(yù)測(cè)服務(wù)。
2.無(wú)量計(jì)算框架
為了得到一個(gè)好的模型,至少需要三個(gè)方面的內(nèi)容:1.?dāng)?shù)據(jù);2.模型和算法;3.計(jì)算框架。
正如前面介紹中所述,互聯(lián)網(wǎng)用戶為我們產(chǎn)生了大量的樣本數(shù)據(jù),為學(xué)習(xí)出一個(gè)好的模型提供了數(shù)據(jù)基礎(chǔ)。在本節(jié)中,我們將重點(diǎn)介紹后面兩部分內(nèi)容。
首先我們會(huì)介紹推薦場(chǎng)景常用的模型和算法,并由此推導(dǎo)出為了實(shí)現(xiàn)這些模型的訓(xùn)練,對(duì)計(jì)算框架有什么樣的需求,以及無(wú)量計(jì)算框架如何滿足這些需求,實(shí)現(xiàn)高性能的模型訓(xùn)練。
推薦模型與算法
隨著商業(yè)化推薦的興起,預(yù)測(cè)用戶點(diǎn)擊率(Click Through Rate,簡(jiǎn)稱CTR)領(lǐng)域得到了大量的研究關(guān)注,產(chǎn)生了很多CTR預(yù)估模型。下面對(duì)大規(guī)模場(chǎng)景下的幾個(gè)代表性的模型做簡(jiǎn)單的對(duì)比介紹。他們分別是LR, FM, DNN。對(duì)于推薦場(chǎng)景中常用的GBDT算法,由于其不適應(yīng)大規(guī)模特征的輸入,在此不做對(duì)比。
LR模型
LR是一個(gè)簡(jiǎn)單而有用的線性模型。優(yōu)點(diǎn):它實(shí)現(xiàn)簡(jiǎn)單而且非常容易支持大規(guī)模特征的樣本輸入。在實(shí)際應(yīng)用中,往往能取得不錯(cuò)的效果,常常被用作baseline。缺點(diǎn):由于是線性模型,需要大量的特征工程的工作來(lái)讓它得到好的效果。而特征交叉等操作也直接導(dǎo)致了模型的特征空間急劇膨脹。

FM模型
FM在LR線性模型的基礎(chǔ)上,引入了二次項(xiàng),使得FM模型能夠自動(dòng)學(xué)習(xí)特征之間的二階交叉關(guān)系。優(yōu)點(diǎn):自動(dòng)學(xué)習(xí)二階交叉關(guān)系,減少了部分特征工程的工作。缺點(diǎn):要學(xué)習(xí)二階以上的交叉關(guān)系,仍然需要進(jìn)行交叉特征選擇的工作來(lái)生成相應(yīng)的樣本。

DNN模型
隨著深度神經(jīng)網(wǎng)絡(luò)(DNN)在圖像、語(yǔ)音等領(lǐng)域的突破性發(fā)展,DNN被引入到CTR模型中來(lái),希望學(xué)習(xí)到特征之間的復(fù)雜關(guān)系,得到更好的模型。在CTR預(yù)估中,輸入特征是高維稀疏的,不能直接使用全連接網(wǎng)絡(luò)直接進(jìn)行學(xué)習(xí),所以用于CTR預(yù)估的網(wǎng)絡(luò)一般采用embedding層+全連接層的結(jié)構(gòu)。通過(guò)embedding層將稀疏特征轉(zhuǎn)換為低維稠密特征,再輸入后面的全連接層。優(yōu)點(diǎn):可以直接輸入原始特征,減少了交叉特征的選擇工作。缺點(diǎn):訓(xùn)練調(diào)參相比LR和FM等更難。由于DNN稠密參數(shù)的引入,訓(xùn)練性能也比LR和FM更低。

[Google 2016] Wide & Deep Learning for Recommender Systems
前面簡(jiǎn)單介紹了三種代表性的模型,在這三種基本結(jié)構(gòu)上,通過(guò)不同的組合和改進(jìn),衍生出了FFM, FNN, DeepFM, DIN等模型結(jié)構(gòu)。如果想詳細(xì)了解相關(guān)的模型,請(qǐng)見(jiàn)參考文獻(xiàn)3、4。
從上面的模型基本結(jié)構(gòu),我們可以總結(jié)出CTR模型的參數(shù)特點(diǎn):
? 超大規(guī)模稀疏的輸入特征參數(shù)。LR, FM和DNN的embedding層的輸入都是稀疏的,參數(shù)值可能是一個(gè)單獨(dú)的值(LR的w),也有可能是一個(gè)向量(FM中的w+v和embedding層的w)。
? 稠密的交叉關(guān)系參數(shù)。DNN中全連接層參數(shù)都是稠密的。
由此可以看出,計(jì)算框架需要同時(shí)支持稀疏和稠密兩種參數(shù)格式。另外,一些統(tǒng)計(jì)類特征(例如:文章的曝光數(shù),點(diǎn)擊率等)在訓(xùn)練中也是很重要的。這些參數(shù)也需要在訓(xùn)練過(guò)程中方便地計(jì)算得到。
在推薦場(chǎng)景下,可推薦的內(nèi)容存在一定的時(shí)效性,隨著熱點(diǎn)的變化,用戶的關(guān)注點(diǎn)也會(huì)發(fā)生相應(yīng)的變化,導(dǎo)致CTR模型應(yīng)用到線上后,預(yù)測(cè)性能會(huì)隨著時(shí)間的流逝而下降,所以CTR模型都需要進(jìn)行及時(shí)的更新。在不同的業(yè)務(wù)應(yīng)用場(chǎng)景下,這個(gè)更新頻率可以是分鐘級(jí),也可能是天級(jí)別的。
然而,重新訓(xùn)練一個(gè)百億規(guī)模的模型會(huì)消耗大量的時(shí)間和計(jì)算資源,為了以低廉的資源成本完成模型的及時(shí)更新,推薦場(chǎng)景下會(huì)采用在線訓(xùn)練的方式。所以計(jì)算框架需要支持多種在線訓(xùn)練算法。目前應(yīng)用于在線訓(xùn)練的優(yōu)化算法主要有Ftrl, Adagrad等。
高性能大規(guī)模并行機(jī)器學(xué)習(xí)框架在我們的系統(tǒng)設(shè)計(jì)目標(biāo)中有三個(gè)關(guān)鍵維度:
? 千億級(jí)模型參數(shù);
? 千億級(jí)樣本數(shù)據(jù);
? 高性能。
如何同時(shí)提高上面的三個(gè)維度的目標(biāo),我們需要仔細(xì)分析分布式計(jì)算過(guò)程。以現(xiàn)在常用的基于梯度下降的分布式優(yōu)化算法為例。在使用樣本數(shù)據(jù)I進(jìn)行一輪訓(xùn)練的過(guò)程中,有以下幾個(gè)基本步驟:

? 數(shù)據(jù)分片,將所有數(shù)據(jù)拆分后分配到多臺(tái)機(jī)器上;
? 并行計(jì)算g,各臺(tái)機(jī)器上的計(jì)算節(jié)點(diǎn)按照指定算法計(jì)算梯度;
? 聚合g,將各臺(tái)機(jī)器上計(jì)算的g收集起來(lái);
? 更新w,使用上一步得到的g更新w;
? 廣播w,將更新后的w傳輸給計(jì)算機(jī)器。
這樣的學(xué)習(xí)邏輯通過(guò)將數(shù)據(jù)分布到多臺(tái)機(jī)器上計(jì)算,有效地解決了樣本數(shù)據(jù)量的問(wèn)題。Hadoop和Spark都采用這樣的邏輯進(jìn)行機(jī)器學(xué)習(xí),Spark由于RDD的方式充分利用內(nèi)存來(lái)存儲(chǔ)中間數(shù)據(jù),大大提高了訓(xùn)練性能。但是在這樣的訓(xùn)練邏輯下,存在兩個(gè)問(wèn)題:
1.w被存儲(chǔ)在一臺(tái)機(jī)器上,限制了框架能夠訓(xùn)練的模型的規(guī)模,只能是單機(jī)可存儲(chǔ)的模型,以128G的內(nèi)存的機(jī)型為例,10億個(gè)參數(shù)的模型就達(dá)到他的存儲(chǔ)極限了;
2.w被廣播給各個(gè)機(jī)器。由于是廣播推送方式,當(dāng)模型規(guī)模變大的時(shí)候,廣播操作帶來(lái)的帶寬成本會(huì)急劇增加。以我們的測(cè)試來(lái)說(shuō),用Spark訓(xùn)練一個(gè)百萬(wàn)參數(shù)的模型時(shí)就發(fā)現(xiàn)性能難以忍受了。

參數(shù)服務(wù)器的基本結(jié)構(gòu)和工作流程圖
以上分布式訓(xùn)練邏輯是梯度下降算法的邏輯,而現(xiàn)在機(jī)器學(xué)習(xí)尤其是深度學(xué)習(xí)中廣泛使用的是隨機(jī)梯度下降算法(SGD)。模型參數(shù)是以minibatch(128個(gè)樣本,甚至更少)為單位來(lái)更新的。這導(dǎo)致參數(shù)更新頻率急劇提升,帶來(lái)的是巨大的網(wǎng)絡(luò)帶寬需求。所以必須要解決上面兩個(gè)問(wèn)題,才能夠進(jìn)行千億級(jí)參數(shù)的模型訓(xùn)練。參數(shù)服務(wù)器架構(gòu)由此產(chǎn)生。
從2010年被提出,經(jīng)過(guò)了幾年的發(fā)展演進(jìn),現(xiàn)在普遍使用的是第三代參數(shù)服務(wù)器架構(gòu)。相對(duì)于前面Algorithm 1的流程,參數(shù)服務(wù)器有兩點(diǎn)主要的不同:
1.有一種新的角色Server,專門(mén)用于分布式地存儲(chǔ)模型參數(shù),并進(jìn)行參數(shù)的更新計(jì)算。這使得能夠訓(xùn)練的模型規(guī)模不再受限于單機(jī)的內(nèi)存大小,同時(shí)將多個(gè)worker節(jié)點(diǎn)的參數(shù)請(qǐng)求分?jǐn)偟蕉鄠€(gè)server上,減少了單個(gè)server上因參數(shù)和梯度傳輸導(dǎo)致的網(wǎng)絡(luò)瓶頸。
2.負(fù)責(zé)計(jì)算的Worker節(jié)獲取參數(shù)的方式是pull方式。由于不是被動(dòng)的等待廣播參數(shù),pull方式使得worker節(jié)點(diǎn)可以根據(jù)訓(xùn)練數(shù)據(jù)的需求來(lái)獲取參數(shù)。尤其是在推薦場(chǎng)景下,樣本都是非常稀疏的。
舉例來(lái)說(shuō),一個(gè)模型可能有100億個(gè)特征輸入,而具體到一個(gè)特定的樣本,只會(huì)有幾百個(gè)有效特征值。所以只需要獲取與這幾百個(gè)有效特征值有關(guān)的參數(shù)即可,而不需要傳輸整個(gè)模型。
簡(jiǎn)而言之,參數(shù)服務(wù)器架構(gòu)下,多個(gè)server分?jǐn)倕?shù)存儲(chǔ)和傳輸?shù)膲毫Γ鄠€(gè)worker按需獲取和更新參數(shù)降低了參數(shù)和梯度傳輸?shù)木W(wǎng)絡(luò)需求。這使得千億參數(shù)模型的高性能訓(xùn)練成為了可能。
通過(guò)上面的分析,我們得到了以下的結(jié)論。參數(shù)服務(wù)器能夠在模型規(guī)模,樣本數(shù)量和訓(xùn)練性能三方面滿足我們的設(shè)計(jì)要求。
了解了通用的參數(shù)服務(wù)器架構(gòu)以及其特點(diǎn),我們回到無(wú)量計(jì)算框架,繼續(xù)分析一個(gè)通用的參數(shù)服務(wù)器架構(gòu)在實(shí)際中面臨的問(wèn)題以及我們的解法。在模型和算法的分析中,我們知道,要實(shí)現(xiàn)兩類稀疏和稠密兩類參數(shù)的傳輸與更新。

Hadoop/Spark/ 參數(shù)服務(wù)器對(duì)比
1)超大規(guī)模稀疏的輸入特征參數(shù)。這里稀疏有兩層含義。
首先,模型可能的參數(shù)是千億個(gè),但是因?yàn)椴⒉皇撬刑卣鞫加锌赡艹霈F(xiàn)在訓(xùn)練樣本中,所以一般不會(huì)所有參數(shù)都有值,一般最終的模型可能只有1/10的參數(shù)是有值的。如果使用了稀疏化的技術(shù),這個(gè)比例會(huì)更低。
其次,對(duì)于每個(gè)樣本只會(huì)使用到非常少的特征。在一個(gè)千億特征的模型中,單個(gè)樣本通常只會(huì)命中到幾百個(gè)特征。
從上面的分析中,可以看出,參數(shù)服務(wù)器架構(gòu)在大規(guī)模稀疏特征的模型訓(xùn)練中尤為高效。因?yàn)閣orker訓(xùn)練一個(gè)minibatch的樣本時(shí),只需要獲取與這些樣本相關(guān)的參數(shù)即可,如果每個(gè)樣本平均有500個(gè)特征,那么100個(gè)樣本最多只需要獲取5萬(wàn)個(gè)特征的相關(guān)參數(shù)即可。
2)稠密的交叉關(guān)系參數(shù)。與稀疏的輸入特征參數(shù)不同,交叉關(guān)系參數(shù)規(guī)模相對(duì)較小,但是每個(gè)樣本的訓(xùn)練會(huì)使用到全部的稠密參數(shù)。假設(shè)全連接層中最大的一層是1024*512,那么每次計(jì)算使用到的稠密參數(shù)就是在50萬(wàn)這個(gè)量級(jí)。
從這里我們可以看出,稀疏和稠密兩種參數(shù)在訓(xùn)練過(guò)程中存在不同的性質(zhì)。稀疏參數(shù)總體規(guī)模大,但是每次訓(xùn)練只使用到很小的一部分。稠密參數(shù)總體規(guī)模相對(duì)較小,但是每次訓(xùn)練都需要被全部使用到。由于兩種類型參數(shù)的性質(zhì)差異,被自然地切分成了基于Kv和基于矩陣的數(shù)據(jù)結(jié)構(gòu)。
下面我們繼續(xù)分析訓(xùn)練各個(gè)階段的性能問(wèn)題與我們的解法。
1)參數(shù)獲取。在實(shí)際的超大規(guī)模模型的訓(xùn)練中,網(wǎng)絡(luò)經(jīng)常成為性能瓶頸。為了減少因?yàn)閰?shù)獲取而導(dǎo)致的網(wǎng)絡(luò)傳輸壓力,我們引入了參數(shù)緩存機(jī)制,worker并不是每個(gè)minibatch都從server獲取最新的參數(shù)。然而,在分布式訓(xùn)練中,緩存模型參數(shù)存在訓(xùn)練正確性的風(fēng)險(xiǎn)。
由于在數(shù)據(jù)并行情況下,各個(gè)計(jì)算節(jié)點(diǎn)使用的訓(xùn)練數(shù)據(jù)是不同的,如果進(jìn)行多次訓(xùn)練而不同步更新參數(shù),則模型可能出現(xiàn)無(wú)法收斂的問(wèn)題。在學(xué)術(shù)研究領(lǐng)域,這是一個(gè)訓(xùn)練的網(wǎng)絡(luò)帶寬與模型訓(xùn)練正確性保障的問(wèn)題。已有不同的同步控制協(xié)議的研究。
我們的實(shí)現(xiàn)借鑒了ssp協(xié)議5中有限版本差異的思想,通過(guò)控制緩存的使用次數(shù),在保障訓(xùn)練正確性的前提下,減少因參數(shù)獲取而導(dǎo)致網(wǎng)絡(luò)傳輸。
2)梯度更新。計(jì)算完成后的梯度上傳也會(huì)有大量的數(shù)據(jù)需要通過(guò)網(wǎng)絡(luò)傳輸。按照模型的梯度計(jì)算邏輯,所有使用到的參數(shù)都會(huì)得到相應(yīng)的梯度。但是,是否需要發(fā)送某個(gè)參數(shù)的更新,或者以什么樣的方式發(fā)送給Server卻是可以選擇的,這個(gè)過(guò)程稱為梯度壓縮。梯度壓縮的方法大致可以分兩類:
? 梯度量化。將梯度從double/float等原始類型量化成二值/三值等用幾個(gè)bit就能表示的類型,以減少傳輸數(shù)據(jù)量。
? 梯度稀疏化。選擇重要的梯度立即上傳,不是很重要的梯度更新,則累積起來(lái),稍后再上傳。如讀者對(duì)這個(gè)研究領(lǐng)域感興趣,可以閱讀參考文獻(xiàn)6、7。
傳統(tǒng)的梯度壓縮技術(shù)存在與模型大小相當(dāng)?shù)膬?nèi)存消耗,所以主要使用在單機(jī)可存儲(chǔ)的稠密模型的訓(xùn)練中,在無(wú)量所應(yīng)對(duì)的超大規(guī)模模型的訓(xùn)練中,我們對(duì)現(xiàn)有的梯度壓縮技術(shù)進(jìn)行了改進(jìn),使之適應(yīng)了百億稀疏參數(shù)規(guī)模模型的訓(xùn)練,可以減少99%以上的梯度傳輸而不影響訓(xùn)練效果。
3)梯度計(jì)算。在機(jī)器學(xué)習(xí),尤其是深度學(xué)習(xí)過(guò)程中,模型的梯度計(jì)算過(guò)程會(huì)有大量的數(shù)值計(jì)算操作。除了使用多線程并行訓(xùn)練的方式充分利用多個(gè)cpu的計(jì)算能力,我們還使用SSE等CPU并行計(jì)算指令和Eigen線性計(jì)算庫(kù)實(shí)現(xiàn)梯度計(jì)算過(guò)程,充分利用了CPU芯片的流水線和并行指令能力,比單純的多線程并行的計(jì)算性能高10+倍。
在實(shí)際的生產(chǎn)環(huán)境中,數(shù)據(jù)被存放在hdfs集群上,而訓(xùn)練時(shí)拉取數(shù)據(jù)變得很耗時(shí)。我們通過(guò)將數(shù)據(jù)讀取異步化,使得數(shù)據(jù)讀取不影響訓(xùn)練的參數(shù)傳輸,梯度計(jì)算和更新過(guò)程。同時(shí)通過(guò)優(yōu)化數(shù)據(jù)讀取模塊的內(nèi)存管理和樣本緩存機(jī)制,以極小的內(nèi)存開(kāi)銷滿足訓(xùn)練對(duì)樣本隨機(jī)性的需求。
3.無(wú)量模型管理——全流程模型管理
在推薦類業(yè)務(wù)中,文章和視頻資料快速更新,社會(huì)熱點(diǎn)隨時(shí)出現(xiàn)和消失,用戶的興趣也經(jīng)常變化。為了取得優(yōu)秀的推薦效果,很多具有時(shí)效性的特征信息被加入到預(yù)測(cè)模型中,導(dǎo)致CTR模型需要及時(shí)更新。無(wú)量系統(tǒng)提供了全流程的模型管理服務(wù)。

模型流轉(zhuǎn)的基本流程
在管理超大規(guī)模的模型時(shí),存在兩個(gè)主要的挑戰(zhàn):
1)模型超大導(dǎo)致的模型上線性能的問(wèn)題。對(duì)于千億參數(shù)的模型,如果每個(gè)參數(shù)都以4字節(jié)的float格式存儲(chǔ),最終存儲(chǔ)的模型將會(huì)接近TB級(jí)別。如果要實(shí)現(xiàn)分鐘級(jí)別地將新模型更新到多地的在線預(yù)測(cè)服務(wù)上,僅從數(shù)據(jù)傳輸和文件解析的性能上看,每次都使用全量模型的方式就是不可行的。
幸運(yùn)的是,模型在訓(xùn)練過(guò)程中的變化是漸進(jìn)的,而當(dāng)模型上線時(shí),是一個(gè)相對(duì)穩(wěn)定的狀態(tài),在線訓(xùn)練更多的是對(duì)模型的微調(diào)。因此,對(duì)于超大規(guī)模的模型,一般采用全量+增量的方式進(jìn)行管理。首先使用全量模型加載到線上服務(wù),然后定期將模型的差異部分以增量的方式疊加到線上服務(wù)的模型中。
2)模型分片導(dǎo)致的管理問(wèn)題。在全量+增量的模型上線模式下,線上服務(wù)的模型對(duì)應(yīng)著多個(gè)模型文件。如果線上服務(wù)出現(xiàn)故障需要恢復(fù)或者因?yàn)檎?qǐng)求量上升需要擴(kuò)容時(shí),就需要使用多個(gè)模型文件來(lái)恢復(fù)出模型。在某些情況下,業(yè)務(wù)發(fā)現(xiàn)當(dāng)前模型效果差,需要替換模型或者進(jìn)行版本回滾時(shí),需要另外的一組模型文件。
另外,不同于單機(jī)可存儲(chǔ)的模型,在參數(shù)服務(wù)器框架下,模型被分片存儲(chǔ)在不同的機(jī)器上。為了提高模型導(dǎo)出效率,多個(gè)server節(jié)點(diǎn)會(huì)并行導(dǎo)出多個(gè)模型分片文件。假設(shè)存在100個(gè)server,那么就會(huì)有100個(gè)模型分片文件。給模型管理工作帶來(lái)了挑戰(zhàn)。
為了避免模型開(kāi)發(fā)和使用者陷入這些管理問(wèn)題,同時(shí)也為了保障系統(tǒng)的穩(wěn)定運(yùn)行,無(wú)量模型管理服務(wù)將所有模型管理的相關(guān)工作承接下來(lái)。用戶只需進(jìn)行必要的配置,模型管理服務(wù)就會(huì)自動(dòng)地發(fā)現(xiàn)新版本的模型,驗(yàn)證模型的完整性并將新模型傳輸和發(fā)布到指定的在線預(yù)測(cè)服務(wù)中。
對(duì)用戶完全屏蔽下層類似全量,增量,分片等細(xì)節(jié)。后期,用戶還可以自定義模型驗(yàn)證的方法,對(duì)即將上線的模型進(jìn)行模擬請(qǐng)求等校驗(yàn),避免有效果差的模型被上線,給業(yè)務(wù)造成損失。
4.無(wú)量模型服務(wù)
使用千億參數(shù)的大模型進(jìn)行線上預(yù)測(cè),面臨有許多的問(wèn)題,下面我們就一些主要問(wèn)題進(jìn)行分析并介紹我們的方案:
1)模型加載的內(nèi)存問(wèn)題。當(dāng)被加載到內(nèi)存中時(shí),需要構(gòu)建相關(guān)的數(shù)據(jù)結(jié)構(gòu),所消耗的內(nèi)存大小會(huì)比模型文件大很多。以最簡(jiǎn)單的LR模型為例,每個(gè)特征只會(huì)有一個(gè)float類型的模型參數(shù),一個(gè)10億有值特征的模型的文件大小大概是12GB(每個(gè)特征8字節(jié)key+4字節(jié)值value)。使用stl標(biāo)準(zhǔn)庫(kù)中unordered_map加載這個(gè)模型需要超過(guò)25GB的內(nèi)存。也就是說(shuō)會(huì)有超過(guò)模型大小1倍的內(nèi)存開(kāi)銷,這使得單機(jī)能夠存儲(chǔ)的模型大小受到極大的制約。
我們自己實(shí)現(xiàn)了一個(gè)hashmap:tlhashmap,專門(mén)針對(duì)模型稀疏參數(shù)特點(diǎn)進(jìn)行了內(nèi)存優(yōu)化。內(nèi)存消耗只比模型數(shù)據(jù)大20%左右。這意味著tlhashmap有效地提高了能夠被單機(jī)存儲(chǔ)的模型的大小極限。以128GB內(nèi)存的機(jī)器為例,使用tlhashmap,最大能支持的lr模型文件大小是100GB左右,而標(biāo)準(zhǔn)unorderedmap最大能支持50GB左右。
2)模型服務(wù)的性能問(wèn)題。為了達(dá)到良好的用戶體驗(yàn),預(yù)測(cè)服務(wù)的響應(yīng)時(shí)間需要在10ms這個(gè)量級(jí)。以手機(jī)用戶的推薦場(chǎng)景為例,從用戶在手機(jī)上刷新頁(yè)面到看到推薦結(jié)果,時(shí)間不能超過(guò)1s,扣除掉網(wǎng)絡(luò)通訊的開(kāi)銷,IDC內(nèi)在線服務(wù)的響應(yīng)時(shí)間需要控制在200ms以內(nèi),而整個(gè)推薦的流程至少有召回,排序和展示控制三個(gè)階段。在排序階段,需要對(duì)200個(gè)以上的文章進(jìn)行特征拼接和點(diǎn)擊率預(yù)估,所以模型對(duì)這200個(gè)文章進(jìn)行點(diǎn)擊率預(yù)估的總時(shí)間要在30ms以內(nèi)。
從排序服務(wù)發(fā)出請(qǐng)求開(kāi)始,到請(qǐng)求完成,至少存在兩個(gè)性能瓶頸點(diǎn):
1.請(qǐng)求包的網(wǎng)絡(luò)傳輸與編解碼。為了預(yù)測(cè)文章的可能點(diǎn)擊率,需要為每個(gè)文章準(zhǔn)備所有的樣本特征。假定每個(gè)樣本有500個(gè)特征,那么200個(gè)文章的請(qǐng)求就有10萬(wàn)個(gè)特征。整個(gè)請(qǐng)求包的數(shù)據(jù)會(huì)有1MB左右。網(wǎng)絡(luò)傳輸和編解碼的性能對(duì)整個(gè)rpc框架都帶來(lái)了極大的挑戰(zhàn)。我們定義了一套針對(duì)模型預(yù)測(cè)場(chǎng)景的特征編解碼格式,避開(kāi)了現(xiàn)有rpc框架在編解碼格式上的性能缺點(diǎn),并且最大化地減少了需要傳輸?shù)臄?shù)據(jù)大小。
2.模型參數(shù)查詢和計(jì)算性能。為完成模型的預(yù)測(cè)功能,首先需要從模型中找到需要的參數(shù),然后完成預(yù)測(cè)值的計(jì)算。面對(duì)超大規(guī)模的模型,首先要解決的就是模型存儲(chǔ)方式的問(wèn)題。如果模型能夠單機(jī)存儲(chǔ),那么模型參數(shù)的查詢則可以在本機(jī)完成。如果模型超過(guò)單機(jī)存儲(chǔ)的極限,則需要使用分布式存儲(chǔ)的方式提供查詢服務(wù)。
考慮上面的例子,一個(gè)請(qǐng)求需要10萬(wàn)個(gè)特征的參數(shù),這些特征被存儲(chǔ)在多臺(tái)機(jī)器上。即使忽略預(yù)測(cè)計(jì)算時(shí)間,要保證這個(gè)請(qǐng)求在30ms之內(nèi)返回,那么所有存儲(chǔ)參數(shù)的節(jié)點(diǎn)都必須在30ms之內(nèi)返回結(jié)果。這就會(huì)出現(xiàn)木桶現(xiàn)象,任何一個(gè)存儲(chǔ)節(jié)點(diǎn)出現(xiàn)了超過(guò)30ms的響應(yīng)延時(shí),總體請(qǐng)求時(shí)間都一定會(huì)超過(guò)30ms。這樣的存儲(chǔ)系統(tǒng)對(duì)請(qǐng)求排隊(duì)是接近0容忍的。但推薦場(chǎng)景又是一個(gè)高并發(fā)的場(chǎng)景,預(yù)測(cè)服務(wù)需要支持每秒上萬(wàn)的用戶請(qǐng)求。
無(wú)量系統(tǒng)開(kāi)發(fā)了一套分布式模型預(yù)測(cè)服務(wù),專門(mén)針對(duì)分布式預(yù)測(cè)場(chǎng)景下高并發(fā)的模型參數(shù)請(qǐng)求的性能問(wèn)題進(jìn)行優(yōu)化,實(shí)現(xiàn)對(duì)TB級(jí)模型的高并發(fā)預(yù)測(cè)服務(wù)支持。
5.總結(jié)
隨著互聯(lián)網(wǎng)服務(wù)的發(fā)展,越來(lái)越精細(xì)和定制化的服務(wù)需要更好的模型支持,而超大規(guī)模預(yù)測(cè)模型已經(jīng)成為主流的解決方案。通過(guò)深度的研究與優(yōu)化,無(wú)量系統(tǒng)開(kāi)發(fā)了能夠支持千億級(jí)參數(shù)模型訓(xùn)練的高性能計(jì)算框架,并通過(guò)模型管理,模型預(yù)測(cè)服務(wù),實(shí)現(xiàn)了超大規(guī)模模型的訓(xùn)練,管理以及上線的全流程支持。
無(wú)量系統(tǒng)已經(jīng)支持了LR/FM/FFM/DNN等多種常用模型,并在移動(dòng)手機(jī)瀏覽器業(yè)務(wù)中實(shí)際使用和驗(yàn)證,幫助業(yè)務(wù)取得了巨大的業(yè)務(wù)指標(biāo)提升。無(wú)量系統(tǒng)將逐步擴(kuò)展功能,比如正在探索的基于GPU的深度學(xué)習(xí)技術(shù),以覆蓋更多的現(xiàn)有業(yè)務(wù)場(chǎng)景以及最新的AI類應(yīng)用場(chǎng)景,為業(yè)務(wù)的進(jìn)一步提升提供強(qiáng)大的系統(tǒng)支持。
作者介紹
袁鐿博士,騰訊科技有限公司高級(jí)研究員。
參考文獻(xiàn)
1 Hidden Technical Debt in Machine Learning Systems, Google. In NIPS'15
2 Wide & Deep Learning for Recommender Systems, Google 2016
3 常見(jiàn)計(jì)算廣告點(diǎn)擊率預(yù)估算法總結(jié)https://cloud.tencent.com/developer/article/1005915
4 深度學(xué)習(xí)在CTR預(yù)估中的應(yīng)用https://mp.weixin.qq.com/s/CMZHhxAMno2GlnQCjv0BKg
5 Solving the stragglerproblem with bounded staleness. In HotOS (2013).
6 TernGrad: Ternary Gradients to Reduce Communication in Distributed Deep Learning
7 Deep Gradient Compression: Reducing the Communication Bandwidth for Distributed Training
- 中國(guó)傳媒科技(2020年第10期)
- 檢察風(fēng)云(2021年第12期)
- 演講與口才(2021年第10期)
- 農(nóng)村財(cái)務(wù)會(huì)計(jì)(2021年第6期)
- 中國(guó)佛學(xué)(2015年總第37期)
- 審計(jì)與理財(cái)(2021年第9期)
- 音樂(lè)愛(ài)好者(2022年第4期)
- 音樂(lè)愛(ài)好者(2016年第9期)
- 檢察風(fēng)云(2021年第6期)
- 《架構(gòu)師》2016年5月
- 音樂(lè)愛(ài)好者(2013年第1期)
- 信睿周報(bào)·第14輯(第79-84期)
- 信睿周報(bào)·第16輯(第91-96期)
- 審計(jì)與理財(cái)(2021年第4期)
- 傳播與版權(quán)(2021年第5期)