获取批量建议 - Amazon Personalize
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

获取批量建议

要获取不需要实时更新的大型数据集的建议,您可以使用异步批处理工作流。例如,您可能会获得针对电子邮件列表中所有用户的产品推荐,或获取物品与物品之间的相似性 (SIMS)跨清单。

要通过 Amazon Simple Service (Amazon Personalize Simple) 获取批量建议,您需要使用批量推理作业。A批量推理作业是一种从 Amazon S3 存储桶导入批量输入数据的工具,使用您的解决方案版本生成建议,并将建议导出到 Amazon S3 存储桶。

批处理工作流程如下:

  1. 准备 JSON 格式的用户或项目(或两者)列表并上传到 Amazon S3 存储桶。输入数据的格式取决于您使用的配方。请参阅 准备和导入批量输入数据

  2. 为输出数据创建一个单独的位置,可以是一个文件夹或另一个 Amazon S3 存储桶。

  3. 创建批量推理作业。请参阅创建批量推理作业(控制台)创建批量推理作业 (Amazon CLI),或者创建批量推理作业 (Amazon开发工具包)

  4. 批量推理作业完成后,从 Amazon S3 中的输出位置检索建议。

Batch 工作流权限要求

对于批处理工作流程,您的 Amazon Personalize IAM 服务角色需要权限才能访问您的 Amazon S3 存储桶并将文件添加到您的 Amazon S3 存储桶。有关授予权限的信息,请参阅批处理工作流的服务相关角色策略。有关存储桶权限的更多信息,请参阅。用户策略示例中的Amazon Simple Storage Service (S3) 开发人员指南

Amazon S3 存储桶和数据元必须是免加密的,或者如果您使用Amazon Key Management Service(AmazonKMS)进行加密,您必须向您的 IAM 用户和 Amazon Personalize 服务链接角色授予使用您的密钥的权限。您还必须将 Amazon Personalize 作为原则添加到Amazon KMS密钥策略。有关更多信息,请参阅 。使用 中的密钥策略AmazonKMS中的Amazon Key Management Service开发人员指南

Batch 工作流程评分

批量推理作业计算的项目分数的计算方式如获取实时推荐。您可以在批量推理作业的输出 JSON 文件中查看分数。只有使用 HRNN 和 Personalize-Ranking 方法训练的模型才能返回分数。

准备和导入批量输入数据

批处理推理作业使用解决方案版本根据输入 JSON 文件中提供的用户或项目(或两者)提供建议。您必须准备 JSON 文件并上传到 Amazon S3 存储桶,才能获取批量建议。我们建议您在 Amazon S3 存储桶中创建一个输出文件夹,或使用单独的输出 Amazon S3 存储桶。这允许您使用相同的输入数据位置运行多个批量推理作业。

准备和导入数据

  1. 根据您的解决方案使用的配方格式化批量输入数据。您的输入数据是一个 JSON 文件,其中包含用户 ID 列表(用户 _ 个性化配方)、IteMID 列表(相关项目配方)或两者(个性化 _ 排名配方)。用新行分隔每个用户、项目或用户和项目列表。有关示例,请参阅 输入和输出 JSON 示例

  2. 将输入 JSON 上传到 Amazon S3 存储桶中的输入文件夹。有关更多信息,请参阅 。使用拖放功能上传文件和文件夹(Amazon Simple Storage Service 控制台用户指南)。

  3. 为输出数据创建一个单独的位置,可以是一个文件夹或另一个 Amazon S3 存储桶。为输出 JSON 创建单独的位置允许您使用相同的输入数据位置运行多个批量推理作业。

输入和输出 JSON 示例

如何设置输入数据的格式取决于您使用的配方。以下是针对每种配方类型格式正确的 JSON 输入和输出示例。

用户个性化和传统 HRNN 配方

Input

分隔每个userId添加一个新行,如下所示。

