发布于: Feb 8, 2022

在决定将推荐程序的核心模型开发与生产推理扩展交由 Amazon Web Services 负责之后,我们开始使用 Amazon Personalize 进行开发,并很快感受到将其集成至全扩展机器学习工作流所带来的卓越便捷性。下图所示,为这套解决方案的基本架构。

我们将 Amazon Personalize 插入两部分代码库当中,这两套代码库分别用于创建数据集以及配置 Amazon Personalize 基础设施。以此为基础,我们成功实现了由 Amazon Personalize 驱动的实时推荐引擎的创建、部署与重新训练流程的全面自动化。

创建数据集

Amazon Personalize 为用户提供多种选项,能够根据用户特征与推荐引擎的特定应用方式进行选择。部分 recipe 选项允许您在模型训练过程中考量用户特征(例如 HRNN 元数据),另一部分 recipe 则只关注平台上各用户间的交互(与单一特征/HRNN无关)。我们对具体 recipe 的选择,决定了训练数据集的实际构建方式、以及最终将向 Amazon Personalize 提供多少训练数据集以建立模型解决方案。

我们首先开发出用于训练及测试所有三种 HRNN 变体(纯文本、元数据以及冷启动)的基础,并对结果做出比较。在添加元数据集时,我们刚开始并未发现推荐内容获得任何重大改进;而且发现 HRNN- 冷启动在未进行额外特征工程开发的情况下,并不能生成更为有机的推荐结果。虽然我们怀疑在元数据特征工程方面投入更多精力也许能最终提高性能,但我们仍决定尝试其他更为简单、且同样有望提供高质量建议的解决方案。

要使用 Amazon Personalize HRNN recipe,我们需要为其提供单一数据集,并在其中包含任意时段之内的用户交互数据。这套交互数据集将包含并定义影响核心推荐算法的训练特征。对于像 StockX 这样的电子商务平台,这种交互特征可能表现为产品页面浏览量、搜索结果点击流或者与购买行为相关的操作等指标。

为了构建起交互数据集,我们创建了一条自动化  Python ETL 工作流以查询我们的点击流数据源与产品目录、处理交互数据以提取所需特征,并最终执行 CSV 格式化操作以支持 Amazon Personalize 的摄取要求。由于 Amazon Personalize 原生支持从 Amazon Simple Storage Service (Amazon S3) 导入数据集,因此创建这样的自动化管道并不困难,我们可以节约下大量时间和精力来考虑如何选择最佳 recipe 以及最佳交互时段。

自动创建 Amazon Personalize 基础设施

接下来,我们开始着手对 Amazon Personalize 整体基础设施进行自动化创建。大家当然可以在 Amazon Web Services 管理控制台上手动建立 Amazon Personalize 服务,但配合 Amazon Web Services SDK for Java,我们能够在规模更大的推荐服务管道中实现全自动化与可重复性能力。在这里,我们选择 Scala 作为客户端以创建 Amazon Personalize 基础设施,具体包含以下内容:

  • 数据集组
  • 数据集
  • 导入任务
  • 解决方案
  • 解决方案版本
  • 实时活动

对于一次性训练来说,在控制台上构建基础设施确实更为简单;但要打造出一套真正的全自动化可复用管道,SDK 绝对是不二之选。

部署策略

更重要的是,我们的Scala客户端还承担起对生产部署流程进行仲裁的额外责任,负责保证在推荐模型在重新训练过程中不会造成停机状况。随着用户与平台的持续交互,我们当然有必要对模型进行重新训练,从而及时包含新的交互信息并据此提供最新的推荐。当每天用最新的交互数据重新训练模型时会导致长时间服务中断,因为在此期间活动端点将不可用。我们可以建立两个独立的实时活动端点(以及解决方案版本)来缓解这个问题,但相关成本过高——意味着即使不提供任何实时流量,我们都需要为各端点支付相应的 Amazon Web Services 费用。

为了解决这项部署挑战并建立起更具成本效益的微服务架构,我们围绕中间 Lambda 函数建立起独特的部署策略。该函数负责响应活动端点并向前端客户端提供推荐内容。我们还将一套特殊的数据集组标签(下图最左侧的两个框体)打包至 Lambda 环境变量当中,用于指示当前处于活动状态并服务于生产流量的活动端点。

每天夜间,Scala 客户端都会启动新的训练任务,并首先检查实时数据集组中产生的 Lambda 环境变量。客户端将加载新的交互数据集,重建休眠的数据集组,而后在端点上执行心跳检查以保证端点创建成功。接下来,客户端会指示 Lambda 函数更新其活动的相关环境变量并指向新的端点。最后,不再使用的 Amazon Personalize 基础设施将被撤销。

