Amazon Personalizeでバッチレコメンドがサポートされました!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも、DA 事業本部の大澤です。

Amazon Personalize にバッチレコメンドジョブ機能が追加されました! 複数のユーザもしくはアイテムに対してレコメンドを作成することが可能になる機能です。

バッチレコメンド機能を試してみたので、その様子とバッチレコメンドの料金についてご紹介します。

料金

バッチレコメンドの場合は次のようにレコメンド 1000 件毎の料金となります。

1ヶ月で100万ユーザ分のレコメンドを作成する場合...

1,000,000 / 1,000 * $0.067 = $67

1ヶ月で8000万ユーザ分のレコメンドを作成する場合...

20,000,000 / 1,000 * $0.067 + 60,000,000 / 1,000 * $0.058 = $4,820

やってみる

ソリューションは作成済みという前提のもとで、マネジメントコンソールからバッチレコメンド機能を試してみたいと思います。今回はUSER_PERSONALIZATIONタイプのレシピの1つのHRNNを用いたソリューションを利用します。

ソリューション作成までの流れについては以下のエントリが参考になるかと思います。

Amazon Personalizeを使ってみた

入力ファイル

まずはバッチジョブでレコメンドを行う対象となるID一覧データをS3に配置する必要があります。 入力ファイルの形式は1行毎に1データ分のJSONを表すJSON Lines形式となります。 レシピタイプがUSER_PERSONALIZATIONでuserIdのみを入力とする場合の入力データは次のようになります。

input.jsonl

{"userId":1}
{"userId":2}
{"userId":3}
{"userId":4}
{"userId":5}
{"userId":6}
{"userId":7}
{"userId":8}
{"userId":9}
{"userId":10}

各レシピタイプに応じた入力データと出力データの形式についてはドキュメントをご覧ください。

入力ファイルをS3にアップロードします。

aws s3 cp ./inputs.jsonl s3://bucket/path/to/input.jsonl

バッチレコメンドジョブの作成

マネジメントコンソールから Amazon Personalize のデータセットグループ一覧を開き、使用するデータセットを選択します。 右下にCreate batch inference jobsという欄があるので、そこからCreate new jobをクリックしジョブを作成します。

ジョブ作成画面を開いたらまずはジョブ名、ジョブで使用するIAMロール、ソリューション(レコメンドモデル)、レコメンド数を設定します。

ジョブで使用するIAMロールがない場合はその場で作成することも可能です。

次に入力ファイルのS3パスと出力ファイルのS3パスを設定し、Create batch inference jobからジョブを作成&実行します。 入力ファイルと出力ファイルはAdditional configurationからAWS KMSのキーIDもしくはキーARNを指定することで暗号化することも可能です。

入力ファイルや出力ファイルの置き場所として使用するS3バケットのバケットポリシーは、Amazon Personalizeからアクセスが可能なように次のような権限が必要となります。必要に応じてS3バケットに対して設定してください。

  • s3:GetObject
  • s3:ListBucket
  • s3:PutObject

バッチジョブが作成されると次のようなジョブ詳細画面が開きます。

しばらくするとジョブが完了し、ジョブステータスがActiveに変わります。今回試した時は30分弱ほどでジョブが完了しました。

出力ファイル

バッチレコメンドジョブの実行が完了すると、出力先として指定したS3パスにレコメンド結果が出力されます。

s3://{バケット}/{出力ファイルパス}/personalize/{ジョブ名}/{入力ファイル名}.output

出力ファイルの形式は入力ファイルと同様に1行毎に1データ分のJSONを表すJSON Lines形式となります。 レシピタイプがUSER_PERSONALIZATIONでuserIdのみを入力とした場合の出力(レコメンド結果)は次のようになります。 recommendedItemsにはジョブ作成時に指定したレコメンド数と同じ数だけ要素が含まれることとなります。

{"input": {"userId":1}, "output": {"recommendedItems": ["582", "739", ..., "401", "1114"]}, "error": null}

さいごに

Amazon Personalize の新機能、バッチレコメンドについて紹介しました。日次や週次、月次などでレコメンドモデルを更新し、まとめてレコメンドを作成するようなユースケースにおいて便利な機能です。 また、レコメンドモデル(ソリューション)を頻繁に更新する訳ではなく、同じレコメンド結果を再利用する場合においては、事前にバッチレコメンドした結果を利用することで運用費用が安くなる場合があります。今回のアップデートによって Amazon Personalize の活用の幅がより広がりそうです。

参考