汽車之家機(jī)器學(xué)習(xí)平臺的架構(gòu)與實(shí)踐

導(dǎo)讀:汽車之家機(jī)器學(xué)習(xí)平臺是為算法工程師打造的一站式機(jī)器學(xué)習(xí)服務(wù)平臺,集數(shù)據(jù)導(dǎo)入、數(shù)據(jù)處理、模型開發(fā)、模型訓(xùn)練、模型評估、服務(wù)上線等功能于一體,提供一站式全方位的機(jī)器學(xué)習(xí)建模流程,快速打造智能業(yè)務(wù)。本文主要介紹汽車之家機(jī)器學(xué)習(xí)平臺的架構(gòu)和實(shí)現(xiàn)細(xì)節(jié),以及業(yè)務(wù)在平臺上的應(yīng)用,希望能為大家提供一些參考。
主要內(nèi)容包括:
背景介紹
機(jī)器學(xué)習(xí)平臺
平臺成效與應(yīng)用
平臺展望
01
背景介紹
汽車之家是國內(nèi)最早的將互聯(lián)網(wǎng)與汽車產(chǎn)業(yè)深入捆綁的汽車服務(wù)平臺,在2005年成立初期以垂直互聯(lián)網(wǎng)介入汽車行業(yè),迅速做成國內(nèi)規(guī)模最大的汽車垂直網(wǎng)絡(luò)媒體,并逐漸發(fā)展為"車媒體+車電商"的1.0模式。2016年以"數(shù)據(jù)+技術(shù)"打造車金融、車內(nèi)容、車生活以及車交易的數(shù)據(jù)平臺2.0模式,以便為用戶和客戶之間創(chuàng)造更有效的連接。目前,汽車之家利用 AI、大數(shù)據(jù)及云,以流量、銷售線索、內(nèi)容及數(shù)據(jù)等賦能汽車生態(tài)系統(tǒng)中各個(gè)參與方,加速邁向智能平臺3.0時(shí)代。汽車之家機(jī)器學(xué)習(xí)平臺在智能平臺3.0的背景下應(yīng)用而生,通過廣泛支持自然語言處理、圖像分析、語音識別、視頻分析、推薦、搜索、廣告等場景的 AI 服務(wù),有效提升了汽車之家 AI 的應(yīng)用效果,擴(kuò)展了 AI 的應(yīng)用范圍,提高了用戶看車,買車,用車的體驗(yàn)。
機(jī)器學(xué)習(xí)領(lǐng)域,最重要的三個(gè)環(huán)節(jié)如下圖,包括數(shù)據(jù)處理,模型訓(xùn)練和服務(wù)部署,每一環(huán)節(jié)包含的內(nèi)容很多,都可以單獨(dú)拿出來做一個(gè)平臺。
在早期,之家內(nèi)部算法團(tuán)隊(duì)在各自的服務(wù)器上進(jìn)行機(jī)器學(xué)習(xí)的訓(xùn)練和服務(wù)部署,造成了小作坊式的工作局面,各自重復(fù)著這三個(gè)環(huán)節(jié)來支持業(yè)務(wù)。在開始算力規(guī)模小的時(shí)候,這種小作坊方式保證了工作的靈活與創(chuàng)新突破,但是隨著業(yè)務(wù)的增加和算力的增長,逐漸顯示了這種方式的局限性。主要體現(xiàn)在兩個(gè)方面:
昂貴的計(jì)算資源不能得到有效的調(diào)度,公司的投入產(chǎn)出效益越來越低。因此基于這種局面,公司急需一種平臺化的方式來統(tǒng)一調(diào)度計(jì)算資源。
各個(gè)業(yè)務(wù)線包括團(tuán)隊(duì)內(nèi)部,業(yè)務(wù)不同,用的數(shù)據(jù)不盡相同,大部分的工程技術(shù)人員和業(yè)務(wù)人員都聚焦在業(yè)務(wù)領(lǐng)域的特征提取,算法選擇,參數(shù)調(diào)優(yōu)和模型驗(yàn)證上,因此一個(gè)方便高效的可視化建模平臺,對于降低用戶的機(jī)器學(xué)習(xí)學(xué)習(xí)曲線、提升工作效率顯得尤為重要。
由此汽車之家構(gòu)建了自己的機(jī)器學(xué)習(xí)平臺,該平臺同時(shí)支持深度學(xué)習(xí)和傳統(tǒng)機(jī)器學(xué)習(xí)建模、可視化建模、統(tǒng)一的計(jì)算資源和存儲資源管理、統(tǒng)一的部署平臺,力求達(dá)到以下目標(biāo):
開發(fā)通用化:一次開發(fā)重復(fù)使用,避免重復(fù)造輪子,提高工作效率。將算法工程師們從繁重的腳本開發(fā)工作中解放出來專注于算法效果的提升。
建模極簡化:用戶僅需根據(jù)自己的需求在頁面上通過拖拽的形式完成數(shù)據(jù)的導(dǎo)入,預(yù)處理,模型建模與評估等流程。這樣即使是對模型算法不甚了解的產(chǎn)品運(yùn)營同事在經(jīng)過簡單的了解后也可輕松上手,依據(jù)自身需求完成簡單數(shù)據(jù)處理或者建模任務(wù)。
數(shù)據(jù)可視化:可以支持輸入數(shù)據(jù)可視化,數(shù)據(jù)分析可視化、計(jì)算圖可視化、訓(xùn)練過程可視化、模型效果可視化。
02
機(jī)器學(xué)習(xí)平臺
1. 整體架構(gòu)
計(jì)算資源包括高性能 CPU 集群和云 GPU 集群,高性能 CPU 集群用于訓(xùn)練和部署傳統(tǒng)機(jī)器學(xué)習(xí)模型,云 GPU 集群用于訓(xùn)練和部署深度學(xué)習(xí)模型。
基于資源的不同,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)底層采用了兩種不同類型的架構(gòu)方式,機(jī)器學(xué)習(xí)訓(xùn)練使用 Spark 做計(jì)算,通過 Yarn 來調(diào)度計(jì)算資源;深度學(xué)習(xí)訓(xùn)練使用 K8s 做調(diào)度,支持主流的 Tensorflow、PaddlePaddle、MxNet、Caffe 等深度學(xué)習(xí)框架,并且支持單機(jī)和分布式訓(xùn)練。
存儲層包括業(yè)務(wù)端通用的樣本庫、特征庫和模型庫,主要存放在 Hive 倉庫和 HDFS 上。
平臺抽象了算法組件包括機(jī)器學(xué)習(xí)的數(shù)據(jù)預(yù)處理、特征工程、統(tǒng)計(jì)分析、分類、聚類、回歸、評估、預(yù)測等100+個(gè)組件。
模塊對外提供了模型訓(xùn)練、模型評估、模型預(yù)測、模型管理和模型部署功能,滿足了算法人員的模型訓(xùn)練和部署模型服務(wù)的需求,同時(shí)還提供了交互式編程 Notebook,提高了開發(fā)人員的開發(fā)效率。
2. 機(jī)器學(xué)習(xí)建模流程
算法框架:
由于 Spark 選擇內(nèi)存存儲輸入數(shù)據(jù)、處理中間結(jié)果、和存儲最終結(jié)果,在大數(shù)據(jù)的場景中,很多計(jì)算都有循環(huán)往復(fù)的特點(diǎn),像 Spark 這樣允許在內(nèi)存中緩存輸入輸出,上一個(gè) job 的結(jié)果馬上可以被下一個(gè)使用。因此 Spark 有著高效的分布式計(jì)算能力。
此外 Spark 提供了更多靈活可用的數(shù)據(jù)操作,比如 filter、union、join 以及各種對 key value pair 的方便操作,甚至提供了一個(gè)通用接口,讓用戶根據(jù)需要開發(fā)定制的數(shù)據(jù)操作。Spark 本身作為平臺也開發(fā)了 streaming 處理框架 Spark streaming,SQL 處理框架 Dataframe,機(jī)器學(xué)習(xí)庫 MLlib 和圖處理庫 GraphX。更重要的是 Spark 可以提供面向 python 的開發(fā)接口,提高了開發(fā)效率。因此我們選擇 Spark 作為我們平臺的算法框架。
算法端流程:
后端將用戶構(gòu)建的建模流程及配置的模型參數(shù)包裝至 json 調(diào)用算法端接口
算法端通過 spark-submit 提交一個(gè) Spark 任務(wù)
ML Engine 負(fù)責(zé)這個(gè)任務(wù)的執(zhí)行,在 Driver 端會(huì)從 json 中獲取當(dāng)前試驗(yàn)的流程關(guān)系及對應(yīng)的參數(shù)。這些組件將依次運(yùn)行,涉及 RDD 相關(guān)的操作時(shí)會(huì)提交到 Spark Executor 進(jìn)行并行計(jì)算
3. 深度學(xué)習(xí)訓(xùn)練
以上為機(jī)器學(xué)習(xí)平臺-深度學(xué)習(xí)部分的邏輯架構(gòu)圖,平臺支持了深度模型的訓(xùn)練和服務(wù)部署功能。為了更好的管理計(jì)算資源,需要將所有的計(jì)算資源集中起來,尤其是 GPU 機(jī)器,做到按需分配,使資源的使用率盡量接近100%,這樣才能提高我們的生產(chǎn)力,節(jié)約公司成本。這就需要一個(gè)容器管理系統(tǒng)來管理我們的 GPU 集群。
① 技術(shù)選型
我們調(diào)研了 K8s 和 Yarn。Yarn 作為大數(shù)據(jù)平臺標(biāo)配的資源調(diào)度器,確實(shí)有很多優(yōu)點(diǎn)并且比較成熟,但是鑒于 Yarn 對在線服務(wù)的支持較弱,新版的 Yarn 才支持 GPU 調(diào)度,存在穩(wěn)定性風(fēng)險(xiǎn)。相對于 Yarn,K8s 現(xiàn)在社區(qū)比較強(qiáng)大,對 GPU 卡的調(diào)度有很好的支持,支持服務(wù)的自動(dòng)化部署,服務(wù)的運(yùn)維成本低,我們選擇用 K8s 做為平臺的容器管理系統(tǒng)。
存儲:
模型訓(xùn)練的訓(xùn)練樣本數(shù)據(jù)大多存儲在 HDFS 和 Hive 表中,平臺實(shí)現(xiàn)了與 Hadoop 集群的互通。任務(wù)在運(yùn)行前需要拉取數(shù)據(jù)到容器內(nèi)部,為了保證數(shù)據(jù)的持久化存儲和可擴(kuò)展性,需要外部存儲系統(tǒng)來支持,我們選擇了 Ceph。使用 Ceph 主要有以下幾個(gè)好處:
可以支持較大的數(shù)據(jù)規(guī)模,較大的樣本數(shù)據(jù)可以達(dá)到幾百 G 甚至到幾 T,當(dāng)遇到集群節(jié)點(diǎn)故障,任務(wù)的 Pod 重啟,還能繼續(xù)訪問數(shù)據(jù)進(jìn)行訓(xùn)練。
Ceph 是一個(gè)統(tǒng)一的分布式存儲系統(tǒng),該系統(tǒng)擁有很好的性能、可靠性和可擴(kuò)展性。在單機(jī)訓(xùn)練中主要用到的是 Ceph 的塊存儲 RBD,在多機(jī)分布式訓(xùn)練中需要共享訓(xùn)練數(shù)據(jù)用到的是 CephFS,任務(wù)運(yùn)行結(jié)束,存儲資源根據(jù)用戶選擇決定是否釋放。
調(diào)度:
通過構(gòu)建 K8s 的 GPU 集群,來統(tǒng)一調(diào)度 GPU,CPU 和內(nèi)存資源,通過 Docker 保證環(huán)境完全隔離,任務(wù)之間不受影響,任務(wù)結(jié)束,占用的資源隨即得到釋放。同時(shí)基于 K8s 可以做靈活的調(diào)度策略。如現(xiàn)在集群有多種類型的 GPU 卡,用戶可以根據(jù)實(shí)際情況選擇卡的類型,具體做法通過對 GPU 節(jié)點(diǎn)打 label 的方式實(shí)現(xiàn),根據(jù)節(jié)點(diǎn)類型標(biāo)記對應(yīng)的 label,啟動(dòng)任務(wù)配置 nodeSelector 實(shí)現(xiàn)卡類型的精確分配;由于 k8s 分配最大資源是整個(gè)物理機(jī)的資源,有些復(fù)雜的訓(xùn)練任務(wù)在單機(jī)多卡方式下,為了能分到更多的 GPU 卡進(jìn)行訓(xùn)練,在訓(xùn)練集群使用 K8s 的節(jié)點(diǎn)親和性調(diào)度 nodeAffinity,可以使訓(xùn)練任務(wù)集中調(diào)度。K8s 支持通過插件的方式進(jìn)行自定義調(diào)度,如果現(xiàn)有的調(diào)度方式不滿足需求,可以通過自定義調(diào)度實(shí)現(xiàn)更靈活的調(diào)度策略。
② 建模訓(xùn)練
深度學(xué)習(xí)訓(xùn)練的細(xì)節(jié)如上圖,用戶通過 WEB 客戶端或 Shell 客戶端提交訓(xùn)練任務(wù),服務(wù)端拿到用戶提交參數(shù),組裝好 K8s 資源和配置 yaml 文件,提交到 K8s 集群。在啟動(dòng)任務(wù)之前,會(huì)通過集群里的 StorageClass 創(chuàng)建好 pvc 對象,作為訓(xùn)練任務(wù)掛盤對象,如果用戶使用的 Tensorflow 框架訓(xùn)練,平臺支持啟動(dòng) Tensorboard,方便查看訓(xùn)練的效果和進(jìn)度,此時(shí)也會(huì)創(chuàng)建 Tensorboard 的負(fù)載對象 Ingress 和 Service。前面準(zhǔn)備工作做完,K8s 會(huì)根據(jù)用戶指定的 GPU、CPU、內(nèi)存及卡類型參數(shù)在集群里通過調(diào)度分配訓(xùn)練任務(wù)到合適的節(jié)點(diǎn),沒有資源會(huì)處于等待狀態(tài),直到有資源可以調(diào)度啟動(dòng)任務(wù)。啟動(dòng)任務(wù)后,先進(jìn)行容器環(huán)境的初始化過程,主要包括配置 Hadoop 相關(guān)權(quán)限,訓(xùn)練數(shù)據(jù)和訓(xùn)練腳本的拉取,初始化工作完成后訓(xùn)練任務(wù)開始運(yùn)行,訓(xùn)練過程中,平臺支持導(dǎo)出中間的訓(xùn)練結(jié)果,訓(xùn)練結(jié)束后,最終結(jié)果會(huì)自動(dòng)輸出到用戶指定的輸出目錄。
③ 深度學(xué)習(xí)分布式訓(xùn)練
如果訓(xùn)練時(shí)間長或者樣本規(guī)模大,超過單臺服務(wù)器能力時(shí),需要支持分布式訓(xùn)練。以 Tensorflow 分布式為例,一個(gè) TensorFlow 分布式程序?qū)?yīng)一個(gè)抽象的集群,集群 ( cluster ) 由工作節(jié)點(diǎn) ( worker ) 和參數(shù)服務(wù)器 ( parameter server ) 組成。工作節(jié)點(diǎn) ( worker ) 承擔(dān)矩陣乘、向量加等具體計(jì)算任務(wù),計(jì)算出相應(yīng)參數(shù) ( weight 和 bias ),并把參數(shù)匯總到參數(shù)服務(wù)器;參數(shù)服務(wù)器 ( parameter server ) 把從眾多工作節(jié)點(diǎn)收集參數(shù)匯總并計(jì)算,并傳遞給相應(yīng)工作節(jié)點(diǎn),由工作節(jié)點(diǎn)進(jìn)行下一輪計(jì)算,如此循環(huán)往復(fù)。
tf.train.ClusterSpec({"worker": ["worker0.example.com:2222",
"worker1.example.com:2222",
"worker2.example.com:2222"],
"ps": ["ps0.example.com:2222",
"ps1.example.com:2222"]})
這些內(nèi)容用戶不需要進(jìn)行配置,只需要在 Tensorflow 組件參數(shù)中設(shè)置 ps 和 worker 的個(gè)數(shù),在啟動(dòng)命令里通過獲取 PS_HOSTS、WORKER_HOSTS、JOB_NAME 和 TASK_INDEX 環(huán)境變量初始化相關(guān)參數(shù),就可以快速啟動(dòng)分布式訓(xùn)練任務(wù),這樣簡化了用戶使用分布式訓(xùn)練的工作量。
平臺構(gòu)建分布式任務(wù)的具體實(shí)現(xiàn)方式時(shí)這樣的,如定義了 m 個(gè) ps,n 個(gè) worker,在 K8s 集群里定義 n 個(gè) Job 對應(yīng)為分布式任務(wù)的 worker,n 個(gè) Job 共享同一份數(shù)據(jù),然后定義 m 個(gè) Deployment 對應(yīng)為分布式任務(wù)的 ps,把每個(gè)角色的網(wǎng)絡(luò)連接方式放置在 ps 和 worker 的環(huán)境變量中供用戶初始化參數(shù)使用,任務(wù)結(jié)束后,訓(xùn)練結(jié)果從 worker-0 導(dǎo)出到 HDFS 中,計(jì)算資源釋放。
4. 模型部署管理
平臺上訓(xùn)練的機(jī)器學(xué)習(xí)模型通過 PMML 格式導(dǎo)出,統(tǒng)一存放在 HDFS 中進(jìn)行維護(hù),通過平臺一鍵部署預(yù)測服務(wù)。對于深度學(xué)習(xí)模型,平臺提供了 ModelZoo 功能,支持用戶上傳模型文件,通過平臺提供的公共深度學(xué)習(xí)框架的 Serving 鏡像啟動(dòng)預(yù)測服務(wù),同時(shí)平臺也支持用戶用自己構(gòu)建的鏡像來部署預(yù)測服務(wù),這樣簡化了算法工程師部署預(yù)測服務(wù)的流程,同時(shí)也不失靈活性。
借助于 K8s 對服務(wù)部署的支持,平臺提供了服務(wù)的伸縮,更新,使服務(wù)流量增長時(shí)能快速實(shí)現(xiàn)服務(wù)的擴(kuò)容,同時(shí)提供了服務(wù)的動(dòng)態(tài)伸縮功能,能做到服務(wù)流量突增時(shí)實(shí)現(xiàn)服務(wù)的自動(dòng)擴(kuò)容,服務(wù)流量下降時(shí)自動(dòng)縮進(jìn)實(shí)例,使服務(wù)端的 GPU 得到一個(gè)合理的利用。
03
平臺成效與應(yīng)用
針對之家算法工程師的實(shí)際業(yè)務(wù)場景需要,深度學(xué)習(xí)平臺支持了目前主流的深度學(xué)習(xí)框架 Tensorflow,Caffe,PaddlePaddle,PyTorch,Keras,Kaldi 等,涉及到圖像、語音、NLP、視頻、推薦、廣告等多個(gè)業(yè)務(wù)領(lǐng)域。如語音的 DeepSpeech 模型,圖像的 ResNet、AlexNet、EfficientNet 模型,NLP 的 bert 模型,推薦廣告的 DeepFM、DCN、DIEN 模型。
平臺上線后,機(jī)器的供需矛盾得到很好的解決,機(jī)器利用率得到很大的提升。上線前算法工程師可用的機(jī)器只有申請的有限的幾臺機(jī)器,上線后可用的是整個(gè)集群的資源,即來即用,不用釋放,平臺對集群里的機(jī)器資源使用進(jìn)行了全方位的監(jiān)控,能實(shí)時(shí)查看計(jì)算資源的使用情況。同時(shí)平臺很好的支持了模型部署,線上環(huán)境隔離,多版本部署,快速啟動(dòng),使機(jī)器學(xué)習(xí)服務(wù)上線效率得到很大提升。
1. 購車意愿模型在機(jī)器學(xué)習(xí)平臺上的應(yīng)用
作為全球訪問量最大的汽車網(wǎng)站,如何從海量的用戶訪問瀏覽行為中發(fā)掘用戶購車的意向或中意的車系車型,一直是汽車之家算法工程人員研究的重點(diǎn)課題。
下面介紹通過 GBDT 模型對用戶的購車意愿進(jìn)行預(yù)測建模。
① 數(shù)據(jù)集介紹
數(shù)據(jù)截圖如下:
② 數(shù)據(jù)探索流程
實(shí)驗(yàn)流程圖如下:
數(shù)據(jù)源準(zhǔn)備
輸入數(shù)據(jù):
用戶瀏覽行為數(shù)據(jù)集:共16503613條數(shù)據(jù)型,包括 "duration"、"freqs_rank" 等特征,"label" 為是否買車。
數(shù)據(jù)來源:汽車之家數(shù)據(jù)倉庫 ( hive )
數(shù)據(jù)預(yù)處理
利用類型轉(zhuǎn)換組建,將數(shù)據(jù)集中的 string 類型轉(zhuǎn)為 float 類型方便后續(xù)的計(jì)算,再利用拆分組建將數(shù)據(jù)集劃分為訓(xùn)練集 ( 占總數(shù)據(jù)集的85% ) 和測試集 ( 占總數(shù)據(jù)集的15% )。
模型訓(xùn)練及預(yù)測
使用機(jī)器學(xué)習(xí)組建中的 GBDT 算法對數(shù)據(jù)集進(jìn)行訓(xùn)練并生成回歸模型,在預(yù)測組件中利用二分類評估組建對預(yù)測集數(shù)據(jù)進(jìn)行了預(yù)測。結(jié)果如下圖所示。
特征重要性評估
通過特征重要性評估組件對模型中的各個(gè)特征進(jìn)行評估計(jì)算出該特征的重要性權(quán)重,評估結(jié)果如下圖所示。
2. 推薦排序模型在機(jī)器學(xué)習(xí)平臺上的應(yīng)用
下面主要從推薦排序模型如何借助機(jī)器學(xué)習(xí)平臺進(jìn)行數(shù)據(jù)接入、數(shù)據(jù)處理、建模、訓(xùn)練等四個(gè)方面進(jìn)行分別闡述。
① 數(shù)據(jù)接入
機(jī)器學(xué)習(xí)平臺支持多種數(shù)據(jù)源接入,目前推薦業(yè)務(wù)的離線數(shù)據(jù)存放在 HDFS 上,實(shí)時(shí)數(shù)據(jù)通過 Flink 接入。
② 數(shù)據(jù)處理
機(jī)器學(xué)習(xí)平臺對常見的數(shù)據(jù)處理方式進(jìn)行了封裝,不僅支持對某些特征的異常值檢測、數(shù)據(jù)分析等功能,還支持對特征數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化、歸一化、降維、分桶等常見的數(shù)據(jù)處理方式,同時(shí)還可以通過自定義sql的方式提供一站式的數(shù)據(jù)處理以及數(shù)據(jù)可視化分析。
③ 建模
機(jī)器學(xué)習(xí)平臺目前支持上百種組件,對推薦排序場景提供了全方位的支持。其中模型不僅支持 LR、GBDT、XGB 等傳統(tǒng)的機(jī)器學(xué)習(xí)模型,同時(shí)還支持常見的深度學(xué)習(xí)模型,如 FM、Wide&Deep、DeepFM、DCN 等,下圖將展示 online DeepFM 在機(jī)器學(xué)習(xí)上應(yīng)用的實(shí)例。
建模過程中,傳統(tǒng)的機(jī)器學(xué)習(xí)模型可以通過自動(dòng)化的調(diào)參方式進(jìn)行主要參數(shù)設(shè)置,常見的深度學(xué)習(xí)模型提供了部分參數(shù)的配置,如網(wǎng)絡(luò)層數(shù),dense embedding 的維數(shù),學(xué)習(xí)率衰減系數(shù)等,這為模型的訓(xùn)練帶來很大的便利。
④ 訓(xùn)練
之家的推薦排序模型經(jīng)歷了從傳統(tǒng)的機(jī)器學(xué)習(xí)模型 LR、xgb 到 FM 、Wide&Deep、DeepFM、DIN、MMOE 等深度學(xué)習(xí)模型的迭代演進(jìn)。之家首頁推薦每天會(huì)產(chǎn)生上億條日志數(shù)據(jù),經(jīng)過數(shù)據(jù)清理后,訓(xùn)練樣本數(shù)據(jù)量達(dá)到百 G 甚至 T 級別,面對如此大規(guī)模的數(shù)據(jù),如何有效的縮短算法的訓(xùn)練時(shí)間成為了關(guān)鍵。
傳統(tǒng)的機(jī)器學(xué)習(xí)模型如 LR,XGB 等基于 Spark 進(jìn)行分布式的訓(xùn)練,訓(xùn)練時(shí)間在小時(shí)級別,較為可控。但是深度學(xué)習(xí)模型對于大數(shù)據(jù)量,訓(xùn)練時(shí)間相對較長,K80 單卡訓(xùn)練需要近一周的時(shí)間,V100 單卡訓(xùn)練需要4天。為了縮短訓(xùn)練時(shí)間,快速迭代模型,我們采用了多機(jī)多卡式的訓(xùn)練方式 ,以 Tensorflow 為例,采用 Multi Worker MirroredStrategy 的方式,Multi Worker MirroredStrategy不需要 Parameter server,只需要設(shè)置一系列的 TF_CONFIG 環(huán)境變量,這樣降低了多機(jī)多卡的調(diào)試難度,實(shí)例如下:
同時(shí)機(jī)器學(xué)習(xí)平臺深度學(xué)習(xí)部分可以靈活的選擇訓(xùn)練方式以及參數(shù)設(shè)置,如下圖所示:
采用多機(jī)多卡訓(xùn)練的方式將深度學(xué)習(xí)模型如 DeepFM、Wide&deep 等訓(xùn)練時(shí)間壓縮在 24h 內(nèi),基本處于可接受范圍內(nèi)。
為了讓模型能夠分鐘級迭代,并能實(shí)時(shí)的反饋給推薦系統(tǒng),機(jī)器學(xué)習(xí)平臺提供了分鐘級實(shí)時(shí)訓(xùn)練功能,并對訓(xùn)練好的模型進(jìn)行評估指標(biāo)的驗(yàn)證和更新上線。實(shí)時(shí)訓(xùn)練的流程主要是通過 Flink 接入實(shí)時(shí)日志數(shù)據(jù),將每十分鐘收集的數(shù)據(jù)存放在 HDFS 上,然后在機(jī)器學(xué)習(xí)平臺上制定定時(shí)任務(wù),進(jìn)行特征工程和模型訓(xùn)練,訓(xùn)練完畢后經(jīng)過評估指標(biāo)的驗(yàn)證判斷是否進(jìn)行模型更新,具體流程圖如下:
機(jī)器學(xué)習(xí)平臺為推薦排序提供了一站式的全流程支持,從數(shù)據(jù)處理、建模、訓(xùn)練、模型評估以及模型上線,實(shí)現(xiàn)了分鐘級迭代模型。平臺的建立大大提高了推薦排序模型的迭代速度,提升了算法工程師的工作效率,為之家推薦排序業(yè)務(wù)的發(fā)展提供了有力保障。
04
平臺展望
1. 增加算法組件
平臺經(jīng)過兩個(gè)版本的迭代,解決了資源利用率低和算法工作重復(fù)的問題,隨著接入用戶和業(yè)務(wù)的增加,對平臺也提出了更高的要求。如推薦業(yè)務(wù)里,在線機(jī)器學(xué)習(xí)幾乎是繞不開的話題,為了更好的支持在線機(jī)器學(xué)習(xí),我們接下來會(huì)融入在線機(jī)器學(xué)習(xí)的組件。類似這種業(yè)務(wù)場景會(huì)越來越多,我們會(huì)根據(jù)業(yè)務(wù)需要加入更多的算法組件。
2. GPU卡共享
無論是訓(xùn)練任務(wù)還是服務(wù)部署,用到的 GPU 卡都是獨(dú)享的,訓(xùn)練任務(wù)的 GPU 卡利用率一般都比較高,大部分在50%以上,部署的服務(wù)隨著 TPS 的增長而增長,GPU 卡的實(shí)際利用率都不高,為了提升服務(wù)實(shí)例的 GPU 卡利用率就要提供 GPU 卡的共享。解決方式一般有兩種,一種是 GPU 虛擬化,像虛擬機(jī)的 CPU 一樣,目前 Nvidia 提供這種虛擬化服務(wù),但是 License 費(fèi)用昂貴;另外一種方式通過修改 K8s 的調(diào)度策略,來支持非整數(shù)卡的調(diào)度分配。后面會(huì)基于第二種方式嘗試實(shí)現(xiàn) GPU 卡的共享。
今天的分享就到這里,謝謝大家。
文章作者:
田董濤,汽車之家高級算法工程師。2017年加入汽車之家,汽車之家機(jī)器學(xué)習(xí)平臺負(fù)責(zé)人,目前在汽車之家負(fù)責(zé)機(jī)器學(xué)習(xí)平臺的架構(gòu)和開發(fā)工作。
王若愚,汽車之家算法工程師。2018年加入汽車之家,目前主要從事推薦排序和機(jī)器學(xué)習(xí)平臺相關(guān)工作。
方矩,汽車之家算法工程師。2018年加入汽車之家,目前主要從事推薦排序算法相關(guān)工作。
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:
長按訂閱更多精彩▼
如有收獲,點(diǎn)個(gè)在看,誠摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!