Vertex AI: 予測用の BigQuery ML モデルのエクスポートとデプロイ

1. 概要

このラボでは、BigQuery ML でモデルをトレーニングし、そのモデルを Vertex AI にエクスポートしてデプロイします。これは、Google Cloud の最新の AI プロダクトです。

学習内容

次の方法を学習します。

  • BigQuery ML(BQML)を使用してモデルをトレーニングする
  • BQML モデルを Cloud Storage にエクスポートする
  • トレーニング済みの BQML を Vertex AI にデプロイする
  • デプロイしたモデルの予測を取得する

このラボを Google Cloud で実行するための総費用は約 $2 です。

2. Vertex AI の概要

このラボでは、Google Cloud で利用できる最新の AI プロダクトを使用します。Vertex AI は Google Cloud 全体の ML サービスを統合してシームレスな開発エクスペリエンスを提供します。以前は、AutoML でトレーニングしたモデルやカスタムモデルには、個別のサービスを介してアクセスする必要がありました。Vertex AI は、これらの個別のサービスを他の新しいプロダクトとともに 1 つの API へと結合します。既存のプロジェクトを Vertex AI に移行することもできます。ご意見やご質問がありましたら、サポートページからお寄せください。

Vertex AI には、エンドツーエンドの ML ワークフローをサポートするさまざまなプロダクトが含まれています。このラボでは、以下でハイライト表示されているプロダクト(Prediction、Notebooks)を取り上げます。

Vertex プロダクトの概要

3. 環境を設定する

この Codelab を実行するには、課金が有効になっている Google Cloud Platform プロジェクトが必要です。プロジェクトを作成するには、こちらの手順を行ってください。

ステップ 1: Compute Engine API を有効にする

まだ有効になっていない場合は、[Compute Engine] に移動して [有効にする] を選択します。これはノートブック インスタンスを作成するために必要です。

ステップ 2: Vertex AI API を有効にする

Cloud コンソールの [Vertex AI] セクションに移動し、[Vertex AI API を有効にする] をクリックします。

Vertex AI ダッシュボード

ステップ 3: Notebooks インスタンスを作成する

モデルをデプロイした後、Notebooks を使用して予測を取得します。Cloud コンソールの [Vertex AI] セクションで、[Notebooks] をクリックします。

Vertex AI メニュー

そこから、[新しいインスタンス] を選択します。次に、[TensorFlow Enterprise 2.3] インスタンス タイプに [GPU なし] を選択します。

TFE インスタンス

デフォルトのオプションを使用して、[作成] をクリックします。インスタンスが作成されたら、[JupyterLab を開く] を選択します。

CAIP ノートブックを開く

4. BigQuery ML モデルをトレーニングする

BigQuery ML では、BigQuery に保存されたデータを使用してカスタム ML モデルをトレーニングできます。すべての SQL でモデルをトレーニングし、モデルから予測を取得できます。このラボでは、BigQuery の一般公開されているデータセットを使用して、クレジット カードによる支払いで債務不履行が発生する可能性を予測します。

ステップ 1: プロジェクトに BigQuery データセットを作成する

BigQuery ML でモデルをトレーニングするには、プロジェクト内にこのモデルを格納するデータセットを作成する必要があります。左側のメニューバーでプロジェクトをクリックし、[データセットを作成] を選択します。

BQ データセットを作成する

[データセット ID] フィールドに「cc_default」と入力します。残りのフィールドはそのままにして、[データセットを作成] をクリックします。

ステップ 2: CREATE MODEL クエリを実行する

BigQuery のクエリエディタで次の CREATE MODEL クエリを実行し、使用する一般公開データセットで BigQuery ML モデルを作成してトレーニングします。your-project は、Cloud プロジェクトの名前に置き換えてください。

CREATE OR REPLACE MODEL
  `your-project.cc_default.logistic_model` OPTIONS(model_type='LOGISTIC_REG',
    input_label_cols=['default_payment_next_month']) AS
SELECT
  limit_balance,
  sex,
  education_level,
  marital_status,
  age,
  pay_0,
  pay_2,
  pay_3,
  pay_4,
  pay_5,
  pay_6,
  bill_amt_1,
  bill_amt_2,
  bill_amt_3,
  bill_amt_4,
  bill_amt_5,
  bill_amt_6,
  pay_amt_1,
  pay_amt_2,
  pay_amt_3,
  pay_amt_4,
  pay_amt_5,
  pay_amt_6,
  default_payment_next_month
