作者:SeungBum Shim、HyeKyung Yang、Jesam Kim、Jieun Lim 和 Gonsoo Moon,发表于 2024 年 5 月 16 日 在 [Amazon API Gateway]、[Amazon SageMaker]、[AWS CodeBuild]、[AWS Lambda]、[ExperienceBased Acceleration]、[Technical Howto] 中
在当今竞争激烈的电商环境中,个性化推荐服务成为了提升用户体验的关键因素。LotteON 不仅仅销售产品,更致力于根据客户的生活方式提供个性化推荐。为了改善客户的购物体验,LotteON 的推荐服务开发团队不断对推荐服务进行优化,以便在正确的时刻向客户提供所需或感兴趣的产品。
在本文中,我们将分享 LotteON 如何利用 Amazon SageMaker 和机器学习运维 (MLOps) 改善其推荐服务。
传统的推荐服务主要通过识别产品之间的关系来提供与客户所选产品高度相关的产品。然而,我们意识到需要升级推荐服务,以便深入分析每位客户的喜好和需求。因此,我们决定引入基于深度学习的推荐算法,这种算法不仅能识别数据中的线性关系,还能捕捉更复杂的关系。为此,我们构建了 MLOps 架构来管理模型,并提供实时服务。
另一个需求是建立一个能够与现有推荐平台使用的代码库 GitLab 集成的持续集成和持续交付 (CI/CD) 管道,以便添加新开发的推荐模型,并创建一个可以通过定期再训练和重新分发模型持续改进服务质量的结构。
接下来的部分将介绍我们构建的 MLOps 平台,以便为客户提供高质量的推荐服务,以及实时推断基于深度学习的推荐算法Neural Collaborative Filtering的整体过程,并将其引入 LotteON。

