組み込み NCF アルゴリズムのスタートガイド

このチュートリアルでは、MovieLens データセットを使用してニューラル コラボレーション フィルタリング(NCF)モデルをトレーニングする方法を詳しく説明します。 データの前処理、組み込み NCF アルゴリズムを使用したトレーニング、AI Platform へのモデルのデプロイ、デプロイ済みモデルからの予測のリクエストについて説明します。

データセット

このチュートリアルでは、モデルのトレーニングと評価に次の MovieLens データセットを使用します。

  • ml-1m(MovieLens 1 million の省略形)
  • ml-20m(MovieLens 20 million の省略形)

ml-1m

ml-1m データセットには、2000 年の MovieLens に参加した 6,040 人のユーザーが約 3,706 本の映画を匿名で評価した情報が 1,000,209 件含まれています。すべての評価は、ヘッダー行のない次の形式の ratings.dat ファイルに含まれています。

UserID::MovieID::Rating::Timestamp

  • UserID の範囲は 1~6040 です。
  • MovieID の範囲は 1~3952 です。
  • 評価は 5 段階の星評価です(整数の星評価のみ)。
  • タイムスタンプは、協定世界時(UTC)の 1970 年 1 月 1 日午前 0 時からの経過秒数で表されます。

ml-20m

ml-20m データセットには、138,493 人のユーザーが 26,744 本の映画を評価した情報が 20,000,263 件含まれています。すべての評価が ratings.csv ファイルに含まれています。このファイルでは、ヘッダー行に続く各行に、1 本の映画に対するユーザーの評価が次の形式で 1 件ずつ記録されています。

userId,movieId,rating,timestamp

このファイル内の行は、最初に userId 順に並べられます。同じ userId を持つ行は movieId の順で並べられます。評価は 5 段階の星評価で、0.5 星ずつ増分します(0.5~5.0 星)。タイムスタンプは、協定世界時(UTC)の 1970 年 1 月 1 日午前 0 時からの経過秒数で表されます。各ユーザーには 20 以上の評価があります。

目標

  • MovieLens データセットを準備する
  • トレーニングと評価を行う

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the AI Platform Training & Prediction API.

    Enable the API

  8. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

データを準備する

  1. Cloud Shell で Python 仮想環境を作成して有効にします。

    (vm)$  virtualenv ncf-env
    (vm)$  source ncf-env/bin/activate
  2. TensorFlow Model Garden コードをインストールします。

    (vm)$  pip install tf-models-official==2.3.0
  3. URI の環境変数を Google Cloud プロジェクトの Cloud Storage バケットと、このバケット内のデータを保存するディレクトリに追加します。BUCKET_NAME は、使用するバケット名に置き換えます。

    (vm)$ export STORAGE_BUCKET=gs://BUCKET_NAME
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
  4. DATA_DIR で ml-20m データセットのトレーニング データと評価データを生成します。

    (vm)$ python -m official.recommendation.create_ncf_data \
        --dataset ml-20m \
        --num_train_epochs 4 \
        --meta_data_file_path ${DATA_DIR}/metadata \
        --eval_prebatch_size 160000 \
        --data_dir ${DATA_DIR}

このスクリプトは、Cloud Shell でデータセットを生成して前処理します。前処理により、データがモデルに必要な TFRecord 形式に変換されます。ダウンロードと前処理には約 25 分かかり、次のような出力が生成されます。

I0804 23:03:02.370002 139664166737728 movielens.py:124] Successfully downloaded /tmp/tmpicajrlfc/ml-20m.zip 198702078 bytes
I0804 23:04:42.665195 139664166737728 data_preprocessing.py:223] Beginning data preprocessing.
I0804 23:04:59.084554 139664166737728 data_preprocessing.py:84] Generating user_map and item_map...
I0804 23:05:20.934210 139664166737728 data_preprocessing.py:103] Sorting by user, timestamp...
I0804 23:06:39.859857 139664166737728 data_preprocessing.py:194] Writing raw data cache.
I0804 23:06:42.375952 139664166737728 data_preprocessing.py:262] Data preprocessing complete. Time: 119.7 sec.
%lt;BisectionDataConstructor(Thread-1, initial daemon)>
General:
  Num users: 138493
  Num items: 26744

Training:
  Positive count:          19861770
  Batch size:              99000
  Batch count per epoch:   1004

Eval:
  Positive count:          138493
  Batch size:              160000
  Batch count per epoch:   866

I0804 23:07:14.137242 139664166737728 data_pipeline.py:887] Negative total vector built. Time: 31.8 seconds
I0804 23:11:25.013135 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 250.9 seconds
I0804 23:15:46.391308 139664166737728 data_pipeline.py:674] Eval construction complete. Time: 261.4 seconds
I0804 23:19:54.345858 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 248.0 seconds
I0804 23:24:09.182484 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 254.8 seconds
I0804 23:28:26.224653 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 257.0 seconds

トレーニング ジョブを送信する

ジョブを送信するには、基本的なトレーニング引数と、NCF アルゴリズムに関する基本的な引数を指定する必要があります。

トレーニング ジョブの一般的な引数:

トレーニング ジョブの引数
引数 説明
job-id トレーニング ジョブの一意の ID。トレーニング ジョブを送信した後、この ID を使用してログを検索しトレーニング ジョブのステータスを確認できます。
job-dir トレーニング ジョブが正常に完了した後に AI Platform Training がトレーニング ファイルを保存する Cloud Storage のパス。
scale-tier トレーニング用のマシンタイプを指定します。単一マシン構成を選択するには、BASIC を使用します。
master-image-uri トレーニング ジョブに使用する Docker コンテナを指定するための Container Registry URI。すでに IMAGE_URI として定義されている NCF 組み込みアルゴリズムのコンテナを使用します。
region トレーニング ジョブを実行するために利用可能なリージョンを指定します。このチュートリアルでは、us-central1 リージョンを使用できます。

