遇见Michelangelo:优步的机器学习平台

遇见Michelangelo:优步的机器学习平台

Uber Engineering致力于开发为客户创造无缝,有影响力的经验的技术。我们越来越多地投资人工智能(AI)和机器学习(ML)来实现这一愿景。在优步,我们对这个空间的贡献是Michelangelo,一个内置ML-AS-Service平台,使机器学习制作,使缩放AI能够满足企业的需求,就像要求乘坐一样简单。

Michelangelo可以通过优步规模无缝地构建,部署和操作机器学习解决方案。它旨在覆盖端到端ML工作流程:管理数据,列车,评估和部署模型,进行预测和监视预测。该系统还支持传统的ML模型,时间序列预测和深度学习。

Michelangelo一直在优步提供生产用例,大约一年,已成为我们工程师和数据科学家的机器学习的遗弃系统,其中几个团队建设和部署模型。实际上,它在几个超级数据中心部署,利用了专门的硬件,并为公司的最高负载的在线服务提供了预测。

在本文中,我们介绍了Michelangelo,讨论产品用例,并通过这种强大的新ML-AS-Service系统的工作流程。

Michelangelo的动机

在Michelangelo之前,我们面临许多挑战与Uber的建设和部署机器学习模型与我们的操作的大小和规模相关。虽然数据科学家正在使用各种各样的工具来创建预测模型(R,克里克特 - 学习,自定义算法等),单独的工程团队还在建立定制的一次性系统,以在生产中使用这些模型。结果,ML在优步的影响仅限于一些数据科学家和工程师可以在短时间内构建,主要是开源工具。

具体地,没有系统可以建立可靠,统一和可重复的管道,用于以规模创建和管理培训和预测数据。在Michelangelo之前,无法培训大于数据科学家桌面机的模型,并且既没有标准的地方,可以存储培训实验结果,也没有一种简单的方法来比较一个实验到另一个实验。最重要的是,没有建立模型进入生产的路径-在大多数情况下,相关工程团队必须创建特定于项目的定制服务容器。与此同时,我们开始看到许多ML的迹象被记录在一起scully等。

Michelangelo旨在通过标准化团队的工作流程和工具来解决这些差距,尽管将用户能够通过尺寸轻松构建和操作机器学习系统,以使团队跨越团队的工作流程和工具来解决这些差距。我们的目标不仅要解决这些直接问题,而且还创造了一个与业务增长的系统。

当我们在2015年年中开始建设Michelangelo时,我们首先通过解决可扩展模型培训和部署到生产服务容器的挑战。然后,我们专注于构建更好的管理和共享功能管道的系统。最近,重点转移到开发人员的生产力-如何将路径从想法加快到第一个生产模型和随后的快速迭代。

在下一节中,我们查看一个示例应用程序,了解Michelangelo如何用于构建和部署模型以解决优步的特定问题。虽然我们突出了一个特定的用例Ubereats.,该平台在整个公司中管理数十种类似型号,用于各种预测用例。

用例:Ubereats估计交付时间表

Ubereats有几款在Michelangelo上运行的型号,覆盖送餐时间预测,搜索排名,搜索自动完成和餐厅排名。交货时间模型预测,在订单发出之前,在发出订单之前,请在发出订单之前再次提供多少时间,然后在交付过程的每个阶段。

Ubereats应用程序托管估计的交付时间功能,由Michelangelo建立的机器学习模型提供支持
图1:Ubereats应用程序主持由Michelangelo内置的机器学习模型供电的估计交付时间功能。

预测膳食预计交付时间(ETD)并不简单。当Ubereats客户下订单时,它将发送到餐厅进行处理。然后,餐厅需要确认订单并准备一顿饭,这将根据订单的复杂性以及餐厅是多么繁忙的。当饭后靠近准备好时,派遣了一个优步送货伙伴以拿起这顿饭。Then, the delivery-partner needs to get to the restaurant, find parking, walk inside to get the food, then walk back to the car, drive to the customer’s location (which depends on route, traffic, and other factors), find parking, and walk to the customer’s door to complete the delivery. The goal is to predict the total duration of this complex multi-stage process, as well as recalculate these time-to-delivery predictions at every step of the process.

在Michelangelo平台上,Ubereats数据科学家使用渐变提升决策树回归模型来预测这种端到端的交货时间。Features for the model include information from the request (e.g., time of day, delivery location), historical features (e.g. average meal prep time for the last seven days), and near-realtime calculated features (e.g., average meal prep time for the last one hour). Models are deployed across Uber’s data centers to Michelangelo model serving containers and are invoked via network requests by the UberEATS microservices. These predictions are displayed to UberEATS customers prior to ordering from a restaurant and as their meal is being prepared and delivered.

