Netflix的目標是能預(yù)測顧客之所想觀看的電影,也即推薦預(yù)測。為了做到這一點,每天會運行大量機器學(xué)習(xí)工作流,而為了支撐創(chuàng)建這么多機器學(xué)習(xí)工作流和有效利用資源,Netflix的工程師開發(fā)了Meson。
Meson是一個通用的工作流和調(diào)度框架,它可以跨異質(zhì)性系統(tǒng)進行ML管道管理、執(zhí)行工作流。Meson維護構(gòu)建、訓(xùn)練和驗證個性化算法(視頻推薦等)的ML管道的生命周期。
Meson的主要目標之一是提高算法實驗的速度、穩(wěn)定性和可重復(fù)性,同時允許工程師使用他們自己選擇的技術(shù)。
機器學(xué)習(xí)管道的強大面孔
Netflix當(dāng)前幾種生成機器學(xué)習(xí)管道的關(guān)鍵角色是Spark, MLlib, Python, R和Docker。
下面來了解下一個典型的視頻推薦的機器學(xué)習(xí)管道,以及它們在Meson中是如何表示和處理的。
工作流涉及到如下幾點:
選擇用戶集:通過Hive查詢來選擇用戶集來做人群行為分析;清晰/預(yù)處理數(shù)據(jù):使用Python腳本創(chuàng)建兩個用戶集來確保并行路徑;并行路徑:一個路徑使用Spark構(gòu)建和分析全局模型,并保存到HDFS作為臨時存儲。另外一個使用R來構(gòu)建區(qū)域模型。區(qū)域的數(shù)量是基于人群選擇分析而動態(tài)變化。在流程圖中,Build Regional Model和Validate Regional Model 對于每個區(qū)域是重復(fù)的,運行時擴展,并且以不同的參數(shù)集來執(zhí)行,見下圖;驗證:Scala代碼用來測試兩個并行路徑收斂時的模型穩(wěn)定性。在這步中,如果模型不穩(wěn)定,我們也需要再返回、重復(fù)整個流程;發(fā)布新模型:建立一個Docker容器來發(fā)布新模型,以便被其它生產(chǎn)系統(tǒng)使用。
上圖展示了一個運行的工作流(前面描述的):
用戶集選擇和數(shù)據(jù)預(yù)處理已完成,圖中綠色部分;流程中的并行路徑:Spark分支完成模型生成和驗證;for-each分支分出四個不同的區(qū)域模型,它們都在運行中,圖中黃色部分。模型選擇的Scala部分已激活,如圖中藍色部分所示。這表明一個或者多個輸入分支已完成,但是它仍然沒有被調(diào)度執(zhí)行。其原因是輸入分支還有未啟動或者正在進行的。運行時環(huán)境和參數(shù)會根據(jù)業(yè)務(wù)策略傳遞到工作流當(dāng)中。深度解密
接下來讓我們揭開Meson神秘的面紗,去理解Meson是如何跨系統(tǒng)運行和生態(tài)系統(tǒng)不同組件間是怎樣交互的。工作流在運行的過程中有各種資源要求和期望,Meson是利用Apache Mesos來實現(xiàn)的。Mesos提供CPU、內(nèi)存、存儲和其它計算資源的任務(wù)級別的隔離和抽象。Meson利用這點特性來實現(xiàn)對任務(wù)的高擴展性和容錯性。
Meson調(diào)度器
Meson調(diào)度器被注冊為一個Mesos框架,進行管理各種工作流的啟動、流控制和運行時。Meson把實際的資源調(diào)度發(fā)到Mesos,包括各種內(nèi)存和CPU要求。Meson依賴Mesos進行資源調(diào)度,但是Meson的調(diào)度器設(shè)計成可插入的,所以也可以選擇其它框架來做資源調(diào)度。
每步一旦被調(diào)度,Meson調(diào)度器從Mesos申請到實際的資源,并把任務(wù)注冊到Mesos master。
Meson Executor
Meson Executor是一個定制化的Mesos Executor。寫入一個executor允許我們保持Meson間通訊通道,這對長連接任務(wù)(框架消息發(fā)送到Meson調(diào)度器)非常有用。Meson Executor也使得使用者可以傳入定制化的豐富數(shù)據(jù),而不僅僅傳入一些退出代碼或者狀態(tài)信息。
一旦Mesos調(diào)度一個Meson任務(wù),它會在slave端下載所有任務(wù)依賴后啟動一個Meson executor。當(dāng)核心任務(wù)被執(zhí)行,executor會發(fā)送心跳、完成百分比、狀態(tài)信息等。
DSLMeson提供一個基于Scala的DSL,使得開發(fā)人員更容易的使用和創(chuàng)建定制化的工作流。下面展示前述工作流是如何使用DSL來定義:
val getUsers = Step("Get Users", ...)val wrangleData = Step("Wrangle Data", ...)...val regionSplit = Step("For Each Region", ...)val regionJoin = Step("End For Each", ...)val regions = Seq("US", "Canada", "UK_Ireland", "LatAm", ...)val wf = start -> getUsers -> wrangleData ==> ( trainGlobalModel -> validateGlobalModel, regionSplit **(reg = regions) --< (trainRegModel, validateRegModel) >-- regionJoin) >== selectModel -> validateModel -> end// If verbs are preferred over operatorsval wf = sequence(start, getUsers, wrangleData) parallel { sequence(trainGlobalModel, validateGlobalModel) sequence(regionSplit, forEach(reg = regions) sequence(trainRegModel, validateRegModel) forEach, regionJoin)} parallel sequence(selectModel, validateModel, end)Meson架構(gòu)擴展
Meson很容易擴展,增加定制化的步驟和擴展功能,比如,Spark Submit Step, Hive Query Step、Netflix的微服務(wù)或者其它像Cassandra的系統(tǒng)。
Artifacts在Meson里,工作流的每步輸出都作為“一等公民”對待,并存儲為Artifacts。工作流會根據(jù)artifact id的存在與否來決定每步的重試是否可跳過。我們也可以通過Meson UI來對Artifacts進行定制的可視化。比如,存儲特征重要性作為一個artifact,然后插入一個定制的可視化來比較過去N天特征的重要性。
Mesos Master / Slave
Meson的定制化Mesos executor是跨slave機器發(fā)布的。下載所有jar包和定制化的artifact,并發(fā)送消息/上下文/心跳到Meson調(diào)度器。從Meson提交的Spark作業(yè)共享相同的Mesos slave來運行Spark作業(yè)啟動的任務(wù)。
原生Spark支持
支持原生Spark是Meson的一個重要要求。 在Meson里提交Spark作業(yè)后可以監(jiān)控Spark作業(yè)過程,并能提供Spark步驟的重試或者殺死Spark作業(yè)。Meson也支持指定Spark版本。
Meson支持具有挑戰(zhàn)性的Spark多租戶環(huán)境。Meson能夠高效的利用有限的資源,通過匹配潛在滿足資源需求和服務(wù)等級協(xié)議(SLA)需要的Mesos slave。也可以對Mesos slave標簽化分組。
ML結(jié)構(gòu)
隨著Meson的使用增加,大規(guī)模的并行問題(比如,參數(shù)掃描、復(fù)雜的bootstrap算法和交叉驗證)也出現(xiàn)了。
Meson提供一個簡單的‘for-loop’ 結(jié)構(gòu),它允許數(shù)據(jù)科學(xué)家和科研人員在成千上萬的docker鏡像中表達參數(shù)掃描算法。這個結(jié)構(gòu)的使用者可以實時的監(jiān)控成千的任務(wù)過程,通過UI找到失敗的任務(wù),打印日志到一個位置來簡單的管理并行任務(wù)。
結(jié)論
Mesos在去年已經(jīng)完成多ML管道的成百上千的并發(fā)作業(yè)。它能提高算法團隊對推薦算法的效率。
Netflix后期計劃在幾個月后開源Meson。
英文原文:Meson: Workflow Orchestration for Netflix Recommendations
譯者介紹:俠天,專注于大數(shù)據(jù)、機器學(xué)習(xí)和數(shù)學(xué)相關(guān)的內(nèi)容,并有個人公眾號:bigdata_ny分享相關(guān)技術(shù)文章。