译文:Airbnb的机器学习功能平台Chronon现已开源

以云看科技 2024-09-07 02:43:11

提供可观察性和管理工具的功能平台,允许 ML 从业者使用各种数据源,同时处理数据工程的复杂性,并提供低延迟流。

Chronon 允许 ML 从业者使用各种数据源作为特征转换的输入。它可以处理数据管道的复杂性,例如批量和流式计算,提供低延迟服务,并提供大量可观察性和管理工具。

Airbnb 很高兴地宣布,我们的 ML 功能平台Chronon现已开源。加入我们的社区 Discord 频道与我们聊天。

我们很高兴能与 Stripe 的合作伙伴一起宣布这一消息,他们是该项目的早期采用者和共同维护者。

这篇博文介绍了 Chronon 的主要动机和功能。有关 Chronon 核心概念的概述,请参阅之前的文章。

背景

我们构建了 Chronon 来缓解机器学习从业者的一个常见痛点:他们大部分时间都花在管理支持模型的数据上,而不是建模本身。

在 Chronon 出现之前,从业者会使用以下两种方法之一:

离线-在线复制:机器学习从业者使用数据仓库中的数据训练模型,然后找出在在线环境中复制这些特征的方法。这种方法的好处是,它允许从业者利用完整的数据仓库,包括数据源和强大的工具来进行大规模数据转换。缺点是,这没有明确的方法为在线推理提供模型特征,导致不一致和标签泄漏,严重影响模型性能。记录并等待:机器学习从业者从在线服务环境中可用的数据开始,模型推理将从这些数据中运行。他们将相关特征记录到数据仓库中。一旦积累了足够的数据,他们就会在日志上训练模型,并使用相同的数据提供服务。这种方法的好处是可以保证一致性,并且不太可能出现泄漏。然而,它的主要缺点是它可能导致长时间的等待,从而妨碍快速响应不断变化的用户行为的能力。

Chronon 方法兼具两者的优点。Chronon 要求 ML 从业者仅定义一次特征,既支持模型训练的离线流程,也支持模型推理的在线流程。此外,Chronon 还提供了功能强大的工具,用于特征链、可观察性和数据质量以及特征共享和管理。

工作原理

下面,我们将使用来自快速入门指南的简单示例来探索支持 Chronon 大部分功能的主要组件。您可以按照该指南运行此示例。

假设我们是一家大型在线零售商,我们根据用户购买商品后退货的情况检测到了欺诈行为。我们希望训练一个模型来预测特定交易是否可能导致欺诈性退货。每次用户开始结账流程时,我们都会调用此模型。

定义特征

购买数据:我们可以将购买日志数据汇总到用户级别,以便我们了解该用户之前在我们平台上的活动。具体来说,我们可以计算他们之前在不同时间窗口内的购买金额的总和、计数和平均值。

