郝曉培,單杏花,李 永,王煒煒
(1. 中國鐵道科學研究院集團有限公司 電子計算技術研究所,北京 100081;2. 北京經緯信息技術有限公司,北京 100081)
隨著人工智能及鐵路信息技術的快速發展,深度學習在鐵路客運營銷中得到了廣泛的應用,為鐵路客運流量預測,客運廣告推薦,12306互聯網售票系統異常用戶識別等提供了大量的解決方案以及業務指導[1]。
理想的深度學習訓練模型需要綜合考慮訓練數據的選擇及處理,模型算法選擇、參數的調試、訓練資源分配、模型訓練速度等諸多問題。算法工程師需要花費大量的時間進行深度學習集群部署(擴容)、框架安裝及硬件資源的分配等繁雜的工作,嚴重影響了鐵路客運營銷深度學習模型訓練結果的效率及準確性,亟需研究新方案提高深度學習模型開發的效率及硬件資源的利用率。
目前,國內外在深度學習及容器云計算方面得到了廣泛的應用,翁湦元等人成功地將鐵旅App遷移到Kubernetes云平臺,有效提高了研發效率并降低了運維成本[2];Google推出支持分布式訓練的TensorFlow深度學習框架有效的提高了單機深度學習模型的訓練效率等[3],在學術界以及工業界取得了重大的成果,已經成為各科技公司主流研發方向。本文在前人研究的基礎上結合鐵路客運營銷[4]深度學習平臺的需求及特點,將容器云技術與深度學習相結合進行部署,實現了平臺資源隔離,動態部署,模型統一化管理等功能,提高了平臺的資源利用率,降低深度學習模型的開發周期。
深度學習計算模型采用多個數據處理層進行訓練,在語音識別、圖像識別、自然語言處理、分類預測、產品推薦等眾多領域發揮著巨大的作用。TensorFlow作為谷歌開源的第二代人工智能學習系統,其創建了神經網絡算法庫,提供了深度學習模型快速便捷的構建方式[5],受到學術界以及工業界的廣泛關注。
目前,鐵路客運深度學習平臺基于TensorFlow構建,隨著鐵路客運業務需求及數據樣本的復雜化,為保證深度學習模型的有效性,其對應的結構包含的層次越來越多,從而訓練速度逐漸成為制約業務預測分析發展的阻力,提高模型訓練速度的需求與日俱增。雖然TensorFlow從1.4版本已經提供了分布式并行相關的API,但其仍然具有無法完成資源隔離、缺乏資源調度、樣本數據及訓練好的模型難以保存、進程遺留、數據讀取效率低、擴容難度大等缺點,因此,急需研究并設計一套完善的深度學習平臺以提高模型訓練速度。
容器技術近幾年得到了快速的發展,已經成為業界廣泛使用的服務器資源共享的方式。與傳統的虛擬化技術相比,容器技術以應用為中心,與宿主機共用內核,使各應用資源利用率更高,同時各個容器之間資源相互隔離,保障了應用運行的獨立性,為應用運行周期的管理提供了便利。
隨著容器技術的廣泛使用及容器數據的劇增,谷歌開源了Kubernetes[6]為大規模容器的編排提供了方案,可以基于業務需要,動態調整容器數量,實現計算資源的快速擴容或縮減以調整計算資源,提高計算資源的利用率。Kubernetes集群具有容器資源相互隔離、資源靈活調度、容器API接口管理、兼容多種分布式存儲系統、創建快捷等優點,能夠解決目前鐵路客運營銷深度學習平臺TensorFlow所面臨的問題。
基于Kubernetes的客運營銷深度學習平臺整體框架,如圖1所示,主要包括訪問控制層、應用服務層、Kubernetes 平臺即服務(PaaS)層及物理資源管理層。

