Amazon Personalizeはフルマネージド型の機械学習サービスで、用意したデータをもとにユーザーへのおすすめ商品・情報を生成します。
おすすめ情報が利用される状況は、Eコマース・コンテンツ配信・メディア・広告など、多岐にわたりますよね。
今回の記事ではAmazon Prsonalizeが生成する推薦情報をWebアプリケーションでユーザーごとに表示してみるハンズオンを紹介します。
Webアプリケーションに関しては、初心者の方でも扱いやすいFlaskを利用しますのでご安心ください。
↓ボリュームが多いため、Part1とPart2に分けてあります。
- Amazon EC2にFlaskアプリを構築し、Personalizeから推薦情報を受け取ってみるPart1
- Amazon EC2にFlaskアプリを構築し、Personalizeから推薦情報を受け取ってみるPart2 ←今回
FlaskアプリでPersonalizeのおすすめ情報を表示
「Amazon EC2にFlaskアプリを構築し、Personalizeから推薦情報を受け取ってみるPart2」は前回の続きからです。
前回はユーザーへのおすすめを生成するAmazo Personalizeソリューションやキャンペーンを作成しました。
今回のPart2では、Personalizeで生成された推薦情報をユーザーに表示するWebアプリケーションを作成します。WebアプリケーションはAWS クラウド環境にパブリックサブネットを作成し、EC2インスタンスを起動、Flaskアプリをデプロイし稼働させます。
■必要な前提知識と流れ
今回のハンズオンは以下の前提知識が必要です。できるだけ初心者の方でも迷わずにできるように書きましたが、エラーがおきたときの対処など含めて前提知識があったほうがスムーズにハンズオンができるかと思います。
【前提知識】
- AWSアカウントのセットアップ
- VPC,SecurityGroups,EC2の基本知識
- Amazon Personalizeについての基本知識
- 必要なツールとライブラリ(Flask, Boto3など)
【構築流れ】
構築図の中の左側を作成します。
-
IAMロール作成
↓ -
VPC作成
↓ -
セキュリティグループ作成
↓ -
EC2インスタンス作成
↓ -
Flaskアプリデプロイ
■IAMロール作成
まずはIAMロールを作成します。EC2インスタンスにセッションマネージャーで接続するためのポリシーと、Personalizeから推薦情報を取得するための権限を付与します。
↓サービス検索窓で[IAM]と検索し、[IAM]をクリックします。
↓左のナビゲーションペインから[ロール]をクリックし、[ロールを作成]を押します。
↓[信頼されたエンティティタイプ]は[AWS のサービス]を選択します。
↓[サービスまたはユースケース]は[EC2]を選択し、[ユースケース]は[EC2]を選択します。選択できたら、[次へ]をクリックします。
↓[許可ポリシー]は次の二つを検索し、チェックボックスにチェックをし、[次へ]をクリックします。
AmazonSSMManagedInstanceCore
AmazonPersonalizeFullAccess
↓
↓[ロール名]は任意の名前を入力します。
saitou-personalize-handson-iamrole
↓[許可ポリシー]で2つのポリシーがアタッチされていることを確認し、[ロールを作成]をクリックします。
IAMロールの作成は以上です。
■VPC作成
つぎにEC2インスタンスを起動するための場所であるVPCを作成します。ハンズオンなので、EC2インスタンスをプライベートサブネットにおき、パブリックサブネットにALBを~というアーキテクチャではなく、VPC内にはパブリックサブネット一つだけ作成します。
↓サービス検索窓で[VPC]と検索し、[VPC]をクリックします。
↓ダッシュボード画面で[VPCを作成]をクリックします。
↓[作成するリソース]は[VPCなど]を選択します。[名前タグの自動生成]は任意の名前を入力します。[IPv4 CIDR ブロック]は[10.0.0.0/16]にします。
saitou-personalize-handson
↓以下の設定値を選択・入力してください。以下にない項目はデフォルトのままで大丈夫です。
項目 | 設定値 |
---|---|
アベイラビリティゾーン (AZ) の数 | 1 |
パブリックサブネットの数 | 1 |
プライベートサブネットの数 | 0 |
ap-southeast-1a のパブリックサブネット CIDR ブロック | 10.0.1.0/24 |
↓入力が完了しましたら、[VPCを作成]をクリックします。
↓[成功]と表示が出ましたら、完了です。
VPCの作成は以上です。
■セキュリティグループ作成
つづいてセキュリティグループを作成します。構築が完了したら、Webブラウザでテストしますので、自身の環境のIPアドレスだけ許可するセキュリティグループを作成します。
↓[VPC]のダッシュボード画面で、左のナビゲーションペインから[セキュリティグループ]をクリックし、[セキュリティグループを作成]を押します。
↓[セキュリティグループ名]は任意の名前を入力し、[VPC]はさきほど作成したVPCを選択します・
saitou-personalize-handson-sg
↓[インバウンドルール]で[ルールを追加]をクリックします。[タイプ]は[すべてのトラフィック]を選択し、[ソース]は[MyIP]を選択します。[MyIP]を選択すると、自身の環境のIPアドレスが自動で入力されます。アウトバウンドルールはそのままで。
↓入力が完了しましたら、[セキュリティグループを作成]をクリックします。
セキュリティグループの作成は以上です。
■EC2インスタンスのセットアップ
FlaskアプリをデプロイするEC2インスタンスを作成します。起動完了後、いくつかコマンドをうち、Flaskアプリも動かします。このパートが一番つまづくかもしれません。できるだけ詳細に書きましたので、手順通り実施していただければ大丈夫かと思います。
↓サービス検索窓で[EC2]と検索し、[EC2]をクリックします。
↓EC2ダッシュボード画面から[インスタンスを起動]をクリックします。
↓[名前]は任意の名前を入力します。
saitou-personalize-handson-EC2
↓[Application and OS Images (Amazon Machine Image)]は以下の設定値で選択します。
項目 | 設定値 |
---|---|
Amazon マシンイメージ | Amazon Linux 2023 AMI 最新バージョン |
アーキテクチャ | 64ビット(x86) |
インスタンスタイプ | m5.large |
キーペア | 自身で用意したもの |
↓
↓[ネットワーク]設定では、次の設定値を選択してください。
項目 | 設定値 |
---|---|
VPC | 作成したもの |
サブネット | 作成したもの |
パブリック IP の自動割り当て | 有効化 |
ファイアウォール (セキュリティグループ) | 既存のセキュリティグループを選択する |
共通のセキュリティグループ | 作成したセキュリティグループ |
↓[高度な詳細]では[IAM インスタンスプロフィール]で作成したIAMロールを選択します。
saitou-personalize-handson-iamrole
↓上記で示した各設定値以外の項目はデフォルトで問題ありません。入力が完了しましたら、[インスタンスを起動]をクリックします。
↓[成功]と表示されましたら、[インスタンス]画面に移動します。
↓[ステータスチェック]が[初期化しています]から[2/2のチェックに合格しました]に変わるまで待ちましょう。
↓[ステータスチェック]が[2/2のチェックに合格しました]に変わりましたら、EC2インスタンスの作成は以上です。
■Flaskアプリケーションのデプロイ
さいごにFlaskアプリケーションをデプロイします。
Flaskアプリケーションの役割は、ユーザーが入力したユーザーIDに基づいて、Personalizeから推薦情報を取得し、ユーザーにおすすめのアイテムを提供することです。GitHubにコードを置きましたので、それを利用してください。
↓作成したEC2インスタンスにチェックを入れ、画面上部にある[接続]をクリックします。
↓[セッションマネージャー]タブをクリックし、[接続]を押します。もし、[セッションマネージャー]タブをクリックし、[接続]が表示されていない場合、IAMロールでポリシーがアタッチされているかや、EC2インスタンスがパブリックサブネットに配置されているか、AMIがAmazon Linux2023か確認してください。
↓コマンドラインが表示されましたら、次のコマンドを打ちます。
sudo su ec2-user
cd
↓
つづいて、必要なパッケージをインストールします。
sudo dnf install -y git
sudo dnf install -y sqlite
sudo dnf install -y python3-pip python3-devel
↓インストールが完了しましたら、GitHubにFlaskアプリのリポジトリをクローンします。
git clone https://github.com/saitou-cpi/flaskapp-personalize.git
[ec2-user@ip-10-0-1-146 ~]$ git clone https://github.com/saitou-cpi/flaskapp-personalize.git
Cloning into 'flaskapp-personalize'...
remote: Enumerating objects: 48, done.
remote: Counting objects: 100% (48/48), done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 48 (delta 15), reused 40 (delta 10), pack-reused 0
Receiving objects: 100% (48/48), 8.13 KiB | 8.13 MiB/s, done.
Resolving deltas: 100% (15/15), done.
↓クローンできたか確認します。
ll
[ec2-user@ip-10-0-1-146 ~]$ ll
total 0
drwxrwxr-x. 5 ec2-user ec2-user 121 Nov 25 06:07 flaskapp-personalize
↓つぎに仮想環境を作成します。※env名を長くしすぎました、、、すいません
python3 -m venv flaskapp-personalize/env/flaskapp-personalize-env
source flaskapp-personalize/env/flaskapp-personalize-env/bin/activate
仮想環境が有効化されたら、ユーザー名の左側にenv名が表示されます。
(flaskapp-personalize-env) [ec2-user@ip-10-0-1-146 ~]$
↓ディレクトリを移動します。
cd flaskapp-personalize/
↓つづいてFlaskやその他必要なパッケージをインストールします。
pip install -r flaskapp-personalize/requirements.txt
Flaskアプリを動かすためのパッケージはすべてインストールできました。さいごにFlaskアプリのコードを一部修正します。
つぎのコマンドの[YOUR-REGION][YOUR-ACCOUNT-ID][YOUR-CAMPAIGN-NAME]部分を自身の環境に合わせて修正してください。
sed -i 's/YOUR_PERSONALIZE_CAMPAIGN_ARN/arn:aws:personalize:YOUR-REGION:YOUR-ACCOUNT-ID:campaign\/YOUR-CAMPAIGN-NAME/' app.py
わたしの場合は、こんな感じです。アカウントIDはマスク目的で適当な数字です。
sed -i 's/YOUR_PERSONALIZE_CAMPAIGN_ARN/arn:aws:personalize:ap-southeast-1:123456789012:campaign\/saitou-personalize-handson-campaign/' app.py
↓キャンペーンARNはPesonalzeの画面から確認できます。
↓修正できましたら、コマンドを実行しましょう。
(flaskapp-personalize-env) [ec2-user@ip-10-0-1-146 flaskapp-personalize]$ sed -i 's/YOUR_PERSONALIZE_CAMPAIGN_ARN/arn:aws:personalize:ap-southheast-1:123456789012:campaign\/saitou-personalize-handson-campaign/' flaskapp-personalize/app.py
↓修正できたか確認してみましょう。つぎのコマンドを実行します。
cat app.py
11行目の"CAMPAIGN_ARN"部分が自身のキャンペーンARNに修正されていましたでしょうか。
↓それでは、Flaskを実行します。つぎのコマンドを実行します。
python app.py
↓コマンドラインはそのままで、WebブラウザからつぎのURLにアクセスしてみましょう。IPアドレスは作成したEC2インスタンスのパブリックIPアドレスを入れてください。
http://EC2インスタンスパブリックIPアドレス:5000
「ようこそ」と表示されたら、構築完了です。
Flaskアプリケーションのデプロイは以上です。
■動作確認
さいごに動作確認してみましょう。
↓入力フォームに適当な数字を入力し、[送信]をクリックしてみてください。
↓おすすめのフルーツが二つ表示されたかと思います。
↓Amazon Personalizeのキャンペーン画面で、同じユーザーIDを入力してみましょう。
生成された推薦情報の上位2つのアイテムIDは[ 27 ]と[ 1 ]です。Flaskアプリで利用しているフルーツのデータベースをみると、
1|Apple
2|Banana
3|Orange
4|Strawberry
5|Blueberry
6|Mango
7|Pineapple
8|Watermelon
9|Grapefruit
10|Lemon
11|Lime
12|Cherry
13|Grape
14|Melon
15|Kiwi
16|Peach
17|Nectarine
18|Papaya
19|Guava
20|Lingonberry
21|Raspberry
22|Blackberry
23|Apricot
24|Plum
25|Passion Fruit
26|Avocado
27|Persimmon
28|Pomegranate
29|Dragon Fruit
30|Fig
[27: Persimmon],[1: Apple]ですね。
もういちどブラウザ画面に戻ってみると、
同じ結果が表示されていることがわかりますね。
ユーザーが入力したIDをもとに、Pesonalizeに対し推薦情報を生成するAPIを実行し、返ってきたアイテムIDをデータベースと照合し、該当のフルーツを表示しています。
今回のハンズオンは以上です。
まとめ:
Amazon Personalizeはインポートしたデータセットからレシピに基づき学習し、パーソナライズされたアイテムIDやアクションIDを生成します。
Amazon Personalizeはサービス単体では力を発揮しないため、ハンズオンや学習においても"Amazon Personalize×何か"を意識する必要があります。Personalizeの代表的なユースケースはEコマースですので、"Amazon Personalize×Flask"でハンズオンを実施してみました。
また、Amazon Personalizeがどうユーザーに届くのかも重要な気がします。
今回Webアプリで推薦情報を提供してみて、強く感じました。つぎはAPI GatewayとLamdbaを利用して、サーバレスアーキテクチャで推薦情報を提供する仕組みを作ってみます。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
AIや機械学習のレコメンデーションサービスについて知りたい方は、ぜひ協栄情報にお問い合わせください。
https://www.cp-info.co.jp/contact/
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
参考リンク:AWS公式ドキュメント
↓ほかの協栄情報メンバーも機械学習・AIに関する記事を公開しています。ぜひ参考にしてみてください。
■Amazon CodeWhispererを試してみた(dapeng)
https://cloud5.jp/amazon-codewhisperer/
■Amazon Personalizeの使い方や事例を紹介【ハンズオンあり】(齊藤弘樹)
https://cloud5.jp/saitou-amazonpersonalize-entry/
■Amazon Personalizeの使い方や事例を紹介【ハンズオンあり】 part2(齊藤弘樹)
https://cloud5.jp/saitou-amazonpersonalize-handson/
■Amazon Personalize学習用ダミーデータをPythonで作ってみた(齊藤弘樹)
https://cloud5.jp/saitou-personalize-create-dammydata/
■Amazon Personalizeのエラーを解決!各カラムのデータ型を調べる方法(齊藤弘樹)
https://cloud5.jp/saitou-check-data-type/
■AWS Lambdaを使ってAmazon Personalizeの推薦情報をCSVでS3にエクスポートする方法(齊藤弘樹)
https://cloud5.jp/saitou-personalize-attribute-recommendation/