系统架构

Michelangelo由内部内置的开源系统和组件组成。使用的主要开源组件是HDFS.火花Samza.卡桑德拉mllib.XGBoost., 和纹orflow.。我们通常希望在可能的情况下使用成熟的开源选项,并根据需要叉,自定义和贡献并贡献,但我们有时在开源解决方案不适合我们的用例时构建系统。

Michelangelo is built on top of Uber’s data and compute infrastructure, providing a data lake that stores all of Uber’s transactional and logged data, Kafka brokers that aggregate logged messages from all Uber’s services, a Samza streaming compute engine, managed Cassandra clusters, and Uber’s in-house service provisioning and deployment tools.

在下一节中,我们使用Ubereats ETD模型走过系统的层作为一个案例研究,说明了Michelangelo的技术细节。

机器学习工作流程

除了手中的挑战,包括分类和回归,以及时间序列预测,横跨所有机器学习用例都存在相同的一般工作流程。工作流程通常是实现不可知的,因此轻松扩展以支持新的算法类型和框架,例如较新的深度学习框架。它还适用于不同的部署模式,例如在线和离线(以及车内和手机)预测用例。

我们专门设计了Michelangelo,专门提供可扩展,可靠,可重复的,易于使用的和自动化工具,以解决以下六步工作流程:

  1. 管理数据
  2. 火车模型
  3. 评估模型
  4. 部署模型
  5. 作出预测
  6. 监控预测

接下来,我们详细介绍了Michelangelo的架构如何利用此工作流程的每个阶段。

管理数据

找到良好的功能通常是机器学习中最难的部分,我们发现建筑物和管理数据流水线通常是完整机器学习解决方案中最昂贵的碎片之一。

平台应提供用于构建数据流水线的标准工具,以生成用于培训(和重新训练)的功能和标签数据集,以及用于预测的特征数据集。这些工具应与公司的数据湖泊或仓库以及公司的在线数据服务系统进行深度集成。管道需要可扩展和性能,包括数据流和数据质量的集成监控,并支持在线和离线培训和预测。理想情况下,它们还应以可在团队中的可共同的方式生成功能,以减少重复的工作并提高数据质量。它们还应提供强大的防护铁轨和控制,以鼓励和赋予用户采用最佳实践(例如,简单地保证在训练时间和预测时间都使用相同的数据生成/准备过程)。

Michelangelo的数据管理组件在线和离线管道之间分配。目前,离线管道用于馈送批量模型培训和批量预测作业以及在线管道饲料在线,低延迟预测(以及在不久的将来,在线学习系统)。

此外,我们添加了一层数据管理,一个特征存储器,允许团队分享,发现和使用高度策划的一组机器学习问题。我们发现,优步使用相同或类似的功能,使团队在其自己的项目和不同组织中的团队之间共享特征来共享特征,可以实现许多建模问题。

数据准备管道将数据推入特征存储表和培训数据存储库
图2:数据准备管道将数据推入特征存储表和培训数据存储库。

离线

优步的交易和日志数据流入HDFS数据湖泊,可通过Spark和Hive SQL Compute作业轻松访问。我们提供的容器和调度运行常规作业以计算可以私下的功能或发布到要素存储(请参阅下文)并在跨行队共享,而批处理在计划或触发器上运行,并且与数据集成质量监控工具快速检测管道中的回归-由于本地或上游代码或数据问题。

在线的

Models that are deployed online cannot access data stored in HDFS, and it is often difficult to compute some features in a performant manner directly from the online databases that back Uber’s production services (for instance, it is not possible to directly query the UberEATS order service to compute the average meal prep time for a restaurant over a specific period of time). Instead, we allow features needed for online models to be precomputed and stored in Cassandra where they can be read at low latency at prediction time.

我们支持两种计算这些在线服务功能,批量预编译和近实时计算,下面概述:

  • 批量预编译。计算的第一个选项是定期将批量预计算和将HDF的历史特征负载到Cassandra。这简单富有高效,通常适用于历史功能,只需每隔几个小时或一次即可更新的功能即可接受。该系统保证了相同的数据和批处理管道用于培训和服务。Ubereats使用这个系统的功能,如'餐厅的平均膳食准备时间过去七天
  • 近实时计算E.第二个选项是将相关指标发布到Kafka,然后运行基于Samza的流计算作业以在低延迟下生成聚合特征。然后将这些功能直接写入Cassandra,用于服务并记录回HDFS以供将来的培训工作。与批处理系统一样,近实时计算可确保相同的数据用于培训和服务。为避免冷启动,我们将工具提供“回填”此数据并通过针对历史日志运行批处理作业而生成培训数据。Ubereats使用这种近实时管道的功能'餐厅的平均用餐时间在过去一小时内。