圖1 基于Kubernetes的客運營銷深度學習平臺整體架構
(1)訪問控制層:支持Http接口接入、SDK登錄及SSH登錄3種接入方式。對平臺中的用戶進行鑒權及權限控制,提供統一的用戶登錄訪問接口,獲得相應權限的用戶可以使用Kubernetes PaaS層相應的服務,包括TensorFlow容器部署、任務提交引擎管理、模型設計等。
(2)應用服務層:主要部署深度學習平臺相應的應用程序,包括深度學習框架TensorFlow、內部服務通信模塊消息隊列MQ、Kubernetes集群管理服務、深度學習模型訓練API服務等。
(3)Kubernetes PaaS層:將深度學習平臺相關的API服務、消息隊列、TensorFlow等應用進行容器化,將其部署到基于Kubernetes的PaaS層中,實現應用服務資源分配、生命周期等統一化管理控制。
(4)物理資源管理層:為PaaS提供硬件計算資源,包括物理機、虛擬機等。
Kubernetes集群負責平臺相關服務的部署及運行,用戶可以自定義創建Tensorflow容器云集群、接口訪問控制服務集群等,使各個服務環境配置更加簡單,方便容器化服務的創建、擴容、管理和更新,在一定程度上起到了負載均衡的作用。
為了保證客運營銷深度學習平臺安全可靠的運行,Kubernetes集群進行高可用部署,其元數據管理信息存儲介質采用ETCD集群模式以解決ETCD單點宕機帶來的影響[7],基于深度學習平臺的應用方式,Kubernetes中需要運行大量不同種類的容器,容器運行的基本單位為Pod,在Pod中運行的容器之間共享物理機,其架構圖,如圖2所示。

圖2 Kubernetes 基本架構
(1)API Server:客戶端訪問集群 Node、Pod及Service的通道,處理相關業務邏輯并將其相關的結果狀態實時保存到ETCD集群中。
(2)ETCD集群:存儲Kubernetes集群的狀態信息及訪問API Server返回的結果狀態信息。
(3)Controller-manager:包含多種控制器,實現集群級別的功能,包括生命周期管理、API業務邏輯、服務發現、路由等功能。
(4)Scheduler:基于調度策略經過Node預選,Node優先實現Pod的自動化部署。
(5)Kubelet:負責驅動容器執行層,管理Pod、容器、鏡像、數據卷等,實現集群對節點的管理,并實時同步運行狀態到API Server。
(6)Kube-peoxy:提供服務到Pod的負載均衡。
基于Kubernetes的客運營銷深度學習平臺的應用服務層包含多個模塊,最主要的是深度學習任務處理引擎,深度學習模型操作API服務,具體功能模塊設計,如圖3所示。
深度學習模型操作API服務主要接收經過訪問控制層鑒權的用戶訪問請求,為其提供想用的服務,該服務進行容器化處理并部署到Kubernetes集群中,以容器的形式通過PaaS平臺為用戶提供模型服務,主要操作流程,如圖4所示。

圖3 功能模塊設計

圖4 深度學習模型操作 API服務流程
目前,鐵路客運數據存儲在多種數據庫中,有的數據庫與Kubernetes集群兼容性較差,為了滿足深度學習平臺樣本數據的統一化管理,選擇與分布式集群TensorFlow兼容較好的HDFS作為樣本的存儲介質,開發深度學習模型操作數據樣本抽取API服務,通過基于Demio的DAAS平臺實現樣本數據的采集,將其抽取到HDFS中,以實現Kubernetes集群對外部數據的使用。
以ClusterFS作為Kubernetes中高可用的分布式存儲主要存儲用戶提交的TensorFlow模型代碼,模型訓練的日志、訓練模型的導入和導出。ClusterFS分布式存儲系統具有良好的擴展性和存儲能力,并且與Kubernetes集群兼容性較高,能夠部署在Kubernetes集群中,將底層限制的存儲資源集中起來提供服務,提高了存儲資源利用率。
深度學習模型操作API服務主要包括以下模塊。
(1)數據源配置
鐵路客運營銷數據采用多種類型的數據庫,存儲不同維度或分區的數據,數據源配置針對不同類型的數據設計統一的管理及訪問接口,實現客運營銷數據透明訪問。
(2)樣本選擇及預處理
分析業務需求,基于客運營銷數據挑選樣本數據及樣本特征;設計深度學習樣本處理引擎及基于不同處理方式的處理器,對樣本特征進行預處理,并將其集中存儲到統一的數據庫中,提高樣本數據質量以樣本提取速度,從而為模型訓練提供數據保障。
(3)深度學習模型管理
針對基于TensorFlow的深度學習進行模塊化開發,實現數據處理、模型代碼上傳、參數控制、優化方案、結果存儲等可配置任務構建,提高數據分析工程師模型開發效率。
(4)項目配置管理
針對業務需求及模型訓練任務進行管理,包括需求、腳本、配置、任務的管理,基于該模塊可以查看平臺所有的業務需求及模型訓練任務,并對業務需求及任務的新建、修改、刪除等提供基本的操作。
(5)模型托管
將平臺訓練好的模型以gRPC的形式對外提供服務,以減少模型上線周期,綜合考慮現有方案,采用Google主導的開源項目TensorFlowServing實現[8],該項目支持多種形式(包括定制)的Serving服務方式,用戶只需要編寫客戶端,通過gRPC調用訓練好的模型服務即可獲得相應的結果。
深度學習任務處理引擎是與深度學習框架Tensor-Flow交互的唯一通道,通過深度學習模型操作API服務進行相應的任務提交、任務查詢等操作,處理引擎對模型操作提交的信息進行解析并調用Kubernetes中的API Server,并將創建過程及相關數據信息存儲到CluserFS中,返回實時的任務信息,主要流程,如圖5所示。
深度學習任務處理引擎進行容器化處理并將其部署到Kubernets集群中,其通過Kubernetes集群的API Server動態的創建或者刪除TensorFlow深度學習任務,基于提交任務的工作難度通過Controller Manager及Scheduler進行TensorFlow容器的擴容及編排[9]。

