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