共享功能存储

我们在构建一个集中式功能商店中找到了很大的价值,其中Uber周围的团队可以创建和管理他们的团队使用的规范功能并与他人共享。在高水平,它完成了两件事:

  1. 它允许用户轻松地添加它们内置的共享功能存储中的功能,只需要少量额外的元数据(所有者,描述,SLA等),以便私有,项目生成的功能所需的功能具体用法。
  2. 一旦功能存储在功能存储中,它们就非常易于在线和脱机,通过参考模型配置中的功能的简单规范名称来消费。配备此信息,系统处理在正确的HDFS数据集中加入模型培训或批量预测,并从Cassandra获取右值以进行在线预测。

目前,我们在用于加速机器学习项目的特征商店中有大约10,000个功能,以及整个公司的团队都是一直在添加新的。功能存储中的功能会自动计算和更新。

未来,我们打算探讨构建自动化系统以通过特征存储搜索的可能性,并确定解决给定预测问题的最有用和最重要的功能。

域特定语言特征选择和转换

通常由数据流水线生成或从客户服务发送的功能不在模型的正确格式中,并且它们可能是需要填充的缺失值。此外,该模型可以仅需要提供的特征子集。在某些情况下,模型将时间戳转换为日期或一天为更好地捕获季节性模式,这可能更有用。在其他情况下,需要归一化特征值(例如,通过标准偏差减去平均值并除以)。

要解决这些问题,我们创建了一种DSL(域特定语言),该DSL(域特定语言)建模用于在培训和预测时选择发送到模型的功能。DSL实现为Scala的子集。它是一种纯粹的功能语言,具有完整的常用功能。使用此DSL,我们还提供客户团队添加自己的用户定义功能的能力。有访问器功能,用于从当前上下文中获取特征值(在在线模型的脱机模型或来自客户端的当前请求的数据流水线)或从在线模型的情况下)。

值得注意的是,DSL表达式是模型配置的一部分,并且在训练时间和预测时应用相同的表达式,以帮助保证在两种情况下生成并将其发送到模型的相同最终的功能集。

火车模型

我们目前支持离线,大规模分布式培训决策树,线性和物流模型,无监督模型(k均值),时间序列模型和深神经网络。我们定期添加新算法,以响应客户需求,因为它们是由优步开发的AI实验室和其他内部研究人员。雷竞技是骗人的此外,我们让客户团队通过提供自定义培训,评估和服务代码来添加自己的模型类型。分布式模型培训系统缩放以处理数十亿个样本,然后向下到小型数据集以便快速迭代。

模型配置指定模型类型,超参数,数据源引用和特征DSL表达式,以及计算资源要求(机器的数量,内存量,无论是不使用GPU等)。它用于配置训练作业,该作业是在一个上运行的或者Mesos.簇。

在培训模型后,计算性能度量(例如,ROC曲线和PR曲线)并组合到模型评估报告中。在培训结束时,原始配置,学习参数和评估报告将保存回我们的模型存储库以进行分析和部署。

除了培训单一模型外,Michelangelo还支持所有型号类型的超参数搜索以及分区模型。With partitioned models, we automatically partition the training data based on configuration from the user and then train one model per partition, falling back to a parent model when needed (e.g. training one model per city and falling back to a country-level model when an accurate city-level model cannot be achieved).

培训工作可以通过Web UI或API进行配置和管理,通常通过jupyter笔记本。许多团队使用API​​和工作流程工具来安排定期重新培训其模型。

模型培训工作使用功能存储和培训数据存储库数据集以培训模型,然后将它们推到模型存储库
图3:模型训练作业使用功能存储和培训数据存储库数据集以培训模型,然后将它们推到模型存储库。

评估模型

模型通常受培训,作为有条件探索过程的一部分,以识别为其问题创建最佳模型的功能,算法和超参数。在抵达给定用例的理想模型之前,培训了数百个没有切割的剪裁并不罕见。虽然不是最终用于生产,但这些模型的性能指导工程师朝着模型配置导致最佳模型性能。Keeping track of these trained models (e.g. who trained them and when, on what data set, with which hyper-parameters, etc.), evaluating them, and comparing them to each other are typically big challenges when dealing with so many models and present opportunities for the platform to add a lot of value.