圖5 深度學習任務處理引擎工作流程
深度學習任務處理引擎主要包括以下模塊。
(1)任務提交
對外提供HTTP接口,接收用戶提交的模型訓練任務,將訓練任務的模型類別、樣本信息、訓練參數等存儲到數據庫中,并進行任務正確性校驗任務以及調度方式選擇,將校驗通過的任務添加到對應的調度隊列中。
(2)任務調度
基于模型訓練任務特點,設計不同的任務調度策略以及調度隊列,如快速隊列、慢速隊列等,將隊列中的任務進行調度消費,基于不同的策略從隊列中獲取未執行的任務,并基于任務的特點進行分發,將任務提交到任務執行模塊進行處理。
(3)任務執行
基于模型訓練任務的特點,將任務拆分成多個子任務,利用Kubernetes虛擬化技術,將拆分后的任務提交到Kubernetes集群中,基于自身需要的資源申請相應的Pod,每個Pod執行一個子任務,保證子任務相互隔離,從而實現模型訓練任務的分布式執行,提高資源利用率以及訓練速度。
(4)任務監控控制
任務在Kubernets集群中運行的同時,需要利用Kubernetes自帶的監控服務,實時采集Event和Pod詳細信息至自定義隊列中,并對其進行消費解析,對任務可能遇到的問題(如掛載失敗、node分配失敗等)進行實時監控,基于任務監控采集到Event與Pod信息,任務控制對其進行解析,針對不同的情況設置不通的處理器,將任務的運行狀態及相應的Event的信息回傳到深度學習模型操作API服務平臺,并更新任務狀態。
為驗證該方案的有效性,根據實際情況,選擇5臺物理機進行部署,其配置如表1所示,主要軟件環境為:Kubernetes 2.0,Tensorflow 2.0,Python 3.6 等。

表1 物理機配置
在5臺物理機上部署Kubernetes集群,將各個應用以容器的形式部署在Kubernetes集群中。開發基于用戶畫像系統的高價值用戶分析模型,通過深度學習模型操作API服務將樣本數據進行處理并提交模型代碼到不同的Kubernetes節點。任務提交之后,平臺自動創建5個TensorFlow容器節點進行模型訓練,同時,本文主要對TensorFlow單機部署及相同環境的分布式部署進行了測試,測試結果,如表2所示。

表2 運行情況對比
綜上所述,容器化部署縮短了集群的部署調試時間,減少了TensorFlow分布式節點部署的流程,實現了資源的動態透明調度及所有操作的Http接口服務,為算法工程師簡化了操作流程。
本文基于Kubernetes容器技術及TensorFlow深度學習框架進行研究,結合鐵路客運業務的特點,設計并實現了一套基于容器的深度學習平臺。基于Kubernetes優秀的資源調度及管理框架,實現了TensorFlow深度學習集群,以及其他應用服務的自動化部署、計算資源動態擴容,解決了客運目前面臨的數據量大,計算復雜等深度學習問題。實踐證明,該平臺極大地提高了算法工程師的開發效率和模型的訓練速度,具有良好的應用前景。