source = Source( events=EventSource( table="data.purchases", # This points to the log table in the warehouse with historical purchase events, updated in batch daily topic="events/purchases", # The streaming source topic query=Query( selects=select("user_id","purchase_price"), # Select the fields we care about time_column="ts") # The event time ))window_sizes = [Window(length=day, timeUnit=TimeUnit.DAYS) for day in [3, 14, 30]] # Define some window sizes to use belowv1 = GroupBy( sources=[source], keys=["user_id"], # We are aggregating by user online=True, aggregations=[Aggregation( input_column="purchase_price", operation=Operation.SUM, windows=window_sizes ), # The sum of purchases prices in various windows Aggregation( input_column="purchase_price", operation=Operation.COUNT, windows=window_sizes ), # The count of purchases in various windows Aggregation( input_column="purchase_price", operation=Operation.AVERAGE, windows=window_sizes ), # The average purchases by user in various windows Aggregation( input_column="purchase_price", operation=Operation.LAST_K(10), ), # The last 10 purchase prices aggregated as a list ],)

这将创建一个 `GroupBy`,通过聚合不同时间窗口内的不同字段,将 `purchases` 事件数据转换为有用的特征,其中 `user_id` 为主键。

这会将原始购买日志数据转换为用户级别的有用功能。

用户数据:将用户数据转换为特征要简单一些,主要是因为我们不必担心执行聚合。在这种情况下,源数据的主键与特征的主键相同,因此我们可以简单地提取列值,而不是对行执行聚合:

source = Source( entities=EntitySource( snapshotTable="data.users", # This points to a table that contains daily snapshots of all users query=Query( selects=select("user_id","account_created_ds","email_verified"), # Select the fields we care about ) ))v1 = GroupBy( sources=[source], keys=["user_id"], # Primary key is the same as the primary key for the source table aggregations=None, # In this case, there are no aggregations or windows to define online=True,)

这将创建一个“GroupBy”,它从“data.users”表中提取维度用作特征,并以“user_id”作为主键。

将这些特征结合在一起:接下来,我们需要将之前定义的特征组合成一个视图,该视图既可以用于模型训练,也可以作为模型推理的完整向量在线提供。我们可以使用 Join API 来实现这一点。

对于我们的用例,从正确的时间戳开始计算特征非常重要。由于我们的模型在结账流程开始时运行,因此我们希望在补填中使用相应的时间戳,以便模型训练的特征值在逻辑上与模型在在线推理中看到的特征值相匹配。

定义如下所示。请注意,它结合了我们之前在 API 的 right_parts 部分中定义的功能(以及另一个名为 returns 的功能集)。

source = Source( events=EventSource( table="data.checkouts", query=Query( selects=select("user_id"), # The primary key used to join various GroupBys together time_column="ts", ) # The event time used to compute feature values as-of ))v1 = Join( left=source, right_parts=[JoinPart(group_by=group_by) for group_by in [purchases_v1, returns_v1, users]] # Include the three GroupBys)回填/离线计算

用户使用上述 Join 定义可能要做的第一件事就是使用它进行回填,以生成用于模型训练的历史特征值。Chronon 执行此回填具有以下几个主要优点:

时间点准确性:请注意上面连接中用作“左侧”的源。它建立在“data.checkouts”源之上,其中包含与该特定结账的逻辑时间相对应的每行“ts”时间戳。每个特征计算都保证在该时间戳的窗口范围内准确。因此,对于之前用户购买的一个月总和,每一行都将根据左侧源提供的时间戳为用户计算。倾斜处理: Chronon 的补填算法针对处理高度倾斜的数据集进行了优化,避免了令人沮丧的 OOM 和挂起的作业。计算效率优化: Chronon 能够直接在后端加入多项优化,从而减少计算时间和成本。在线计算

Chronon 简化了在线特征计算的复杂性。在上面的例子中,它会根据特征是批量特征还是流式特征来计算特征。

批量特征(例如上面的用户特征)

由于用户特征是建立在批处理表之上的,因此当新数据进入批处理数据存储时,Chronon 只需运行每日批处理作业来计算新的特征值,然后将其上传到在线 KV 存储进行服务。

流媒体功能(例如上面的购买功能)

购买功能建立在包含流式传输组件的源上,如源中包含“主题”所示。在这种情况下,除了流式传输作业外,Chronon 仍将运行批量上传以进行实时更新。批处理作业负责:

播种值:对于长窗口,倒回流并播放所有原始事件是不切实际的。压缩“窗口中间”并提供尾部精度:为了获得精确的窗口精度,我们需要窗口头部和尾部的原始事件。

然后,流式作业将更新写入 KV 存储,以使特征值在获取时保持最新。

在线服务/获取 API

Chronon 提供了一个 API 来以低延迟获取特征。我们可以获取单个 GroupBy(即上面定义的用户或购买特征)的值,也可以获取 Join 的值。以下是 Join 的一个此类请求和响应的示例:

// Fetching all features for user=123Map<String, String> keyMap = new HashMap<>();keyMap.put("user", "123")Fetcher.fetch_join(new Request("quickstart_training_set_v1", keyMap));// Sample response (map of feature name to value)'{"purchase_price_avg_3d":14.2341, "purchase_price_avg_14d":11.89352, ...}'

获取用户 123 的所有特征的 Java 代码。返回类型是特征名称到特征值的映射。

以上示例使用 Java 客户端。还有一个 Scala 客户端和一个 Python CLI 工具,可轻松进行测试和调试:

run.py --mode = fetch -k '{“ user_id”:123}' -n quickstart / training_set -t join > { “ purchase_price_avg_3d”:14.2341,“ purchase_price_avg_14d”:11.89352,...}

利用 run.py CLI 工具发出与上述 Java 代码相同的获取请求。run.py 是一种快速测试 Chronon 工作流程(如获取)的便捷方法。

另一种选择是将这些 API 包装成服务并通过 REST 端点发出请求。Airbnb 内部使用此方法在非 Java 环境(例如 Ruby)中获取功能。

线上线下一致性

Chronon 不仅有助于提高在线-离线准确性,还提供了一种测量方法。测量管道从在线获取请求的日志开始。这些日志包括请求的主键和时间戳,以及获取的特征值。然后,Chronon 将键和时间戳作为左侧传递给 Join backfill,要求计算引擎回填特征值。然后,它将回填的值与实际获取的值进行比较以测量一致性。

下一步是什么?

开源只是我们期待与 Stripe 的合作伙伴以及更广泛的社区一起迈出的激动人心的旅程的第一步。

我们的愿景是创建一个平台,让机器学习从业者能够就如何利用数据做出最佳决策,并让这些决策尽可能简单。以下是我们目前用来制定路线图的一些问题:

我们还能将迭代和计算的成本降低多少?

Chronon 已经针对 Airbnb 和 Stripe 等大型公司处理的数据规模进行了构建。但是,我们始终可以对计算引擎进行进一步优化,以降低计算成本以及创建和试验新功能的“时间成本”。

我们可以让编写新功能变得多么容易?

特征工程是人类表达其领域知识以创建模型可以利用的信号的过程。Chronon 可以集成 NLP,让 ML 从业者能够用自然语言表达这些特征思想,并生成有效的特征定义代码作为迭代的起点。

降低功能创建的技术门槛反过来会为机器学习从业者与拥有宝贵领域专业知识的合作伙伴之间的新式合作打开大门。

我们能否改进模型的维护方式?

用户行为的变化可能会导致模型性能发生变化,因为模型训练所依据的数据不再适用于当前情况。我们设想一个平台,它可以检测到这些变化,并制定策略,尽早主动解决这些问题,无论是通过重新训练、添加新功能、修改现有功能,还是以上几种方式的组合。

该平台本身是否可以成为帮助机器学习从业者构建和部署最佳模型的智能代理?

我们收集到平台层的元数据越多,它作为通用机器学习助手的功能就越强大。

我们提到了创建一个平台的目标,该平台可以自动使用新数据运行实验,以确定改进模型的方法。这样的平台还可以帮助数据管理,让机器学习从业者提出诸如“在建模此用例时,哪些类型的特征最有用?”或“哪些数据源可以帮助我创建捕获有关此目标的信号的特征?”之类的问题。能够回答这些问题的平台代表了智能自动化的下一个层次。

入门

这里有一些资源可以帮助您入门或评估 Chronon 是否适合您的团队。

查看Github 上的项目、Chronon 网站以及快速入门指南。加入我们的社区 Discord 频道。Airbnb 和 Stripe 团队很高兴与您讨论 Chronon 如何适合您的堆栈。致谢

Sponsors: Henry Saputra Yi Li Jack Song

Contributors: Pengyu Hou Cristian Figueroa Haozhen Ding Sophie Wang Vamsee Yarlagadda Haichun Chen Donghan Zhang Hao Cen Yuli Han Evgenii Shapiro Atul Kale Patrick Yoon

作者:Varant Zanoyan、Nikhil Simha Raprolu

出处:https://medium.com/airbnb-engineering/chronon-airbnbs-ml-feature-platform-is-now-open-source-d9c4dba859e8

0 阅读:4

以云看科技

简介:感谢大家的关注