ML Engine メモ

GCPのマネージドなサービスでレコメンドAPIを作る方法を探しており、

TensorFlow でのレコメンデーション システムの構築: がチュートリアル形式で公開されていたので試した。

ML Engineのチュートリアルは
・協調フィルタリングによるレコメンドロジックのローカル実行
・レコメンドロジックのML Engine上での実行
・Google Analytics形式のデータを使ったレコメンドロジックの実行
・Google App EngineでのAPIの提供
・Cloud ComposerでAirflowによるバッチ処理の実行
が一通りできる。

必要なリソースはここから持ってくる
https://github.com/GoogleCloudPlatform/tensorflow-recommendation-wals

・協調フィルタリングによるレコメンドロジックのローカル実行
このパートでチュートリアルで使われるレコメンドロジックは、強調フィルタリングのための行列分解をWALS(加重交互最小二乗)というアルゴリズムで計算するものである。

・レコメンドロジックのML Engine上での実行
チュートリアルでは一通りローカル実行を試したあとに、mltrain.shスクリプトを使って、ML Engineにジョブを投げることができる
中身を見ると
gcloud ml-engine jobs submit training ・・・
というコマンドでジョブが登録されている事がわかる。

ジョブが登録されると、コンソールでも確認が出来る。

なお、チュートリアルのコードではGPUインスタンスを使うため、リージョンはus-centralをつかう。

 参考:https://stackoverflow.com/questions/45776128/why-there-are-insufficient-accelerators-when-i-execute-gcloud-ml-engine-jobs

ML Engineではハイパーパラメータのチューニングのためのジョブも登録できる。
ジョブ定義にハイパーパラメータをどの範囲で調整したいかを書いておくと、その範囲内で〇〇アルゴリズムにてチューニングが実行される。
ただし、並列度1で実行した場合、一分に一回くらいしか実行されないため、すごく時間がかかる。チューニングジョブの定義は、以下のconfigに書かれているので、これを編集すれば並列度や最大試行回数が変更できるはず。

https://github.com/GoogleCloudPlatform/tensorflow-recommendation-wals/blob/master/wals_ml_engine/trainer/config/config_tune.json

・Google Analytics形式のデータを使ったレコメンドロジックの実行
最初のサンプルでは整形済みログを使った実行だったが、
途中のパートでGAのログをBigQueryに突っ込んで整形したデータをGCSに配置し、そのデータを使ってレコメンドデータを生成する方法も実施する。(ここで、datasetを作成する場合、後々Airflowを構築するlocationと揃えておく必要がある。)

GA形式のデータをBigQueryに取り込んで整形し、ML Engine でtrainジョブを投げる
GCS上に4つのファイルが生成される。


これが、レコメンドに利用するためのファイルとなる。ローカルの環境で以下のpythonコードを動かすと、レコメンドされる内容を確認することができる。
import numpy as np
from model import generate_recommendations

client_id = 1000163602560555666
already_rated = [295436355, 295044773, 295195092]
k = 5
user_map = np.load("../../tmp/user.npy")
item_map = np.load("../../tmp/item.npy")
row_factor = np.load("../../tmp/row.npy")
col_factor = np.load("../../tmp/col.npy")
user_idx = np.searchsorted(user_map, client_id)
user_rated = [np.searchsorted(item_map, i) for i in already_rated]

recommendations = generate_recommendations(user_idx, user_rated, row_factor, col_factor, k)
>>> print(recommendations)[5470, 5378, 5469, 5460, 5445]

app engineのデプロイ

レコメンドのAPIを提供するために、app engineをデプロイする。

https://github.com/GoogleCloudPlatform/tensorflow-recommendation-wals/blob/master/app/recommendations.py


Composer作成

Composerを作成し、Airflowを立ち上げることでWeb UI でtraingジョブやapp engineのデプロイジョブなどを定期実行がさせることができる。

Composerはフルマネージドなサービスなため、立ち上げておくだけで課金が発生してしまう。3日立ち上げておいただけで、"Cloud Composer Cloud Composer SQL vCPU time" 
が1000円くらいかかっていたので利用しないときには削除しておくとよいだろう。ただ、再作成には20分くらいかかる。

以上。