FROM
  `bigquery-public-data.ml_datasets.credit_card_default`

これにより、0 ~ 1 の範囲の数値を出力するロジスティック回帰モデルが作成されます。これは、実行に約 1 分かかることを示します。完了すると、データセットの下にモデルが表示されます。

BQML モデルの詳細

モデルをクリックすると、トレーニング指標と評価指標を確認できます。

5. BigQuery ML モデルをエクスポートする

トレーニング済みの BQML モデルでは、BQML SQL 構文を使用して予測を取得することも、モデルをエクスポートして別の場所にデプロイすることもできます。ここでは、モデルをエクスポートして Vertex AI にデプロイし、モデルをスケーラブルにサービングして予測を取得できるようにします。

ステップ 1: モデルの Cloud Storage バケットを作成する

モデルの詳細で、[モデルをエクスポート] をクリックします。

BQML モデルをエクスポートする

モデルのアセットをエクスポートする Google Cloud Storage(GCS)のロケーションの入力を求められます。GCS バケットがまだない場合は、作成しようとしています。まず、[参照] をクリックします。

GCS バケットを参照する

次に、+ アイコンをクリックして新しいバケットを作成します。

新しい GCS バケット

一意の名前を付けます(ストレージ バケット名はグローバルに一意である必要があります)。[続行] をクリックします。次のステップでは、[ロケーション タイプ] で [リージョン] を選択し、プルダウンからいずれかのリージョンを選択します。

バケットのロケーション

デフォルトのストレージ クラスを使用し、アクセス制御の下で [均一] が選択されていることを確認します。

均一なアクセス制御

[続行] をクリックし、残りの項目はデフォルトのままにします。次に [作成] をクリックします。

ステップ 2: BQML モデルをエクスポートする

新しいバケットを作成したら、[名前] フィールドに「model-assets」など任意の名前を入力し、[選択] をクリックします。

モデルのエクスポート パス

[エクスポート] をクリックします。これにより、指定した新しく作成された GCS バケットに TensorFlow の SavedModel 形式でモデルをエクスポートするジョブが BigQuery に作成されます。エクスポートには 1 分ほどかかります。

モデルのエクスポート中に、Cloud コンソールの [ストレージ] セクションに移動します。ジョブが完了すると、モデルアセットが、model-assets サブディレクトリに作成したバケットにエクスポートされます。

エクスポートされたモデルアセット

6. モデルを Vertex AI にインポートする

このステップでは、モデルアセットをエクスポートしたばかりの GCS ストレージ ロケーションを参照して、モデルを作成して Vertex AI にインポートします。

ステップ 1: モデルをインポートする

Cloud コンソールで、Vertex AI の [モデル] セクションに移動します。そこから、[インポート] を選択します。

モデルをインポートする

最初のステップでは、モデルに predict_default という名前を付けます。バケットを作成したリージョン(us-central1europe-west4、または asia-east1)を選択します。[続行] をクリックします。[モデル設定] で、[新しいビルド済みコンテナにモデル アーティファクトをインポートする] を選択したままにします。選択済みです。

[モデル フレームワーク] プルダウンで、[TensorFlow] を選択します。フレームワーク バージョンとして [2.3] を選択します。

[モデル アーティファクトの場所] フィールドで [参照] をクリックし、作成した GCS バケットをクリックして、model-assets ディレクトリをクリックします。

モデルアセットのパス

[インポート] をクリックします。モデルのインポートには数分かかります。作成されたモデルは、Cloud コンソールの [モデル] セクションに表示されます。

モデル セクション

7. モデルをエンドポイントにデプロイする

モデルのアップロードが完了したので、次に Vertex でエンドポイントを作成します。Vertex の Model リソースには複数のエンドポイントを関連付けることができ、エンドポイント間でトラフィックを分割できます。

ステップ 1: エンドポイントを作成する

モデルページで [デプロイとテスト] タブに移動し、[エンドポイントにデプロイ] をクリックします。

デプロイとテスト

エンドポイントに default_pred_v1 などの名前を付けます。トラフィック分割の設定はそのままにして、モデルのデプロイに使用するマシンタイプを選択します。ここでは n1-highcpu-2 を使用しましたが、どちらのマシンタイプも選択できます。

