郝曉培,單杏花,李 永,王煒煒
(1. 中國(guó)鐵道科學(xué)研究院集團(tuán)有限公司 電子計(jì)算技術(shù)研究所,北京 100081;2. 北京經(jīng)緯信息技術(shù)有限公司,北京 100081)
隨著人工智能及鐵路信息技術(shù)的快速發(fā)展,深度學(xué)習(xí)在鐵路客運(yùn)營(yíng)銷中得到了廣泛的應(yīng)用,為鐵路客運(yùn)流量預(yù)測(cè),客運(yùn)廣告推薦,12306互聯(lián)網(wǎng)售票系統(tǒng)異常用戶識(shí)別等提供了大量的解決方案以及業(yè)務(wù)指導(dǎo)[1]。
理想的深度學(xué)習(xí)訓(xùn)練模型需要綜合考慮訓(xùn)練數(shù)據(jù)的選擇及處理,模型算法選擇、參數(shù)的調(diào)試、訓(xùn)練資源分配、模型訓(xùn)練速度等諸多問(wèn)題。算法工程師需要花費(fèi)大量的時(shí)間進(jìn)行深度學(xué)習(xí)集群部署(擴(kuò)容)、框架安裝及硬件資源的分配等繁雜的工作,嚴(yán)重影響了鐵路客運(yùn)營(yíng)銷深度學(xué)習(xí)模型訓(xùn)練結(jié)果的效率及準(zhǔn)確性,亟需研究新方案提高深度學(xué)習(xí)模型開(kāi)發(fā)的效率及硬件資源的利用率。
目前,國(guó)內(nèi)外在深度學(xué)習(xí)及容器云計(jì)算方面得到了廣泛的應(yīng)用,翁湦元等人成功地將鐵旅App遷移到Kubernetes云平臺(tái),有效提高了研發(fā)效率并降低了運(yùn)維成本[2];Google推出支持分布式訓(xùn)練的TensorFlow深度學(xué)習(xí)框架有效的提高了單機(jī)深度學(xué)習(xí)模型的訓(xùn)練效率等[3],在學(xué)術(shù)界以及工業(yè)界取得了重大的成果,已經(jīng)成為各科技公司主流研發(fā)方向。本文在前人研究的基礎(chǔ)上結(jié)合鐵路客運(yùn)營(yíng)銷[4]深度學(xué)習(xí)平臺(tái)的需求及特點(diǎn),將容器云技術(shù)與深度學(xué)習(xí)相結(jié)合進(jìn)行部署,實(shí)現(xiàn)了平臺(tái)資源隔離,動(dòng)態(tài)部署,模型統(tǒng)一化管理等功能,提高了平臺(tái)的資源利用率,降低深度學(xué)習(xí)模型的開(kāi)發(fā)周期。
深度學(xué)習(xí)計(jì)算模型采用多個(gè)數(shù)據(jù)處理層進(jìn)行訓(xùn)練,在語(yǔ)音識(shí)別、圖像識(shí)別、自然語(yǔ)言處理、分類預(yù)測(cè)、產(chǎn)品推薦等眾多領(lǐng)域發(fā)揮著巨大的作用。TensorFlow作為谷歌開(kāi)源的第二代人工智能學(xué)習(xí)系統(tǒng),其創(chuàng)建了神經(jīng)網(wǎng)絡(luò)算法庫(kù),提供了深度學(xué)習(xí)模型快速便捷的構(gòu)建方式[5],受到學(xué)術(shù)界以及工業(yè)界的廣泛關(guān)注。
目前,鐵路客運(yùn)深度學(xué)習(xí)平臺(tái)基于TensorFlow構(gòu)建,隨著鐵路客運(yùn)業(yè)務(wù)需求及數(shù)據(jù)樣本的復(fù)雜化,為保證深度學(xué)習(xí)模型的有效性,其對(duì)應(yīng)的結(jié)構(gòu)包含的層次越來(lái)越多,從而訓(xùn)練速度逐漸成為制約業(yè)務(wù)預(yù)測(cè)分析發(fā)展的阻力,提高模型訓(xùn)練速度的需求與日俱增。雖然TensorFlow從1.4版本已經(jīng)提供了分布式并行相關(guān)的API,但其仍然具有無(wú)法完成資源隔離、缺乏資源調(diào)度、樣本數(shù)據(jù)及訓(xùn)練好的模型難以保存、進(jìn)程遺留、數(shù)據(jù)讀取效率低、擴(kuò)容難度大等缺點(diǎn),因此,急需研究并設(shè)計(jì)一套完善的深度學(xué)習(xí)平臺(tái)以提高模型訓(xùn)練速度。
容器技術(shù)近幾年得到了快速的發(fā)展,已經(jīng)成為業(yè)界廣泛使用的服務(wù)器資源共享的方式。與傳統(tǒng)的虛擬化技術(shù)相比,容器技術(shù)以應(yīng)用為中心,與宿主機(jī)共用內(nèi)核,使各應(yīng)用資源利用率更高,同時(shí)各個(gè)容器之間資源相互隔離,保障了應(yīng)用運(yùn)行的獨(dú)立性,為應(yīng)用運(yùn)行周期的管理提供了便利。
隨著容器技術(shù)的廣泛使用及容器數(shù)據(jù)的劇增,谷歌開(kāi)源了Kubernetes[6]為大規(guī)模容器的編排提供了方案,可以基于業(yè)務(wù)需要,動(dòng)態(tài)調(diào)整容器數(shù)量,實(shí)現(xiàn)計(jì)算資源的快速擴(kuò)容或縮減以調(diào)整計(jì)算資源,提高計(jì)算資源的利用率。Kubernetes集群具有容器資源相互隔離、資源靈活調(diào)度、容器API接口管理、兼容多種分布式存儲(chǔ)系統(tǒng)、創(chuàng)建快捷等優(yōu)點(diǎn),能夠解決目前鐵路客運(yùn)營(yíng)銷深度學(xué)習(xí)平臺(tái)TensorFlow所面臨的問(wèn)題。
基于Kubernetes的客運(yùn)營(yíng)銷深度學(xué)習(xí)平臺(tái)整體框架,如圖1所示,主要包括訪問(wèn)控制層、應(yīng)用服務(wù)層、Kubernetes 平臺(tái)即服務(wù)(PaaS)層及物理資源管理層。
圖1 基于Kubernetes的客運(yùn)營(yíng)銷深度學(xué)習(xí)平臺(tái)整體架構(gòu)
(1)訪問(wèn)控制層:支持Http接口接入、SDK登錄及SSH登錄3種接入方式。對(duì)平臺(tái)中的用戶進(jìn)行鑒權(quán)及權(quán)限控制,提供統(tǒng)一的用戶登錄訪問(wèn)接口,獲得相應(yīng)權(quán)限的用戶可以使用Kubernetes PaaS層相應(yīng)的服務(wù),包括TensorFlow容器部署、任務(wù)提交引擎管理、模型設(shè)計(jì)等。
(2)應(yīng)用服務(wù)層:主要部署深度學(xué)習(xí)平臺(tái)相應(yīng)的應(yīng)用程序,包括深度學(xué)習(xí)框架TensorFlow、內(nèi)部服務(wù)通信模塊消息隊(duì)列MQ、Kubernetes集群管理服務(wù)、深度學(xué)習(xí)模型訓(xùn)練API服務(wù)等。
(3)Kubernetes PaaS層:將深度學(xué)習(xí)平臺(tái)相關(guān)的API服務(wù)、消息隊(duì)列、TensorFlow等應(yīng)用進(jìn)行容器化,將其部署到基于Kubernetes的PaaS層中,實(shí)現(xiàn)應(yīng)用服務(wù)資源分配、生命周期等統(tǒng)一化管理控制。
(4)物理資源管理層:為PaaS提供硬件計(jì)算資源,包括物理機(jī)、虛擬機(jī)等。
Kubernetes集群負(fù)責(zé)平臺(tái)相關(guān)服務(wù)的部署及運(yùn)行,用戶可以自定義創(chuàng)建Tensorflow容器云集群、接口訪問(wèn)控制服務(wù)集群等,使各個(gè)服務(wù)環(huán)境配置更加簡(jiǎn)單,方便容器化服務(wù)的創(chuàng)建、擴(kuò)容、管理和更新,在一定程度上起到了負(fù)載均衡的作用。
為了保證客運(yùn)營(yíng)銷深度學(xué)習(xí)平臺(tái)安全可靠的運(yùn)行,Kubernetes集群進(jìn)行高可用部署,其元數(shù)據(jù)管理信息存儲(chǔ)介質(zhì)采用ETCD集群模式以解決ETCD單點(diǎn)宕機(jī)帶來(lái)的影響[7],基于深度學(xué)習(xí)平臺(tái)的應(yīng)用方式,Kubernetes中需要運(yùn)行大量不同種類的容器,容器運(yùn)行的基本單位為Pod,在Pod中運(yùn)行的容器之間共享物理機(jī),其架構(gòu)圖,如圖2所示。
圖2 Kubernetes 基本架構(gòu)
(1)API Server:客戶端訪問(wèn)集群 Node、Pod及Service的通道,處理相關(guān)業(yè)務(wù)邏輯并將其相關(guān)的結(jié)果狀態(tài)實(shí)時(shí)保存到ETCD集群中。
(2)ETCD集群:存儲(chǔ)Kubernetes集群的狀態(tài)信息及訪問(wèn)API Server返回的結(jié)果狀態(tài)信息。
(3)Controller-manager:包含多種控制器,實(shí)現(xiàn)集群級(jí)別的功能,包括生命周期管理、API業(yè)務(wù)邏輯、服務(wù)發(fā)現(xiàn)、路由等功能。
(4)Scheduler:基于調(diào)度策略經(jīng)過(guò)Node預(yù)選,Node優(yōu)先實(shí)現(xiàn)Pod的自動(dòng)化部署。
(5)Kubelet:負(fù)責(zé)驅(qū)動(dòng)容器執(zhí)行層,管理Pod、容器、鏡像、數(shù)據(jù)卷等,實(shí)現(xiàn)集群對(duì)節(jié)點(diǎn)的管理,并實(shí)時(shí)同步運(yùn)行狀態(tài)到API Server。
(6)Kube-peoxy:提供服務(wù)到Pod的負(fù)載均衡。
基于Kubernetes的客運(yùn)營(yíng)銷深度學(xué)習(xí)平臺(tái)的應(yīng)用服務(wù)層包含多個(gè)模塊,最主要的是深度學(xué)習(xí)任務(wù)處理引擎,深度學(xué)習(xí)模型操作API服務(wù),具體功能模塊設(shè)計(jì),如圖3所示。
深度學(xué)習(xí)模型操作API服務(wù)主要接收經(jīng)過(guò)訪問(wèn)控制層鑒權(quán)的用戶訪問(wèn)請(qǐng)求,為其提供想用的服務(wù),該服務(wù)進(jìn)行容器化處理并部署到Kubernetes集群中,以容器的形式通過(guò)PaaS平臺(tái)為用戶提供模型服務(wù),主要操作流程,如圖4所示。
圖3 功能模塊設(shè)計(jì)
圖4 深度學(xué)習(xí)模型操作 API服務(wù)流程
目前,鐵路客運(yùn)數(shù)據(jù)存儲(chǔ)在多種數(shù)據(jù)庫(kù)中,有的數(shù)據(jù)庫(kù)與Kubernetes集群兼容性較差,為了滿足深度學(xué)習(xí)平臺(tái)樣本數(shù)據(jù)的統(tǒng)一化管理,選擇與分布式集群TensorFlow兼容較好的HDFS作為樣本的存儲(chǔ)介質(zhì),開(kāi)發(fā)深度學(xué)習(xí)模型操作數(shù)據(jù)樣本抽取API服務(wù),通過(guò)基于Demio的DAAS平臺(tái)實(shí)現(xiàn)樣本數(shù)據(jù)的采集,將其抽取到HDFS中,以實(shí)現(xiàn)Kubernetes集群對(duì)外部數(shù)據(jù)的使用。
以ClusterFS作為Kubernetes中高可用的分布式存儲(chǔ)主要存儲(chǔ)用戶提交的TensorFlow模型代碼,模型訓(xùn)練的日志、訓(xùn)練模型的導(dǎo)入和導(dǎo)出。ClusterFS分布式存儲(chǔ)系統(tǒng)具有良好的擴(kuò)展性和存儲(chǔ)能力,并且與Kubernetes集群兼容性較高,能夠部署在Kubernetes集群中,將底層限制的存儲(chǔ)資源集中起來(lái)提供服務(wù),提高了存儲(chǔ)資源利用率。
深度學(xué)習(xí)模型操作API服務(wù)主要包括以下模塊。
(1)數(shù)據(jù)源配置
鐵路客運(yùn)營(yíng)銷數(shù)據(jù)采用多種類型的數(shù)據(jù)庫(kù),存儲(chǔ)不同維度或分區(qū)的數(shù)據(jù),數(shù)據(jù)源配置針對(duì)不同類型的數(shù)據(jù)設(shè)計(jì)統(tǒng)一的管理及訪問(wèn)接口,實(shí)現(xiàn)客運(yùn)營(yíng)銷數(shù)據(jù)透明訪問(wèn)。
(2)樣本選擇及預(yù)處理
分析業(yè)務(wù)需求,基于客運(yùn)營(yíng)銷數(shù)據(jù)挑選樣本數(shù)據(jù)及樣本特征;設(shè)計(jì)深度學(xué)習(xí)樣本處理引擎及基于不同處理方式的處理器,對(duì)樣本特征進(jìn)行預(yù)處理,并將其集中存儲(chǔ)到統(tǒng)一的數(shù)據(jù)庫(kù)中,提高樣本數(shù)據(jù)質(zhì)量以樣本提取速度,從而為模型訓(xùn)練提供數(shù)據(jù)保障。
(3)深度學(xué)習(xí)模型管理
針對(duì)基于TensorFlow的深度學(xué)習(xí)進(jìn)行模塊化開(kāi)發(fā),實(shí)現(xiàn)數(shù)據(jù)處理、模型代碼上傳、參數(shù)控制、優(yōu)化方案、結(jié)果存儲(chǔ)等可配置任務(wù)構(gòu)建,提高數(shù)據(jù)分析工程師模型開(kāi)發(fā)效率。
(4)項(xiàng)目配置管理
針對(duì)業(yè)務(wù)需求及模型訓(xùn)練任務(wù)進(jìn)行管理,包括需求、腳本、配置、任務(wù)的管理,基于該模塊可以查看平臺(tái)所有的業(yè)務(wù)需求及模型訓(xùn)練任務(wù),并對(duì)業(yè)務(wù)需求及任務(wù)的新建、修改、刪除等提供基本的操作。
(5)模型托管
將平臺(tái)訓(xùn)練好的模型以gRPC的形式對(duì)外提供服務(wù),以減少模型上線周期,綜合考慮現(xiàn)有方案,采用Google主導(dǎo)的開(kāi)源項(xiàng)目TensorFlowServing實(shí)現(xiàn)[8],該項(xiàng)目支持多種形式(包括定制)的Serving服務(wù)方式,用戶只需要編寫(xiě)客戶端,通過(guò)gRPC調(diào)用訓(xùn)練好的模型服務(wù)即可獲得相應(yīng)的結(jié)果。
深度學(xué)習(xí)任務(wù)處理引擎是與深度學(xué)習(xí)框架Tensor-Flow交互的唯一通道,通過(guò)深度學(xué)習(xí)模型操作API服務(wù)進(jìn)行相應(yīng)的任務(wù)提交、任務(wù)查詢等操作,處理引擎對(duì)模型操作提交的信息進(jìn)行解析并調(diào)用Kubernetes中的API Server,并將創(chuàng)建過(guò)程及相關(guān)數(shù)據(jù)信息存儲(chǔ)到CluserFS中,返回實(shí)時(shí)的任務(wù)信息,主要流程,如圖5所示。
深度學(xué)習(xí)任務(wù)處理引擎進(jìn)行容器化處理并將其部署到Kubernets集群中,其通過(guò)Kubernetes集群的API Server動(dòng)態(tài)的創(chuàng)建或者刪除TensorFlow深度學(xué)習(xí)任務(wù),基于提交任務(wù)的工作難度通過(guò)Controller Manager及Scheduler進(jìn)行TensorFlow容器的擴(kuò)容及編排[9]。
圖5 深度學(xué)習(xí)任務(wù)處理引擎工作流程
深度學(xué)習(xí)任務(wù)處理引擎主要包括以下模塊。
(1)任務(wù)提交
對(duì)外提供HTTP接口,接收用戶提交的模型訓(xùn)練任務(wù),將訓(xùn)練任務(wù)的模型類別、樣本信息、訓(xùn)練參數(shù)等存儲(chǔ)到數(shù)據(jù)庫(kù)中,并進(jìn)行任務(wù)正確性校驗(yàn)任務(wù)以及調(diào)度方式選擇,將校驗(yàn)通過(guò)的任務(wù)添加到對(duì)應(yīng)的調(diào)度隊(duì)列中。
(2)任務(wù)調(diào)度
基于模型訓(xùn)練任務(wù)特點(diǎn),設(shè)計(jì)不同的任務(wù)調(diào)度策略以及調(diào)度隊(duì)列,如快速隊(duì)列、慢速隊(duì)列等,將隊(duì)列中的任務(wù)進(jìn)行調(diào)度消費(fèi),基于不同的策略從隊(duì)列中獲取未執(zhí)行的任務(wù),并基于任務(wù)的特點(diǎn)進(jìn)行分發(fā),將任務(wù)提交到任務(wù)執(zhí)行模塊進(jìn)行處理。
(3)任務(wù)執(zhí)行
基于模型訓(xùn)練任務(wù)的特點(diǎn),將任務(wù)拆分成多個(gè)子任務(wù),利用Kubernetes虛擬化技術(shù),將拆分后的任務(wù)提交到Kubernetes集群中,基于自身需要的資源申請(qǐng)相應(yīng)的Pod,每個(gè)Pod執(zhí)行一個(gè)子任務(wù),保證子任務(wù)相互隔離,從而實(shí)現(xiàn)模型訓(xùn)練任務(wù)的分布式執(zhí)行,提高資源利用率以及訓(xùn)練速度。
(4)任務(wù)監(jiān)控控制
任務(wù)在Kubernets集群中運(yùn)行的同時(shí),需要利用Kubernetes自帶的監(jiān)控服務(wù),實(shí)時(shí)采集Event和Pod詳細(xì)信息至自定義隊(duì)列中,并對(duì)其進(jìn)行消費(fèi)解析,對(duì)任務(wù)可能遇到的問(wèn)題(如掛載失敗、node分配失敗等)進(jìn)行實(shí)時(shí)監(jiān)控,基于任務(wù)監(jiān)控采集到Event與Pod信息,任務(wù)控制對(duì)其進(jìn)行解析,針對(duì)不同的情況設(shè)置不通的處理器,將任務(wù)的運(yùn)行狀態(tài)及相應(yīng)的Event的信息回傳到深度學(xué)習(xí)模型操作API服務(wù)平臺(tái),并更新任務(wù)狀態(tài)。
為驗(yàn)證該方案的有效性,根據(jù)實(shí)際情況,選擇5臺(tái)物理機(jī)進(jìn)行部署,其配置如表1所示,主要軟件環(huán)境為:Kubernetes 2.0,Tensorflow 2.0,Python 3.6 等。
表1 物理機(jī)配置
在5臺(tái)物理機(jī)上部署Kubernetes集群,將各個(gè)應(yīng)用以容器的形式部署在Kubernetes集群中。開(kāi)發(fā)基于用戶畫(huà)像系統(tǒng)的高價(jià)值用戶分析模型,通過(guò)深度學(xué)習(xí)模型操作API服務(wù)將樣本數(shù)據(jù)進(jìn)行處理并提交模型代碼到不同的Kubernetes節(jié)點(diǎn)。任務(wù)提交之后,平臺(tái)自動(dòng)創(chuàng)建5個(gè)TensorFlow容器節(jié)點(diǎn)進(jìn)行模型訓(xùn)練,同時(shí),本文主要對(duì)TensorFlow單機(jī)部署及相同環(huán)境的分布式部署進(jìn)行了測(cè)試,測(cè)試結(jié)果,如表2所示。
表2 運(yùn)行情況對(duì)比
綜上所述,容器化部署縮短了集群的部署調(diào)試時(shí)間,減少了TensorFlow分布式節(jié)點(diǎn)部署的流程,實(shí)現(xiàn)了資源的動(dòng)態(tài)透明調(diào)度及所有操作的Http接口服務(wù),為算法工程師簡(jiǎn)化了操作流程。
本文基于Kubernetes容器技術(shù)及TensorFlow深度學(xué)習(xí)框架進(jìn)行研究,結(jié)合鐵路客運(yùn)業(yè)務(wù)的特點(diǎn),設(shè)計(jì)并實(shí)現(xiàn)了一套基于容器的深度學(xué)習(xí)平臺(tái)?;贙ubernetes優(yōu)秀的資源調(diào)度及管理框架,實(shí)現(xiàn)了TensorFlow深度學(xué)習(xí)集群,以及其他應(yīng)用服務(wù)的自動(dòng)化部署、計(jì)算資源動(dòng)態(tài)擴(kuò)容,解決了客運(yùn)目前面臨的數(shù)據(jù)量大,計(jì)算復(fù)雜等深度學(xué)習(xí)問(wèn)題。實(shí)踐證明,該平臺(tái)極大地提高了算法工程師的開(kāi)發(fā)效率和模型的訓(xùn)練速度,具有良好的應(yīng)用前景。