对于在Michelangelo培训的每个模型中,我们在Cassandra的模型存储库中存储一个版本的对象,其中包含一个记录:

  • 谁训练了模型
  • 培训工作的开始和结束时间
  • 完整模型配置(使用功能,超参数值等)
  • 参考培训和测试数据集
  • 每个特征的分布和相对重要性
  • 模型准确度指标
  • 每个型号类型的标准图表和图表(例如,ROC曲线,PR曲线和二进制分类器的混淆矩阵)
  • 全部学习的模型参数
  • 模型可视化概述统计数据

这些信息通过Web UI轻松可用于通过API编程方式,用于检查各个模型的细节,并用于彼此比较一个或多个模型。

模型准确性报告

回归模型的模型准确性报告显示了标准的精度指标和图表。分类模型将显示不同的集合,如图4和5中所示:

回归模型报告显示回归相关的绩效指标
图4:回归模型报告显示回归相关的性能指标。

二进制分类绩效报告显示与分类相关的绩效指标
图5:二进制分类性能报告显示与分类相关的性能指标。

决策树可视化

对于重要的模型类型,我们提供了复杂的可视化工具,以帮助建模者了解为什么模型表现得其,以及在必要时帮助调试它。在决策树模型的情况下,我们让用户浏览每个树木,以便将它们对整体模型的相对重要性,它们的分裂点,每个特征的重要性到特定树,以及每个特定树的分布在其他变量中拆分。用户可以指定特征值,可视化将描绘触发的路径,下面的触发路径,每个树的预测,以及模型的总体预测,如下图所示:

可视化模型

可以使用强大的树可视化探索树模型
图6:可以使用强大的树可视化探索树模型。

特征报告

Michelangelo提供了一个功能报告,以便将每个功能显示到模型的重要性以及部分依赖性图和分布直方图。选择两个功能允许用户了解要素交互作为双向部分依赖图,如下面的展示:

功能,它们对模型的影响,并且可以透过特征报告,可以探索它们的互动
图7:功能,它们对模型的影响,并且可以通过特征报告探索它们的互动。

部署模型

Michelangelo具有用于通过UI或API管理模型部署的端到端支持,以及可以部署模型的三种模式:

  1. 离线部署。该模型部署到离线容器,并在Spark作业中运行,以产生按需或在重复计划上生成批处理预测。
  2. 在线部署。该模型部署到在线预测服务集群(通常包含负载平衡器后面的数百台机器),其中客户端可以将个人或批量预测请求发送为网络RPC调用。
  3. 图书馆部署。我们打算启动一个部署到服务容器的模型,该服务器被嵌入为另一个服务中的库,并通过Java API调用。(它未在下面的图8中显示,但与在线部署类似)。
来自模型存储库的模型部署到在线和离线容器进行服务
图8:模型存储库的模型部署到在线和脱机容器进行服务。

在所有情况下,所需的模型伪影(元数据文件,模型参数文件和编译的DSL表达式)都在zip存档中打包,并使用我们的标准代码部署基础结构复制到Uber的数据中心跨越相关主机。预测容器自动从磁盘加载新模型并开始处理预测请求。

许多团队都有自动化脚本,可以通过Michelangelo的API计划定期的模型再培训和部署。在Ubereats交付时间模型的情况下,培训和部署通过数据科学家和工程师通过Web UI手动触发。

作出预测

一旦服务容器部署和加载模型,它们用于基于从数据流水线加载的特征数据或直接从客户服务进行预测。原始功能通过编译的DSL表达式,可以从要素存储中修改原始功能和/或获取其他功能。最终特征向量构造并传递给模型进行评分。在在线模型的情况下,通过网络返回到客户服务的预测。在离线模型的情况下,预测将重新写入蜂巢,在那里他们可以由下游批处理作业消耗或由用户直接通过SQL的查询工具访问,如下所示:

在线和离线预测服务使用特征向量集生成预测
图9:在线和离线预测服务使用特征向量集生成预测。

参考模型

可以同时部署多个模型到给定的服务容器。这允许从旧模型到新型号的安全转换,并并排A / B对模型进行测试。在服务时间时,模型由其UUID和部署期间指定的可选标记(或别名)标识。在在线模型的情况下,客户端服务将特征矢量与其想要使用的模型UUID或模型标签发送;在标签的情况下,容器将使用最近部署到该标记的模型生成预测。在批处理模型的情况下,所有部署的模型用于对每个批处理数据集进行评分,预测记录包含模型UUID和可选标签,以便消费者可以适当地过滤。

