Meson:支持Netflix的机器学习工作流

MichelineKo 8年前
   <p>Netflix的目标是能预测顾客之所想观看的电影,也即推荐预测。为了做到这一点,每天会运行大量机器学习工作流,而为了支撑创建这么多机器学习工作流和有效利用资源,Netflix的工程师开发了Meson。</p>    <p>Meson是一个通用的工作流和调度框架,它可以跨异质性系统进行ML管道管理、执行工作流。Meson维护构建、训练和验证个性化算法(视频推荐等)的ML管道的生命周期。</p>    <p>Meson的主要目标之一是提高算法实验的速度、稳定性和可重复性,同时允许工程师使用他们自己选择的技术。</p>    <p>机器学习管道的强大面孔</p>    <p>Netflix当前几种生成机器学习管道的关键角色是Spark, MLlib, Python, R和Docker。</p>    <p>下面来了解下一个典型的视频推荐的机器学习管道,以及它们在Meson中是如何表示和处理的。</p>    <p><img src="https://simg.open-open.com/show/c49a788f8054c9d5e36e3d0242696c4e.jpg"></p>    <p>工作流涉及到如下几点:</p>    <p><img src="https://simg.open-open.com/show/e3b453c23ca6fda5483468e5cfc1617f.jpg"></p>    <ul>     <li>选择用户集:通过Hive查询来选择用户集来做人群行为分析;<br> 清晰/预处理数据:使用Python脚本创建两个用户集来确保并行路径;</li>     <li>并行路径:一个路径使用Spark构建和分析全局模型,并保存到HDFS作为临时存储。另外一个使用R来构建区域模型。区域的数量是基于人群选择分析而动态变化。在流程图中,Build Regional Model和Validate Regional Model 对于每个区域是重复的,运行时扩展,并且以不同的参数集来执行,见下图;</li>     <li>验证:Scala代码用来测试两个并行路径收敛时的模型稳定性。在这步中,如果模型不稳定,我们也需要再返回、重复整个流程;</li>     <li>发布新模型:建立一个Docker容器来发布新模型,以便被其它生产系统使用。</li>    </ul>    <p>上图展示了一个运行的工作流(前面描述的):</p>    <ul>     <li>用户集选择和数据预处理已完成,图中绿色部分;</li>     <li>流程中的并行路径:      <ul>       <li>Spark分支完成模型生成和验证;</li>       <li>for-each分支分出四个不同的区域模型,它们都在运行中,图中黄色部分。</li>      </ul> </li>     <li>模型选择的Scala部分已激活,如图中蓝色部分所示。这表明一个或者多个输入分支已完成,但是它仍然没有被调度执行。其原因是输入分支还有未启动或者正在进行的。</li>     <li>运行时环境和参数会根据业务策略传递到工作流当中。</li>    </ul>    <p>深度解密</p>    <p>接下来让我们揭开Meson神秘的面纱,去理解Meson是如何跨系统运行和生态系统不同组件间是怎样交互的。工作流在运行的过程中有各种资源要求和期望,Meson是利用 <a href="/misc/goto?guid=4958838588345234689" rel="nofollow,noindex">Apache Mesos</a> 来实现的。Mesos提供CPU、内存、存储和其它计算资源的任务级别的隔离和抽象。Meson利用这点特性来实现对任务的高扩展性和容错性。</p>    <p><img src="https://simg.open-open.com/show/61a3ce49b019e166beb93d2e5d3cad3b.jpg"></p>    <p>Meson调度器</p>    <p>Meson调度器被注册为一个Mesos框架,进行管理各种工作流的启动、流控制和运行时。Meson把实际的资源调度发到Mesos,包括各种内存和CPU要求。Meson依赖Mesos进行资源调度,但是Meson的调度器设计成可插入的,所以也可以选择其它框架来做资源调度。</p>    <p>每步一旦被调度,Meson调度器从Mesos申请到实际的资源,并把任务注册到Mesos master。</p>    <p>Meson Executor</p>    <p>Meson Executor是一个定制化的Mesos Executor。写入一个executor允许我们保持Meson间通讯通道,这对长连接任务(框架消息发送到Meson调度器)非常有用。Meson Executor也使得使用者可以传入定制化的丰富数据,而不仅仅传入一些退出代码或者状态信息。</p>    <p>一旦Mesos调度一个Meson任务,它会在slave端下载所有任务依赖后启动一个Meson executor。当核心任务被执行,executor会发送心跳、完成百分比、状态信息等。</p>    <p>DSL</p>    <p>Meson提供一个基于Scala的DSL,使得开发人员更容易的使用和创建定制化的工作流。下面展示前述工作流是如何使用DSL来定义:</p>    <pre>  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 operators  val wf = sequence(start, getUsers, wrangleData) parallel {     sequence(trainGlobalModel, validateGlobalModel)     sequence(regionSplit,               forEach(reg = regions) sequence(trainRegModel, validateRegModel) forEach,               regionJoin)  } parallel sequence(selectModel, validateModel, end)</pre>    <p>Meson架构扩展</p>    <p>Meson很容易扩展,增加定制化的步骤和扩展功能,比如,Spark Submit Step, Hive Query Step、Netflix的微服务或者其它像Cassandra的系统。</p>    <p>Artifacts</p>    <p>在Meson里,工作流的每步输出都作为“一等公民”对待,并存储为Artifacts。工作流会根据artifact id的存在与否来决定每步的重试是否可跳过。我们也可以通过Meson UI来对Artifacts进行定制的可视化。比如,存储特征重要性作为一个artifact,然后插入一个定制的可视化来比较过去N天特征的重要性。</p>    <p><img src="https://simg.open-open.com/show/eb8524e8e0b890828229ce303046e9a7.jpg"></p>    <p>Mesos Master / Slave</p>    <p>Meson的定制化Mesos executor是跨slave机器发布的。下载所有jar包和定制化的artifact,并发送消息/上下文/心跳到Meson调度器。从Meson提交的Spark作业共享相同的Mesos slave来运行Spark作业启动的任务。</p>    <p>原生Spark支持</p>    <p>支持原生Spark是Meson的一个重要要求。 在Meson里提交Spark作业后可以监控Spark作业过程,并能提供Spark步骤的重试或者杀死Spark作业。Meson也支持指定Spark版本。</p>    <p>Meson支持具有挑战性的Spark多租户环境。Meson能够高效的利用有限的资源,通过匹配潜在满足资源需求和服务等级协议(SLA)需要的Mesos slave。也可以对Mesos slave标签化分组。</p>    <p>ML结构</p>    <p>随着Meson的使用增加,大规模的并行问题(比如,参数扫描、复杂的bootstrap算法和交叉验证)也出现了。</p>    <p>Meson提供一个简单的‘for-loop’ 结构,它允许数据科学家和科研人员在成千上万的docker镜像中表达参数扫描算法。这个结构的使用者可以实时的监控成千的任务过程,通过UI找到失败的任务,打印日志到一个位置来简单的管理并行任务。</p>    <p>结论</p>    <p>Mesos在去年已经完成多ML管道的成百上千的并发作业。它能提高算法团队对推荐算法的效率。</p>    <p>Netflix后期计划在几个月后开源Meson。</p>    <p>英文原文: <a href="/misc/goto?guid=4959675074841147121" rel="nofollow,noindex">Meson: Workflow Orchestration for Netflix Recommendations</a></p>    <p>译者介绍:侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。</p>    <p> </p>    <p>来自: <a href="/misc/goto?guid=4959675074925775212" rel="nofollow">http://www.infoq.com/cn/news/2016/07/Meson-Netflix</a></p>    <p> </p>