MovieLens の組み込み NCF アルゴリズム トレーニングに固有の引数:

アルゴリズムの引数
引数 このチュートリアルに使用する値 説明
train_dataset_path ${DATA_DIR}/training_cycle_*/* トレーニング データが格納されている Cloud Storage パス。
eval_dataset_path ${DATA_DIR}/eval_data/* 評価データが格納されている Cloud Storage パス。
input_meta_data_path ${DATA_DIR}/metadata 入力スキーマが格納されている Cloud Storage パス。
train_epochs 3 実行するトレーニング エポックの数。
batch_size 99000 トレーニングのバッチサイズ。
eval_batch_size 160000 評価に使用するバッチサイズ。
learning_rate 0.00382059 Adam オプティマイザーが使用する学習率。
beta1 0.783529 Adam オプティマイザーの Beta 1 ハイパーパラメータ。
beta2 0.909003 Adam オプティマイザーの Beta 2 ハイパーパラメータ。
epsilon 1.45439e-07 Adam オプティマイザーの Epsilon ハイパーパラメータ。
num_factors 64 MF モデルの埋め込みサイズ。
hr_threshold 0.635 トレーニングを停止する HR 評価指標の値。
layers 256,256,128,64 MLP の隠れ層のサイズ。形式はカンマ区切りの整数です。
keras_use_ctl True モデル トレーニングでカスタム Keras トレーニング ループを使用します。

その他の NCF アルゴリズム フラグの詳細については、組み込み NCF リファレンスをご覧ください。

トレーニング ジョブを実行する

  1. Google Cloud コンソールで、[AI Platform] ページに移動します。

    [AI Platform] に移動

  2. [モデル トレーニング] セクションで、[組み込みのアルゴリズムでトレーニングする] を選択します。

  3. プルダウン リストで [NCF] を選択します。[次へ] をクリックします。

  4. [参照] ボタンを使用して、Cloud Storage バケットのトレーニング用データセットと評価用データセットを選択し、出力ディレクトリを選択します。[次へ] をクリックします。

  5. [アルゴリズムの引数] ページで、前のセクションの表の引数を使用してトレーニング ジョブを構成します。

  6. トレーニング ジョブに名前を付け、BASIC_TPU または BASIC_GPU マシンタイプを使用します。

  7. [送信] をクリックしてジョブを開始します。

ジョブ ディレクトリについて

トレーニング ジョブが正常に完了すると、AI Platform Training によってトレーニング済みモデルとその他のアーティファクトが Cloud Storage バケットに作成されます。JOB_DIR 内のディレクトリ構造は次のようになっています。

  • model/(TensorFlow SavedModel ディレクトリ
    • saved_model.pb
    • assets/
    • variables/
  • summaries/(トレーニングと評価からのロギング)
    • eval/
    • train/
  • さまざまなチェックポイント ファイル(トレーニング中に作成および使用)
    • チェックポイント
    • ctl_checkpoint-1.data-00000-of-00002
    • ctl_checkpoint-1.index

JOB_DIR のディレクトリ構造が前述のリスト構造と一致することを確認します。

gcloud storage ls -a $JOB_DIR/*

トレーニング済みモデルをデプロイする

AI Platform Prediction は、モデルリソースとバージョン リソースを使用してトレーニング済みモデルを整理します。AI Platform Prediction モデルは、機械学習モデルの複数のバージョンを格納するコンテナに相当します。

モデルをデプロイするには、AI Platform Prediction でモデルリソースを作成し、そのモデルのバージョンを作成してから、そのモデルとバージョンを使用してオンライン予測をリクエストします。

詳しくは、AI Platform Prediction にモデルをデプロイする方法をご覧ください。

Console

  1. [ジョブ] ページには、すべてのトレーニング ジョブが一覧表示されます。前の手順で送信したトレーニング ジョブの名前をクリックします。

  2. [ジョブの詳細] ページで、ジョブの全般的な進捗を確認できます。[ログを表示] をクリックすると、進捗の詳細が表示されます。

  3. ジョブが成功すると、[モデルをデプロイ] ボタンが上部に表示されます。[モデルをデプロイ] をクリックします。

  4. [新しいモデルとしてデプロイ] を選択して、モデル名を入力します。次に、[確認] をクリックします。

  5. [バージョンの作成] ページでバージョン名(v1 など)を入力します。他のフィールドはすべてデフォルト設定のままにします。[保存] をクリックします。

  6. [モデルの詳細] ページにバージョン名が表示されます。バージョンの作成には数分かかります。バージョンの準備ができると、バージョン名の横にチェックマークのアイコンが表示されます。

  7. バージョン名(v1)をクリックして、[バージョンの詳細] ページに移動します。このチュートリアルの次のステップでは、予測リクエストを送信します。

オンライン予測を取得する

予測をリクエストするときは、入力データを、モデルが想定する JSON 形式にする必要があります。現在の NCF モデルでは、入力を自動的に前処理しません。

Console

  1. 作成したバージョン(v1)の [バージョンの詳細] ページで、サンプル予測リクエストを送信できます。

    [テストと使用] タブを選択します。

  2. 次のサンプルを入力フィールドにコピーします。

     {
       "instances": [{
         "duplicate_mask": [0],
         "item_id": [1],
         "train_labels": [true],
         "user_id": [1],
         "valid_point_mask": [false]
       }]
      }
    
  3. [テスト] をクリックします。

    しばらく待つと、予測ベクトルが返されます。

次のステップ