原文标题:Meson: Workflow Orchestration for Netflix Recommendations 译者:刘翔宇 审校:刘帝伟 责编:周建丁 未经许可,谢绝转载。机器学习投稿、采访请联系zhoujd@csdn.net
在Netflix,我们的目标是在你观看之前预测你想观看的。为做到这一点,我们每天运行了大量的机器学习(ML)工作流。为了支持建立这些工作流并且有效利用资源,我们开发了Meson。
Meson是一个通用的工作流编排和调度框架,用于管理跨异构系统执行工作负载的ML管道。它管理着一些ML管道的生命周期,这些ML管道用来构建、训练并验证驱动视频推荐的个性化算法。
Meson的主要目标之一是提高算法实验的速度,可靠性和可重复性,同时允许工程师使用他们选择的技术来处理每个步骤。
在Netflix内部,Spark、MLlib、Python、R以及Docker在当前一代的机器学习管道中起到了重要作用。
我们来看看驱动视频推荐的典型机器学习管道,以及在Meson中它是如何表示和处理的。
(注:本文所有图片均可在极客头条原文中点击放大)
工作流包括:
上图显示了上面描述的工作流运行过程。
让我们深入幕后场景来了解Meson是如何在不同系统之间统筹,以及生态系统中不同组件之间的相互影响。工作流有着不同的资源需求和总运行时间期望。我们依靠Apache Mesos这样的资源管理系统来满足这些需求。Mesos提供了任务隔离,以及CPU、内存、存储和其他计算资源的优秀抽象。Meson利用这些功能来实现任务的弹性和容错性。
Meson调度器(Meson scheduler),注册成Mesos框架(Mesos framework),管理着各种工作流的启动,流量控制和运行。Meson委托实际的资源调度给Mesos。各种需求包括内存和CPU一起交给Mesos管理。虽然我们依靠Mesos来调度资源,但是调度程序是可拔插的,我们可以选择使用其他的框架来调度资源。
一旦某个步骤需要调度,Meson调度器从Mesos中选择合适的资源,然后将任务传递给Mesos主节点。
Meson执行器是一个自定义的Mesos执行器。编写自定义的执行器可以让我们保持与Meson的通信通道。这在长时间运行任务中尤其有效,框架的消息可以被发送给Meson调度器。这也可以让我们传递自定义数据,而不仅仅是退出代码或状态信息。
一旦Mesos调度了一个Meson任务,它会下载所有的任务依赖,然后在子节点上启动一个Meson执行器。当核心任务正在执行时,执行器会做一些例行工作,比如发送心跳、完成百分比、状态信息等。
Meson提供了基于Scala的DSL,能够轻松编写工作流。这使得开发人员很容易就能创建自定义工作流。下面是使用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就为了可扩展性而构建,这样它很容易地添加自定义步骤和扩展。Spark Submit步骤,Hive查询步骤,Netflix特定扩展让我们可以接触微服务或其他系统,比如Cassandra。
在上面的工作流中,我们建立了一个Netflix特定扩展来调用Docker执行框架,让开发人员为Docker镜像指定最小参数。扩展处理着所有的通信,比如获取所有的状态URL、日志信息和监控Docker进程状态。
步骤的输出可以视为Meson中的一等公民,以Artifacts形式存储。工作流步骤的重试可以跳过,这取决于artifact id的存在与否。我们同样可以在Meson UI中绘制自定义的artifacts可视化图像。比如,如果我们把特征重要性存储为一个artifact作为管道的一部分,我们可以加入自定义可视化,这样就能够比较过去n天的特征重要性。
Mesos用于资源调度,Meson注册成核心框架。Meson的自定义Mesos执行器部署在子节点上。它们用来下载所有jar包和定制化artifact还有将消息/上下文/心跳发送回Meson调度器。
在Meson中原生支持Spark是一个关键要求和目标。Meson中的Spark Submit可以从Meson中监控Spark作业进度,能够重试失败的Spark步骤或杀死可能出错的Spark作业。Meson同时还支持特定版本的Spark——因此,对于那些想要使用最新版本的Spark进行创新的用户来说,也是支持的。
通过Meson在多用户环境下支持Spark有一系列有趣的挑战。工作流有一系列不同的资源需求和总运行时间期望。Meson通过匹配资源需求,将期望传给Mesos子节点来使用可用资源,这些子节点可能会满足所需条件。这是通过对Mesos子节点中组设置标签,并使用Mesos资源属性功能将作业分配给子节点集来实现。
随着Meson使用量的增加,一系列大规模并行化问题出现了,比如参数清扫,复杂引导,和交叉验证。
Meson提供了简单的“for循环”构造,可以让数据科学家和研究人员表示参数清扫,他们可以在参数值上运行好几万的Docker容器。使用这种构造的用户可以实时监控上千个任务的进程,通过UI界面查找失败的任务,将日志发送给同一个地方,Meson使得管理这些并行任务非常简单。
在过去一年中,Meson已经在多ML管道的上百个并行作业中发挥作用。对我们算法团队来说,这是创新的一剂催化剂,因此改善了对用户的推荐。
我们计划在未来几个月将Meson开源,并围绕它建立社区。如果你想帮助加快创新步伐,为开源做出努力,那么请加入我们。
目前Meson团队成员包括:
Antony Arokiasamy, Kedar Sadekar, Raju Uppalapati, Sathish Sridharan, Prasanna Padmanabhan, Prashanth Raghavan, Faisal Zakaria Siddiqi, Elliot Chow 及 Davis Shepherd(无linkedin)。
最后附上Meson UI的一些截图: