亚马逊AWS官方博客
使用 Amazon Personalize 快速搭建推荐服务
Amazon Personalize是 AWS 完全托管的服务。Amazon Personalize 将Amazon.com 二十多年机器学习的应用经验集成到服务当中,并且可以根据用户数据进一步定制化的调整模型。不需要任何ML经验,您就可以开始使用简单的API,通过几次点击就可以构建复杂的个性化推荐功能。
在本文中,将向您展示如何使用Amazon Personalize构建自动训练和推理的推荐服务。文中采用MovieLens电影评分数据作为样本数据并将数据存储在S3中,文中将利用Lambda函数触发数据更新,模型训练,模型更新和模型批量推理。
推荐服务架构
- 应用推送用户数据,电影数据,用户评分数据,推理用户列表数据,推理结果数据到相应的S3桶
- 将全量数据按照定义的格式从S3导入Amazon Personalize中
- Lambda定时触发模型训练任务
- 应用推送增量数据到S3桶中,Lambda函数触发数据更新任务和模型更新任务
- 应用推送推理用户列表数据到S3桶,Lambda函数触发模型推理任务,推理结果文件写入S3桶中
权限设置
在 IAM 中创建 Role 用来 Amazon Personalize 数据导入,数据更新,模型训练,模型更新,模型推理
进入 AWS 控制台中,创建 Personalize 的 service role。将 AmazonPersonalizeFullAccess 权限赋予该 role,取名 PersonalizeRole。我们还需要 PersonalizeRole 能够访问相应的 S3 桶,所以我们要赋予相应的桶访问权限。
为 PersonalizeRole 添加 S3 访问策略:
回到 IAM 首页,点击左侧 Policy。
点击Create policy
选择JSON,把下面的json粘贴到输入框中,点击Review policy。
如您在项目中有特定的S3桶,需要在Resource中修改或者添加S3桶名。该blog以global资源为例,如果是用中国区资源需要将相关policy中 arn中 aws 改为 aws-cn
添加访问策略名称和描述,点击创建策略
回到角色PersonalizeRole页,添加新创建的PersonalizeS3BucketAccessPolicy
访问策略.
点击Attach policies
在搜索框中搜索PersonalizeS3BucketAccessPolicy,选中该策略,点击Attach policy
创建S3桶。
下面以创建user-personalization-demo-fulldata为例。其余桶按照同样方法创建
user-personalization-demo-fulldata:存储全量数据(csv格式)
user-personalization-demo-datasetupdate:存储增量数据(csv格式)
user-personalization-demo-batch-input:存储推荐用户列表数据(json格式)
user-personalization-demo-batch-output:存储批量推荐结果(json格式)
AWS 进入S3服务。点击右上角create bucket创建桶
输入S3桶名称,例如user-personalization-demo-fulldata
加密部分选择Enable,Amazon S3 key。点击创建桶
进入S3桶修改桶访问策略,进入Permissions项
在桶策略部分点击编辑
将下面的json拷贝到输入框
如果S3桶名有变化或有添加,需要在Resource中修改或者添加S3桶名。该blog以global资源为例,如果是用中国区资源需要将相关policy中 arn中 aws 改为 aws-cn
点击保存策略
创建Lambda Service Role,赋予Lambda访问S3,Amazon Personalize的权限
进入IAM,点击Roles,点击Create role
点击Lambda
添加AmazonS3FullAccess, CloudWatchFullAccess , AWSLambdaFullAccess , AmazonPersonalizeFullAccess
输入Role name: lambda-s3-personalize。点击 Create role 完成 role 创建。
数据处理
MovieLens 数据需要进行处理来满足 Amazon Personalize的数据要求。下面的代码会对评分数据修改列名,生成用户数据,对电影数据修改列名。并结果保存成csv格式
- ‘users.csv’ 用户数据
- ‘items.csv’ 电影数据
- ‘interacts.csv’ 用户评分数据
数据导入
本文中,需要用户数据集,电影数据集和交互数据集创建一个数据集组。有关创建数据集组的说明,请参阅Getting started (console)。
创建模型训练Lambda函数
使用lambda-s3-personalize role和下面的代码创建模型训练Lambda函数,训练需指定训练recipe,数据组
在创建完Lambda函数之后,可以为训练函数添加定时训练触发。例如我们可以用 EventBridge 定义每月训练一次cron(0 2 1 * ? *)。
创建数据更新,模型更新Lambda函数
使用lambda-s3-personalize role和下面的代码创建Lambda函数,代码会对新增的数据csv文件进行解析,并更新Amazon Personalize中相应的数据,最后对模型进行更新。模型更新是为了在未来的推荐中有新用户或者是新电影
如果您的数据中有必须字段之外的字段,需在代码中添加相应字段以完成数据导入。
由于是数据更新,所以我们在 Lambda 函数的触发设定为 S3 桶事件触发。在 S3 新增数据桶中有任何的数据导入,都会触发该函数。当user-personalization-demo-datasetupdate 桶中有数据更新时,会触发数据更新和模型更新。
创建模型批量推理Lambda函数
用下面的代码创建Lambda函数,代码会根据user-personalization-demo-batch-input中的用户数据列表,Amazon Personalize会为这些用户做出系统推荐,并且将模型推荐结果写入user-personalization-demo-batch-output
Lambda函数的触发设定为S3桶事件触发。在S3模型预测用户列表数据桶中有任何的数据导入,都会触发该函数
推理用户列表数据要求为json格式
推荐结果存在user-personalization-demo-batch-output s3桶中,格式如下:
总结
到此我们已经利用Amazon Personalize 构建了一个推荐服务。现在 Amazon Personalize 将每个月定期重新训练模型。当我们的应用往新增数据桶中导入数据时,Amazon Personalize 也将为数据和模型进行更新。当应用往‘user-personalization-demo-batch-input’S3 桶中导入新的用户数据列表时,Amazon Personalize 将为这些用户进行批量推荐,并将推荐结果写到‘user-personalization-demo-batch-input’S3 桶中。