{"userId": "4638"} {"userId": "663"} {"userId": "3384"} ...
Output
{"input":{"userId":"4638"},"output":{"recommendedItems":["63992","115149","110102","148626","148888","31685","102445","69526","92535","143355","62374","7451","56171","122882","66097","91542","142488","139385","40583","71530","39292","111360","34048","47099","135137"],"scores":[0.0152238,0.0069081,0.0068222,0.006394,0.0059746,0.0055851,0.0049357,0.0044644,0.0042968,0.004015,0.0038805,0.0037476,0.0036563,0.0036178,0.00341,0.0033467,0.0033258,0.0032454,0.0032076,0.0031996,0.0029558,0.0029021,0.0029007,0.0028837,0.0028316]},"error":null} {"input":{"userId":"663"},"output":{"recommendedItems":["368","377","25","780","1610","648","1270","6","165","1196","1097","300","1183","608","104","474","736","293","141","2987","1265","2716","223","733","2028"],"scores":[0.0406197,0.0372557,0.0254077,0.0151975,0.014991,0.0127175,0.0124547,0.0116712,0.0091098,0.0085492,0.0079035,0.0078995,0.0075598,0.0074876,0.0072006,0.0071775,0.0068923,0.0066552,0.0066232,0.0062504,0.0062386,0.0061121,0.0060942,0.0060781,0.0059263]},"error":null} {"input":{"userId":"3384"},"output":{"recommendedItems":["597","21","223","2144","208","2424","594","595","920","104","520","367","2081","39","1035","2054","160","1370","48","1092","158","2671","500","474","1907"],"scores":[0.0241061,0.0119394,0.0118012,0.010662,0.0086972,0.0079428,0.0073218,0.0071438,0.0069602,0.0056961,0.0055999,0.005577,0.0054387,0.0051787,0.0051412,0.0050493,0.0047126,0.0045393,0.0042159,0.0042098,0.004205,0.0042029,0.0040778,0.0038897,0.0038809]},"error":null} ...

热门程度-计数

Input

分隔每个userId添加一个新行,如下所示。

{"userId": "12"} {"userId": "105"} {"userId": "41"} ...
Output
{"input": {"userId": "12"}, "output": {"recommendedItems": ["105", "106", "441"]}} {"input": {"userId": "105"}, "output": {"recommendedItems": ["105", "106", "441"]}} {"input": {"userId": "41"}, "output": {"recommendedItems": ["105", "106", "441"]}} ...

个性化排名

Input

分隔每个userId和列表itemIds按如下所示的新行进行排序。

{"userId": "891", "itemList": ["27", "886", "101"]} {"userId": "445", "itemList": ["527", "55", "901"]} {"userId": "71", "itemList": ["27", "351", "101"]} ...
Output
{"input":{"userId":"891","itemList":["27","886","101"]},"output":{"recommendedItems":["27","101","886"],"scores":[0.48421,0.28133,0.23446]}} {"input":{"userId":"445","itemList":["527","55","901"]},"output":{"recommendedItems":["901","527","55"],"scores":[0.46972,0.31011,0.22017]}} {"input":{"userId":"71","itemList":["29","351","199"]},"output":{"recommendedItems":["351","29","199"],"scores":[0.68937,0.24829,0.06232]}} ...

SIMS

Input

分隔每个itemId添加一个新行,如下所示。

{"itemId": "105"} {"itemId": "106"} {"itemId": "441"} ...
Output
{"input": {"itemId": "105"}, "output": {"recommendedItems": ["106", "107", "49"]}} {"input": {"itemId": "106"}, "output": {"recommendedItems": ["105", "107", "49"]}} {"input": {"itemId": "441"}, "output": {"recommendedItems": ["2", "442", "435"]}} ...

创建批量推理作业(控制台)

在您完成后准备和导入批量输入数据,您已准备好创建批量推理作业。此过程假定您已经创建了解决方案和解决方案版本(训练模型)。要获取批量建议,请创建批量推理作业,并指定作业名称

