Lyft如何存储支持其ML模型的大规模特征数据?


机器学习是 Lyft 应用程序的支柱,Lyft 的 Feature Serving 服务负责为这些 ML 模型提供特征数据。

  • Lyft 如何使用 Flyte 和 Apache Flink 存储特征定义并将特征数据提取到服务中。
  • Lyft 如何使用 Redis、DynamoDB、Hive 和 Elasticsearch 为其所有 ML 模型提供特征数据。

Lyft 在其应用程序中广泛使用机器学习。他们使用 ML 模型来确定将司机与乘客匹配的最佳方式、计算行程价格、向乘客分发优惠券等等。
为了让 ML 模型运行,Lyft 工程师必须确保模型的特征始终可用。
特征Feature是 ML 模型用来进行预测的输入。
如果你正在构建一个预测房屋售价的机器学习算法,一些特征可能是卧室数量、平方英尺、邮政编码等。

Lyft 机器学习平台的核心部分是他们的 Feature Serving特征服务,它确保 ML 模型可以低延迟地访问特征数据。
Feature Serving 特征服务的核心部分是

  • 特征定义
  • 特征摄取
  • 特征处理与检索

Vinay Kakade 在 Lyft 的机器学习平台工作,他写了一篇关于 Lyft 功能服务架构的精彩博客文章

Lyft 的机器学习模型有两种计算方式。

  • 有些是通过批处理作业计算的。可以通过可以每晚运行的批处理作业来确定哪些用户应该获得 10% 的折扣。
  • 其他是实时计算的。当用户在应用程序中输入她的目的地时,ML 模型必须立即输出乘车的最优价格。

Lyft 还需要通过批处理作业来训练他们的 ML 模型(确定最佳模型参数以产生最佳预测)。
Lyft 的功能服务服务负责确保所有功能都可用于训练 ML 模型和在生产中进行预测。
该服务托管数千个功能,每分钟处理数百万个请求,延迟为个位数毫秒。它具有 99.99% 以上的可用性。

特征定义
这些功能在 SQL 中定义。定义的复杂性可以从单个查询到包含复杂连接和转换的数千行 SQL。
这些定义还具有 JSON 格式的元数据,用于描述功能版本、所有者、验证信息等。

特征数据摄取
对于在批处理数据上定义的特征,Lyft 使用Flyte运行定期安排的特征提取作业。该作业针对 Lyft 的数据仓库执行 SQL,然后写入特征服务。
对于实时特征数据,Lyft 使用Apache Flink。它们针对流窗口执行 SQL ,然后写入特征服务。

特征处理和检索
Feature Serving 服务是用 Golang 编写的,具有用于写入和读取特征数据的 gRPC 和 REST 端点。
将特征数据添加到服务时,会同时写入 DynamoDB 和 Redis(Redis 用作直写缓存以减少 DynamoDB 上的读取负载)。
Lyft 使用 Dynamo 流将特征数据复制到 Apache Hive(他们的数据仓库工具)和 Elasticsearch。
然后,特征服务服务将利用 Redis 缓存、DynamoDB、Hive 和 Elasticsearch 来服务对特征数据的请求。
对于需要快速返回特征数据的实时 ML 模型,Feature Serving 服务将尝试从 Redis 缓存中检索特征数据。如果缓存未命中,则它将从 DynamoDB 检索数据。
对于批处理 ML 模型,他们可以从 Hive 中检索特征数据。如果他们有高级查询,那么他们也可以使用 Elasticsearch。

您可以在此处阅读有关 Lyft 如何使用 Elasticsearch(以及他们进行的性能优化)的更多信息。