下图展示了作为 MLOps 的 Neural Collaborative Filtering NCF算法推荐模型的解决方案架构。主要使用的 AWS 服务有 SageMaker、Amazon EMR、AWS CodeBuild、Amazon Simple Storage Service (Amazon S3)、Amazon EventBridge、AWS Lambda 和 Amazon API Gateway。我们结合多种 AWS 服务使用 Amazon SageMaker Pipelines,并围绕以下组件设计架构:
组件描述数据预处理清洗和准备输入数据,以便用于模型训练自动化模型训练和部署实现模型的自动训练、验证与上线流程实时推断通过模型服务实现实时推荐CI/CD 结构确保持续集成与交付,保持模型更新准备和预处理阶段包括以下步骤:
数据科学家将包含模型和训练流水线的部署代码发布到 GitLab,而 Jenkins 则将代码上传至 Amazon S3。EMR 预处理批次通过 Airflow 根据指定时间表运行。预处理的数据被加载到 MongoDB 中,作为特征存储,同时与 Amazon S3 联合使用。模型训练和部署阶段包括以下步骤:
在数据上传至 Amazon S3 后,CodeBuild 根据 EventBridge 中指定的规则运行。SageMaker 为 CodeBuild 预定义的流水线依次运行步骤,例如预处理、模型训练和模型注册。当训练完成后通过 Lambda 步骤,已部署的模型将更新至 SageMaker 端点。推断阶段包括以下步骤:
客户端应用向 API 网关发起推断请求。API 网关将请求发送至 Lambda,Lambda 再向 SageMaker 端点的模型发起推断请求以获取推荐列表。Lambda 接收到推荐列表并将其提供给 API 网关。API 网关通过 Recommendation API 将推荐列表提供给客户端应用。NCF 是一款基于 2017 年国际万维网会议上发布的论文的算法。该算法以基于神经网络的协同过滤为基础,克服了线性矩阵分解在传统推荐系统中的局限性。通过神经网络加入非线性因素,作者能够建模用户与商品之间更复杂的关系。NCF 的数据来源于用户与商品的交互数据,整体模型结构如下
尽管 NCF 的模型架构较为简单,但其表现良好,因此我们选择它作为 MLOps 平台的原型。关于该模型的更多信息,请参考论文 Neural Collaborative Filtering。
接下来的部分将讨论此解决方案如何帮助我们构建上述的 MLOps 组件:
数据预处理自动化模型训练和部署实时推断通过模型服务CI/CD 结构对于 NCF,我们使用用户与商品的交互数据,这需要大量资源来处理从应用收集的原始数据并将其转换为适合学习的格式。借助提供 Apache Hadoop 和 Spark 等完全托管环境的 Amazon EMR,我们能够加快数据处理。
数据预处理批次是通过编写 shell 脚本,使用 AWS 命令行界面 AWS CLI命令运行 Amazon EMR,然后将其注册到 Airflow,以便在特定的时间间隔运行。当预处理批次完成后,所需的训练/测试数据将根据运行时间进行分区并存储在 Amazon S3 中。以下是运行 Amazon EMR 的 AWS CLI 命令示例:
bashaws emr createcluster releaselabel emr600 name CLUSTERNAME applications Name=Hadoop Name=Hive Name=Spark tags Name=EMRDATAPREP Owner=MODEL Service=LOTTEON ec2attributes {KeyNamekeynameInstanceProfileDefaultRoleServiceAccessSecurityGroupsgxxxxxxxxxxxxxxSubnetIdsubnetxxxxxxxxxxxxxxEmrManagedSlaveSecurityGroupsgxxxxxxxxxxxxxxEmrManagedMasterSecurityGroupsgxxxxxxxxxxxxxx} instancegroups [{InstanceCount1InstanceGroupTypeMASTERInstanceTyper5xlargeNameMaster Instance Group}{InstanceCount2InstanceGroupTypeCOREInstanceTyper5xlargeNameCore Instance Group}{InstanceCount2BidPriceOnDemandPriceInstanceGroupTypeTASKInstanceTyper5xlargeNameTask Instance Group}] servicerole EMRDefaultRole region apnortheast2 steps Type=CUSTOMJARName=DATAPREPActionOnFailure=CONTINUEJar=s3//apnortheast2elasticmapreduce/libs/scriptrunner/scriptrunnerjarArgs=[s3//bucket/prefix/dataprepbatchsh] autoterminate
在这一部分中,我们讨论模型训练和部署流水线的各个组件。
在预处理批次完成并且训练/测试数据存储于 Amazon S3 之后,此事件会触发 CodeBuild,并在 SageMaker 中运行训练流水线。在这个过程中,记录了预处理批次输出文件的版本,便于动态控制版本并管理流水线运行历史。我们使用 EventBridge、Lambda 和 CodeBuild 连接 Amazon EMR 运行的预处理步骤和 SageMaker 学习流水线的事件基础。
EventBridge 是一个无服务器服务,根据您设置的事件模式和目标,实施规则以接收事件并将其定向到目标。在我们的配置中,EventBridge 的初步角色是当预处理批次将训练数据集存储到 Amazon S3 时,调用一个 Lambda 函数。该 Lambda 函数动态修改 buildspecyml 文件,该文件在 CodeBuild 运行时不可或缺。这些修改包括需要训练的数据的路径、版本和分区信息,都是成功运行训练流水线的关键。EventBridge 的后续角色是派发事件,该事件由 buildspecyml 文件的更改引发,导致运行 CodeBuild。
CodeBuild 负责构建源代码,其定义了 SageMaker 流水线。在整个过程中,它参考 buildspecyml 文件,并运行克隆源代码、安装构建所需库等过程。我们可以通过 CodeBuild 控制台的 Project Build 选项卡查看构建的成功与失败历史,以及 SageMaker 流水线当前的实时日志。
SageMaker Pipelines 帮助您定义 ML 服务所需的 步骤,例如预处理、训练和部署。在 SageMaker Studio 中,您可以可视化每个步骤,这对于管理模型非常有用,您还可以管理经过训练的模型和端点的历史记录。您可以通过将条件语句附加到步骤结果来设置步骤,以便仅采用具有良好再训练结果的模型或为学习失败做准备。我们的流水线包含以下高层步骤:
模型训练模型注册模型创建模型部署每个步骤都在 Amazon SageMaker Studio 中可视化,您还可以实时查看每一步的结果或进展,如下图所示。
让我们通过一些代码示例从模型训练到部署逐步介绍。
首先,您需要定义一个 PyTorch Estimator 以用于训练,并设置训练步骤。这需要您提前准备好训练代码例如,trainpy,并将代码位置作为 sourcedir 的参数传递。训练步骤运行您作为 entrypoint 参数传递的训练代码。默认为实例中指定的容器启动训练,您需要提供所开发的训练 Docker 镜像的路径。但是,如果您在这里指定了估算器的框架,您可以传入所用框架和 Python 版本的版本号,它将自动从 Amazon ECR 获取相应版本的容器镜像。
定义完 PyTorch Estimator 后,您需要定义训练所涉及的步骤。您可以通过将之前定义的 PyTorch Estimator 作为参数传递,并设置输入数据的位置来实现。当您传入输入数据的位置时,SageMaker 训练作业会将训练和测试数据下载至容器中的特定路径,格式为 /opt/ml/input/data/ltchannelnamegt例如,/opt/ml/input/data/train。
此外,在定义 PyTorch Estimator 时,可以使用 metric definitions 来监控在模型训练时生成的学习指标,这些指标可通过 Amazon CloudWatch 监控。您还可以通过指定 estimatoroutputpath 来指定模型训练结果存储位置,并通过 modelhyperparameters 指定模型训练所需的参数。以下是代码示例:
pythonfrom sagemakerpytorch import PyTorch
metricdefinitions=[ {Name HR Regex HR=()} {Name NDCG Regex NDCG=()} {Name Loss Regex Loss=()} ]estimatoroutputpath = fs3//{bucket}/{prefix}modelhyperparameter = {epochs 10 lr 0001 batchsize 256 topk 10 dropout 03 factornum 32 numlayers 3 }s3codeuri = s3//codelocation/sourcetargz
hostestimator = PyTorch( entrypoint=trainpy sourcedir = s3codeuri outputpath = estimatoroutputpath role=awsrole frameworkversion=181 pyversion=py3 instancecount=1 instancetype=mlp32xlarge session = pipelinesession hyperparameters=modelhyperparameter metricdefinitions = metricdefinitions)
from sagemakerinputs import TrainingInputfrom sagemakerworkflowsteps import TrainingStep
dataloc = fs3//{bucket}/{prefix}
steptrain = TrainingStep( name= NCFTraining estimator=hostestimator inputs={ train TrainingInput(s3data=dataloc) test TrainingInput(s3data=dataloc) })
下一步是创建模型包组以管理训练好的模型。通过在模型包中注册训练好的模型,您可以按版本进行管理,如下图所示。这一过程只需在首次训练模型时进行一次,后续可以继续添加和更新模型,只需声明相同的组名即可。
以下是相关代码:
一元机场.cn官网pythonimport boto3
modelpackagegroupname = NCFsmclient = boto3client(sagemaker)modelpackagegroupinputdict = { ModelPackageGroupName modelpackagegroupname ModelPackageGroupDescription Model Package Group}
response = smclientlistmodelpackagegroups(NameContains=modelpackagegroupname)if len(response[ModelPackageGroupSummaryList]) == 0 createmodelpackagegroupresponse = smclientcreatemodelpackagegroup(modelpackagegroupinputdict)
接下来,将训练好的模型添加到您创建的模型包组。在下面的代码中,当您声明 Model 类时,您将获得上一步模型训练的结果,从而创建步骤间的依赖关系。具有声明依赖关系的步骤只有在前一步成功时才能运行。不过,您可以使用 DependsOn 选项,声明步骤之间的依赖关系,即使数据无因果关系。
当训练好的模型在模型包组中注册后,您可以使用这些信息管理和跟踪未来的模型版本,创建一个 实时 SageMaker endpoint、执行 批量转换作业 等。
pythonfrom sagemakerworkflowmodelstep import ModelStepfrom sagemakermodel import Model
inferenceimageuri = 763104351884dkr
AWS 每周动态:Amazon DynamoDB、AWS AppSync、Amazon S3 存储浏览器等2024年9月9日by Danilo Poccia 于2024年9月9日 在 Amazon Bedrock Amazon Elastic Container Service Amazon Sim...
微服务发现:使用 Amazon EC2 及 HashiCorp Consul作者:Marine Haddad Tom Palmer Tony Phan 和 George Agiasoglou发布于 2023年6月30日类别:Amazon EC2 Amazon VPC Architecture AWS...