获取批量建议(控制台)

  1. 从打开 Amazon Simple Service 控制台https://console.aws.amazon.com/personalize/home,并登录您的账户。

  2. 在导航窗格中选择 Batch inference jobs (批处理推理作业),然后选择 Create batch inference job (创建批处理推理作业)

  3. Batch inference job details (批处理推理作业详细信息) 中,在 Batch inference job name (批处理推理作业名称) 中,指定批处理推理作业的名称。

  4. 适用于IAM 服务角色中,选择您在设置期间为 Amazon Personalize 创建的 IAM 服务角色。此角色必须分别具有对输入和输出 Amazon S3 存储桶的读写访问权限。

  5. 适用于解决方案,选择解决方案,然后选择解决方案版本 ID,您希望用于生成建议。

  6. 适用于输入数据配置中,指定指向输入文件的 Amazon S3 路径。您的输入数据必须采用解决方案使用的配方的正确格式。有关输入数据示例,请参阅输入和输出 JSON 示例

  7. 适用于输出数据配置中,指定指向输出位置的路径。我们建议您为输出数据使用不同的位置(文件夹或不同的 Amazon S3 存储桶)。

  8. 适用于筛选器配置(可选)选择一个过滤器,将筛选器应用于添加到输出 JSON 文件的建议。有关更多信息,请参阅 筛选批量建议

  9. 选择 Create batch inference job (创建批处理推理作业)。此时将开始创建批处理推理作业,Batch inference jobs (批处理推理作业) 页面将显示,并显示 Batch inference job detail (批处理推理作业详细信息) 部分。

  10. 当批处理推理作业的状态更改为处于活动状态,您可以从指定的输出 Amazon S3 存储桶中检索作业的输出。输出文件的名称将采用 input-name.out 格式。

创建批量推理作业 (Amazon CLI)

在您完成后准备和导入批量输入数据,您可以使用以下create-batch-inference-job代码。指定作业名称,替换Solution version ARN替换为解决方案版本的 Amazon 资源名称 (ARN),并将IAM service role ARN与您在设置期间为 Amazon Personalize 创建的 IAM 服务角色的 ARN。此角色必须分别具有对输入和输出 Amazon S3 存储桶的读写访问权限。

ReplaceS3 input pathS3 output path与您的输入文件和输出位置的 Amazon S3 路径。我们建议您为输出数据使用不同的位置(文件夹或不同的 Amazon S3 存储桶)。您可以将筛选器应用于添加到输出 JSON 文件的建议。有关更多信息,请参阅 筛选批量建议

此示例包括可选的用户个性化配方itemExplorationConfig超参数:explorationWeightexplorationItemAgeCutOff。(可选)包括explorationWeightexplorationItemAgeCutOff值来配置浏览。有关更多信息,请参阅用户个性化配方