[完了] を選択し、[続行] をクリックします。選択したロケーションの設定はそのままにして、[デプロイ] をクリックします。エンドポイントのデプロイには数分かかります。完了すると、その横に緑色のチェックマークが表示されます。

デプロイされたエンドポイント

もう少しで完了です。これで、デプロイしたモデルの予測を取得する準備が整いました。

8. デプロイしたモデルで予測を取得する

モデルの予測を取得するにあたっては、いくつかの選択肢があります。

  • Vertex AI UI
  • Vertex AI API

ここでは、API を使用して予測を取得する方法を示します。

ステップ 1: Vertex AI API を使用してモデル予測を取得する

ここでモデルの予測を取得する方法を説明するために、このラボの最初に作成した Vertex ノートブック インスタンスを使用します。

次に、作成したノートブック インスタンスを開き、Launcher から Python 3 ノートブックを開きます。

ノートブックを開く

ノートブックのセル内で次のように実行し、default-pred.json という名前の JSON ファイルにテスト例を書き込みます。この例をモデルに送信して予測を行います。

%%writefile default-pred.json
{
  "instances": [
    {"age": 39,
    "bill_amt_1": 47174,
    "bill_amt_2": 47974,
    "bill_amt_3": 48630,
    "bill_amt_4": 50803,
    "bill_amt_5": 30789,
    "bill_amt_6": 15874,
    "education_level": "1",
    "limit_balance": 50000,
    "marital_status": "2",
    "pay_0": 0,
    "pay_2":0,
    "pay_3": 0,
    "pay_4": 0,
    "pay_5": "0",
    "pay_6": "0",
    "pay_amt_1": 1800,
    "pay_amt_2": 2000,
    "pay_amt_3": 3000,
    "pay_amt_4": 2000,
    "pay_amt_5": 2000,
    "pay_amt_6": 2000,
    "sex": "1"}
  ]
}

次に、Vertex UI で、デプロイしたエンドポイントの [Sample Request] をクリックします。

リクエストの例

[REST] タブの ステップ 4 のコードをノートブックにコピーし、セルを実行します。

リクエスト変数

次に、バケットとモデルを作成したリージョンの変数を追加します。以下の文字列の your-region を置き換えます。

REGION="your-region" # either us-central1, europe-west4, or asia-east1

最後に、次のコードをノートブックにコピーして、curl を使用してエンドポイントに予測リクエストを行います。

!curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-prediction-aiplatform.googleapis.com/v1alpha1/projects/$PROJECT_ID/locations/$REGION/endpoints/$ENDPOINT_ID:predict \
-d "@default-pred.json"

次のように表示されます(正確な予測値は若干異なります)。

{
  "predictions": [
    {
      "default_payment_next_month_values": [
        "1",
        "0"
      ],
      "default_payment_next_month_probs": [
        0.180815295299778,
        0.819184704700222
      ],
      "predicted_default_payment_next_month": [
        "0"
      ]
    }
  ],
  "deployedModelId": "your-model-id"
}

default_payment_next_month_probs の値は各クラスの確率を示します。この例では、この人が次回の支払いで債務不履行をしない確率は 81% であると予測しています。.819 値は 0 クラスに対応します(デフォルトではありません)。

お疲れさまでした

ここでは、以下の方法を学びました。

  • BQML でモデルをトレーニングする
  • BQML モデルを Cloud Storage にエクスポートする
  • 予測のために BQML モデルを Vertex AI にインポートする
  • Vertex AI モデルを作成してエンドポイントにデプロイする
  • Vertex Notebooks と curl を使用して、デプロイしたエンドポイントで予測を取得する

Vertex AI のさまざまな部分について詳しくは、ドキュメントをご覧ください。

9. クリーンアップ

このラボで作成したノートブックを引き続き使用する場合は、未使用時にオフにすることをおすすめします。Cloud コンソールの Notebooks UI で、ノートブックを選択して [停止] を選択します。

インスタンスの停止

ノートブックを完全に削除する場合は、右上にある [削除] ボタンをクリックします。

デプロイしたエンドポイントを削除するには、Vertex AI コンソールの [エンドポイント] セクションに移動し、削除アイコンをクリックします。

エンドポイントの削除

ストレージ バケットを削除するには、Cloud コンソールのナビゲーション メニューで [ストレージ] に移動してバケットを選択し、[削除] をクリックします。

ストレージを削除