Amazon Personalizeを試してみた時のメモ

これは[Wano Group Advent Calendar 2023](https://qiita.com/advent-calendar/2023/wano-group)、12/7(木)の記事です。

1つ前の記事は[Kentaro Sataさんで「TuneCore Japanのプロダクトマネージャーとして携わった3年間のサービスを振り返る」](https://note.com/kentarosata/n/nd2f5694dfc50)でした。
また、私の所属するグループ会社の[EDOCODEのAdvent Calendar](https://adventar.org/calendars/8641)もありますので、よろしければそちらもどうぞ。

EDOCODEサーバーサイドエンジニアの井内です。

最近、機械学習のレコメンドエンジンについて調査する機会がありまして、Amazon Personalizeを試してみました。本記事はその際のメモ書きになります。

# Amazon Personalizeとは

> Amazon Personalize はフルマネージド型の機械学習サービスで、お客様のデータを使用してユーザーへのおすすめ商品を生成します。また、特定のアイテムやアイテムメタデータに対するユーザーの親近感に基づいてユーザーセグメントを生成することもできます。

https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/what-is-personalize.html

ドキュメントからのそのままの引用です。

# Amazon Personalizeを選択した理由

GCPやAzureの同等サービスとしては、[Recommendations AI](https://cloud.google.com/recommendations?hl=ja)や[Azure AI Personalizer](https://azure.microsoft.com/ja-jp/products/ai-services/ai-personalizer)があるようです。
Azure AI Personalizerは2026/10/01に廃止されるそうなのと（後継サービスについては未調査）、ぱっと見でRecommendations AIよりも簡単に使えそうに見えたので、今回はAmazon Personalizeを選択しました。

# レコメンドエンジンを作るまでの手順

マネジメントコンソールから作業しました。調査にあまり時間を使えず最速で試すために、optionalなものはできるだけ使わない方針で進めました。

## Create dataset group

まず最初にdataset groupというものを作る必要があります。多分プロジェクトのようなものです。

その中で更にDomainというものを選択する必要があり、今回は調査対象の内容を考慮してE-commerseを選択しました。Domainはこの他にVideo on demandとCustomというものが選択できます。

## Create datasets and import data

主にデータのインポートを行う部分です。

datasetは下記３種類があります。DomainがE-commerceの場合しか確認していませんが、Item interactions datasetのみが必須のようでして、今回はこれだけを作成することにしました。

- Item interactions dataset
- Users dataset
- Items dataset

datasetでは更にImport methodを選択します。下記2つから選択できまして、今回はS3からインポートすることにしました。

- Import data directly into Amazon Personalize datasets
  - S3 or API
- Import data using Data Wrangler

その後、インポートするデータのSchema Definitionを決めることができます。デフォルトの項目は下記になっており、そのまま使うことにしました。

- USER_ID
- ITEM_ID
- TIMESTAMP
- EVENT_TYPE

下記のドキュメントによると、このうち必須なのはUSER_ID, ITEM_ID, TIMESTAMPのみのようです。

https://docs.aws.amazon.com/personalize/latest/dg/interactions-dataset-requirements.html

インポートするデータとしては、プログラムでランダムな値を10万件出力して使いました。最初は[KaggleのDataset](https://www.kaggle.com/datasets/mkechinov/ecommerce-behavior-data-from-multi-category-store)を使おうと思ったのですが、5GBあって更に加工する必要がありそうなのでやめました。

インポートには結構時間がかかりました。理由は久々にAWSを触ったので、S3からのアップロードではバケットポリシーの設定に手間取ってしまったせいです。

また、インポートの設定をした後にPCを閉じてしまったので、どれくらい処理時間がかかったのか記録できませんでした。ぱっと見ですが、Amazon Personalizeの画面からは確認する方法がなさそうでした。多分、請求情報には出るだろうと思ってます。

## Set up training and recommendation resources

投入したデータを元に、レコメンドエンジンを使えるようにします。Set up trainingともあるので、トレーニングもここで行うらしいです。確かに初回設定時は時間がかかっていたような気がします。

自分の場合、ここでは下記2つが選択できて、Use e-commerce recommendersの方を選択しました。
- Use e-commerce recommenders
- Use custom resources (advanced)

e-commerce recommendersの方を選択すると、更に下記のrecommenderを複数選択できます。
- Customers who viewed X also viewed
- Frequently bought together
- Best sellers
- Most viewed
- Recommended for you

ここではRecommended for youを選択しました。これだけ他のものと違い、次の画面で設定できるパラメータがありましたが、今回は調査しませんでした。

Recommenderの作成には、1時間弱かかりました。

# レコメンドエンジンの試し方

Recommenderの画面にTestというボタンがあり、そこから試すことができました。

USER_IDを入力すると、候補となるITEM_IDが25件表示されました。インポートしたデータに含まれないUSER_IDでも結果が返ってきましたしたが、その場合は全て同じ結果になっていました。

# 料金について

下記に記載があります。

https://aws.amazon.com/jp/personalize/pricing/

- データ取り込みコスト: 1 GB あたり 0.05 USD
- トレーニングコスト: トレーニング 1 時間あたり 0.24 USD
- リアルタイムレコメンデーション: 対象リージョンごとに最初の 20,000 TPS-時間/月	0.20 USD/TPS-時間

使っていないバッチレコメンデーションと、リアルタイムレコメンデーションの利用量が多い場合の減額は省略しています。

リアルタイムレコメンデーションは、設定しただけで最低で1時間0.20USDかかってしまうようです。利用回数によって料金が増えていくようで、結果をキャッシュできる使い方がもしあれば、そこまで高くはならなそうだなと思いました。

TPSはTransaction Per Secondなので、アクセス数が分かれば計算できそうです。

Recommenderは停止することもできて、その場合は料金が発生しなさそうでした。

# 使ってみた感想

AWSが久しぶりすぎてかなり手間取りましたが、データ投入して設定を選ぶくらいの作業でレコメンドエンジンが使えるようになり、かなり簡単でした。
ちょっと使ってみるだけならお金も全然かからず、調査の最初の選択肢としては良かったと思います。

今後はもう少し料金面の調査を進めていき、現実的な数字が出れば詳細な性能評価を進めていきたいなと思ってます。

# 最後に
明日12/8(金)の担当は@NaotoFushimiさんで「[セッションリプレイツールのススメと選定](https://qiita.com/NaotoFushimi/items/5e1207ab9216a388c0a8)」です。

現在、Wanoグループでは人材募集をしています。興味のある方は下記を参照してください。
[JOBS | Wano Group](https://group.wano.co.jp/jobs/)