aws personalize create-batch-inference-job --job-name Batch job name \ --solution-version-arn Solution version ARN \ --job-input s3DataSource={path=s3://S3 input path} \ --job-output s3DataDestination={path=s3://S3 output path} \ --role-arn IAM service role ARN \ --batch-inference-job-config "{\"itemExplorationConfig\":{\"explorationWeight\":\"0.3\",\"explorationItemAgeCutOff\":\"30\"}}" { "batchInferenceJobArn": "arn:aws:personalize:us-west-2:012345678901:batch-inference-job/batchTest" }

创建批量推理作业 (Amazon开发工具包)

在您完成后准备和导入批量输入数据,您就可以使用CreateBatchInferenceJoboperation. 以下代码显示如何使用Amazon SDK for Python (Boto3)或者Amazon SDK for Java 2.x。

SDK for Python (Boto3)

请使用以下create_batch_inference_job代码创建批量推理作业。指定Batch job name,将Solution version ARN替换为解决方案版本的 Amazon 资源名称 (ARN),并将IAM service role ARN与您在设置期间为 Amazon Personalize 创建的 IAM 服务角色的 ARN。他的角色必须分别具有对输入和输出 Amazon S3 存储桶的读写访问权限。

ReplaceS3 input pathS3 output path与您的输入文件和输出位置的 Amazon S3 路径。我们建议您为输出数据使用不同的位置(文件夹或不同的 Amazon S3 存储桶)。您可以将筛选器应用于添加到输出 JSON 文件的建议。有关更多信息,请参阅 筛选批量建议

此示例包括可选的用户个性化配方itemExplorationConfig超参数:explorationWeightexplorationItemAgeCutOff。(可选)包括explorationWeightexplorationItemAgeCutOff值来配置浏览。有关更多信息,请参阅用户个性化配方

import boto3 personalize_rec = boto3.client(service_name='personalize') personalize_rec.create_batch_inference_job ( solutionVersionArn = "Solution version ARN", jobName = "Batch job name", roleArn = "IAM service role ARN", batchInferenceJobConfig = { # optional USER_PERSONALIZATION recipe hyperparameters "itemExplorationConfig": { "explorationWeight": "0.3", "explorationItemAgeCutOff": "30" } }, jobInput = {"s3DataSource": {"path": "S3 input path"}}, jobOutput = {"s3DataDestination": {"path": "S3 output path"}} )
SDK for Java 2.x

请使用以下createPersonalizeBatchInferenceJob方法创建批量推理作业。将以下内容作为参数传递:Amazon Personalize 服务客户端、解决方案版本的 ARN(Amazon 资源名称)、作业名称、bucket-name/file.csv存储输入数据的位置(S3 输入数据源路径),bucket-name/folder-name的输出数据位置(S3 数据存储路径)和服务链接角色的 ARN(请参阅为 Amazon Personalize 创建 IAM 角色)。我们建议您为输出数据使用不同的位置(文件夹或不同的 Amazon S3 存储桶)。

此示例包括可选的用户个性化配方itemExplorationConfig字段:explorationWeightexplorationItemAgeCutOff。(可选)包括explorationWeightexplorationItemAgeCutOff值来配置浏览。有关更多信息,请参阅用户个性化配方

public static String createPersonalizeBatchInferenceJob(PersonalizeClient personalizeClient, String solutionVersionArn, String jobName, String s3InputDataSourcePath, String s3DataDestinationPath, String roleArn, String explorationWeight, String explorationItemAgeCutOff) { long waitInMilliseconds = 60 * 1000; String status; String batchInferenceJobArn; try { // Set up data input and output parameters. S3DataConfig inputSource = S3DataConfig.builder() .path(s3InputDataSourcePath) .build(); S3DataConfig outputDestination = S3DataConfig.builder() .path(s3DataDestinationPath) .build(); BatchInferenceJobInput jobInput = BatchInferenceJobInput.builder() .s3DataSource(inputSource) .build(); BatchInferenceJobOutput jobOutputLocation = BatchInferenceJobOutput.builder() .s3DataDestination(outputDestination) .build(); // Optional code to build the User-Personalization specific item exploration config. HashMap<String, String> explorationConfig = new HashMap<>(); explorationConfig.put("explorationWeight", explorationWeight); explorationConfig.put("explorationItemAgeCutOff", explorationItemAgeCutOff); BatchInferenceJobConfig jobConfig = BatchInferenceJobConfig.builder() .itemExplorationConfig(explorationConfig) .build(); // End optional User-Personalization recipe specific code. CreateBatchInferenceJobRequest createBatchInferenceJobRequest = CreateBatchInferenceJobRequest.builder() .solutionVersionArn(solutionVersionArn) .jobInput(jobInput) .jobOutput(jobOutputLocation) .jobName(jobName) .roleArn(roleArn) .batchInferenceJobConfig(jobConfig) // Optional .build(); batchInferenceJobArn = personalizeClient.createBatchInferenceJob(createBatchInferenceJobRequest) .batchInferenceJobArn(); DescribeBatchInferenceJobRequest describeBatchInferenceJobRequest = DescribeBatchInferenceJobRequest.builder() .batchInferenceJobArn(batchInferenceJobArn) .build(); long maxTime = Instant.now().getEpochSecond() + 3 * 60 * 60; // wait until the batch inference job is complete. while (Instant.now().getEpochSecond() < maxTime) { BatchInferenceJob batchInferenceJob = personalizeClient .describeBatchInferenceJob(describeBatchInferenceJobRequest) .batchInferenceJob(); status = batchInferenceJob.status(); System.out.println("Batch inference job status: " + status); if (status.equals("ACTIVE") || status.equals("CREATE FAILED")) { break; } try { Thread.sleep(waitInMilliseconds); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } return batchInferenceJobArn; } catch (PersonalizeException e) { System.out.println(e.awsErrorDetails().errorMessage()); } return ""; }

处理批处理作业可能需要一段时间才能完成。您可以通过调用 DescribeBatchInferenceJob 和传递 batchRecommendationsJobArn 作为输入参数来检查作业的状态。您还可 Amazon Personalize 在您的Amazon环境通过调用ListBatchInferenceJobs