通过这种方式,我们的微服务架构能够自动高效对 Amazon Personalize 模型进行重新训练,每天按时更新用户推荐内容,且不会带来昂贵的冗余支出或者任何服务停机问题。另外,使用 Lambda 函数还允许我们启用自定义指标对系统进行跟踪与故障监控,及时提醒模型训练的问题或活动端点的错误。这种围绕 Amazon Personalize 精心设计的强大微服务部署策略,在公司发展历史中最为繁忙的购物季期间为 StockX 推荐引擎带来了近乎完美的可用性。下图所示,为这套解决方案的基本架构。

实时功能

在完成了训练与部署流程的设计之后,我们只剩下最后一个问题需要解决:如何在不同训练运行轮次之间,随用户兴趣的变化更新推荐内容。Amazon Personalize 在这方面提供一套简单的解决方案,即事件交互数据集。我们使用 Amazon Personalize putEvents API 将点击流事件添加到模型当中。此点击流源将把各项事件实时推送至 Lambda 函数,该函数又将事件编组为 Amazon Personalize 能够处理的既定格式。事件被添加至数据集后的几秒内,建议内容即可获得快速体现。下图所示,为这一工作流的基本架构。

测试与部属

我们的发布方案现在已经成为 StockX 公司的内部标准——“向您推荐主页集合被部署在用于 A/B 测试的功能标记后面,内部团队能够安全地将该功能推广至1%的用户以执行初始金丝雀测试。最终,我们的测试范围将涵盖 60% 的用户——其中 30% 的用户继续获得旧有体验,30% 的用户则获得个性化首页体验,另外 40% 用户不受测试影响。在逐步扩大功能涵盖范围的过程中,我们发现错误率或延迟并没有随之增长。为了保证万全,我们进行了为期两周的测试。

尽管向您推荐显示在首页中的第二行位置,但其点击率却超过了显示在最顶端的最受欢迎行。按百分比计算,向您推荐已经成为我们表现最好的购买通道。而在其支持下,我们整个主页的总体客户参与度提高了 50%,这证明个性化、甚至只是单一页面的个性化,也足以提高业务体系的总体使用感受。

时至今日,个性化已经成为企业高管团队的一大核心战略目标。而我们打造的推荐引擎,正是其中一项关键成果。与负责产品发现体验的产品负责人共同制定出战术决策之后,作为独角兽初创企业的我们深刻意识到个性化的重要性,并通过 A/B 测试实际证明了个性化的强大能力。在获得初步成果之后,困扰我们的已经不再是要不要推广个性化,而是如何保证个性化元素能够渗透至StockX客户体验的每一个角落。机器学习团队一直是 StockX 内部最具数据驱动能力的工程团队之一,而此次进行的实验也证明我们完全有能力通过可量化的 KPI 改善客户的实际体验。

总结

在项目实施期间,机器学习团队学到关于构建机器学习微服务架构的许多知识。我们将这些心得体会总结如下:

  • 尽早集成——在项目生命周期中尽早发布演示方案非常重要。即使是简单的推荐算法,也会给各相关方留下深刻的印象,并帮助我们顺利争取到内部资源与更高的项目优先级。
  • 可视化——可视化工具对于机器学习模型的测试至关重要。单纯将原始产品ID作为健全性检查对象还远远不够,我们需要并行提供推荐产品的图片与隐性关联证据,借此评估推荐程序的实际效果。
  • 预防过度复杂——Amazon Personalize 提供多种机器学习框架选项,各选项在复杂度方面也有着巨大差异。我们也曾尝试从复杂的 recipe 起步,并发现很难理解其为何会提出一些奇怪的建议。而从简单的 HRNN recipe 起步,我们得以快速开发出令人印象深刻的工作示例。
  • 估算成本——机器学习成本高昂。请保证对于工程决策的对应预算需求拥有明确的估计。除了云基础设施使用成本之外,开发人员为此投入的时间也是一种重要的成本构成元素。
  • 了解扩展特性——要构建自己的深度学习推荐系统,请首先保证对推理任务的扩展特性拥有充分了解。忙活了半天,却发现自己的解决方案跟不上流量峰值期间的业务要求,绝对会令人陷入崩溃。
  • 彻底消除手动操作——相较于传统后端服务架构,机器学习微服务架构包含有更多活动部件。因此,请务必自动处理工作流中的所有内容——只要还有任何一部分ETL或者部署流程需要人工干预,即代表着项目失败。机器学习的工程部分已经相当困难了,没人愿意同时再承担一部分运营压力。

为您推荐成为我们团队乃至整个 StockX 公司的一次巨大胜利。我们开始迅速将机器学习技术整合至企业中的各个层面。而我们获得成功的秘密,在于企业决策者同意将 Amazon Personalize 集成至更多 StockX 体验当中,并不断扩大我们在机器学习领域投入的精力。可以肯定地讲,个性化如今已经成为 StockX 内部的头等大事。

我们的团队在这场假期购物季的几周之前着手项目开发,并在购物季到来时及时将其上线。可以自豪地说,在 Amazon Personalize 的帮助下,我们的微服务架构在整个假期当中都表现出近乎完美的可用性。

相关文章