If both models have the same signature (i.e. expect the same set of features) when deploying a new model to replace an old model, users can deploy the new model to the same tag as the old model and the container will start using the new model immediately. This allows customers to update their models without requiring a change in their client code. Users can also deploy the new model using just its UUID and then modify a configuration in the client or intermediate service to gradually switch traffic from the old model UUID to the new one.

对于模型的A / B测试,用户可以通过UUID或标签部署竞争模型,然后使用Uber的实验框架从客户服务中发送到每个模型和跟踪性能度量的流量的部分。

规模和延迟

由于机器学习模型无状态并没有分享,因此它们在线和离线服务模式中的扩展速度差异。在在线模型的情况下,我们可以简单地将更多主机添加到预测服务集群中,并让负载均衡器传播负载。在离线预测的情况下,我们可以添加更多的火花执行器并让火花管理并行性。

在线服务延迟取决于模型类型和复杂性以及模型是否需要Cassandra功能存储的功能。在不需要Cassandra不需要功能的模型的情况下,我们通常会看到P95延迟小于5毫秒(MS)。在需要从Cassandra需要特征的模型的情况下,我们通常会看到p95延迟小于10ms。最高的流量模型现在每秒提供超过250,000个预测。

监视器预测

训练和评估模型时,始终使用历史数据。为确保模型良好地运作到未来,监控其预测至关重要,以确保数据流水线正在继续发送准确的数据,并且生产环境没有改变,使得模型不再准确。

为了解决此问题,Michelangelo可以自动记录,并且可选地阻止它所做的预测的百分比,然后稍后将这些预测连接到数据流水线生成的观察结果(或标签)。通过这些信息,我们可以生成持续的模型精度的实时测量。在回归模型的情况下,我们发布R角/确定系数根均线对数误差(RMSLE),根均方误差(RMSE),和平均绝对错误指标到优步的时间序列监控系统,以便用户可以随时间分析图表并设置阈值警报,如下所示:

采样预测,并与观察到的结果进行比较,以产生模型精度度量
图10:采样预测并与观察到的结果相比,以产生模型精度度量。

管理飞机,API和Web UI

系统的最后一个重要部分是API层。这是系统的大脑。它由管理应用程序组成,该应用程序提供Web UI和网络API以及与优步系统监视和警报基础架构的集成。此层还将用于协调批处理数据管道,培训工作,批量预测作业以及批量和在线容器的模型部署的工作流系统。

Michelangelo的用户通过Web UI,REST API和监控和警报工具直接与这些组件直接与这些组件进行交互。

在Michelangelo平台上建造

在未来几个月,我们计划继续扩大和强化现有系统,以支持我们的客户团队和优步业务的增长。随着平台层的成熟,我们计划投资更高级别的工具和服务,推动机器学习的民主化,更好地支持我们的业务需求:

  • 自动机。这将是用于自动搜索和发现模型配置(算法,特征集,超参数值等)的系统,该系统导致最佳执行模型,用于给定建模问题。系统还将自动构建生产数据管道以生成为电机供电所需的功能和标签。我们已经解决了我们的功能存储,我们的统一离线和在线数据流水线和超参数搜索功能的大块。我们计划通过Automl加速我们之前的数据科学工作。该系统将允许数据科学家指定一组标签和客观函数,然后将充分利用超隐私和安全感知使用优步数据来查找问题的最佳模型。目标是通过使他们的工作更容易的智能工具放大数据科学家生产力。
  • 模型可视化。理解和调试模型越来越重要,特别是对于深度学习。虽然我们通过了解基于树的模型的可视化工具进行了一些重要的第一步,但需要更需要完成数据科学家理解,调试和调整其模型,并为用户信任结果。
  • 在线学习大多数优步的机器学习模型实时直接影响优步产品。这意味着它们在复杂和不断变化的环境中在物理世界中移动的环境。为了使我们的模型准确在这种环境变化时,我们的模型需要随它而改变。今天,团队经常在米开朗基罗的模型中培训。此用例的完整平台解决方案涉及轻松可更新的型号类型,更快的培训和评估架构以及管道,自动模型验证和部署以及复杂的监控和警报系统。虽然是一个大项目,但早期结果表明在线学习权力取得了大量的潜在收益。
  • 分布式深度学习。越来越多的优步机器学习系统正在实现深度学习技术。在深度学习模型上定义和迭代的用户工作流程与标准工作流程充分不同,使其需要独特的平台支持。深度学习用例通常处理更大数量的数据,以及不同的硬件要求(即GPU)激励进一步投资分布式学习和与灵活资源管理堆栈的更严格集成。

如果您有趣的处理机器学习挑战,请考虑申请职务在我们的团队!

注释