プロトタイプから本番環境へ: カスタム トレーニング済みモデルからの予測の取得

1. 概要

このラボでは、Vertex AI を使用して、カスタム トレーニング済みモデルからオンライン予測とバッチ予測を実行します。

このラボは、動画シリーズ「プロトタイプから本番環境へ」の一部です。このラボに進む前に、前のラボを完了してください。詳細については、関連する動画でご確認ください。

学習内容

次の方法を学習します。

  • Vertex AI Model Registry にモデルをアップロードする
  • エンドポイントにモデルをデプロイする
  • UI と SDK を使用してオンライン予測とバッチ予測を実行する

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

2. Vertex AI の概要

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

Vertex AI には、エンドツーエンドの ML ワークフローをサポートするさまざまなプロダクトが含まれています。このラボでは、以下でハイライト表示されているプロダクト(PredictionsWorkbench)を中心に学習します。

Vertex プロダクトの概要

3. 環境を設定する

Vertex AI を使用したカスタムモデルのトレーニング ラボのステップを完了して、環境を設定します。

4. モデルをレジストリにアップロードする

モデルから予測を取得する前に、モデルを Vertex AI Model Registry にアップロードする必要があります。ここは、ML モデルのライフサイクルを管理できるリポジトリです。

次に示すように、カスタム トレーニング ジョブを構成するときに、モデルをアップロードできます。

training_prediction

また、保存済みのモデル アーティファクトが Cloud Storage バケットにある場合は、トレーニング ジョブの完了後にモデルをインポートすることもできます。このラボでは、こちらのオプションを使用します。

コンソールで [モデル] セクションに移動します。

モデルメニュー

[インポート] を選択します。

import_model

[新しいモデルとしてインポート] を選択して、モデルの名前を入力します。

new_model

[モデル設定] で、ビルド済みコンテナにモデルをインポートして、TensorFlow 2.8 を使用するように設定します。ビルド済み予測コンテナの一覧をご覧ください。

カスタム トレーニング ジョブのモデル アーティファクトが保存されている Cloud Storage バケットのパスを指定します。gs://{PROJECT_ID}-bucket/model_output のようになります。

[説明可能性] セクションはスキップします。Vertex Explainable AI の詳細を確認したい場合は、ドキュメントをご覧ください。

インポートされたモデルがレジストリに表示されます。

flower_model

この操作を UI ではなく SDK で実行する場合は、Workbench ワークベンチから次を実行して、モデルをアップロードします。

from google.cloud import aiplatform

my_model = aiplatform.Model.upload(display_name='flower-model',
                                  artifact_uri='gs://{PROJECT_ID}-bucket/model_output',
                                  serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')

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

Vertex AI では、バッチとオンラインの 2 種類の予測ジョブを実行できます。

バッチ予測は非同期リクエストです。これは、即時のレスポンスが必要なく、累積されたデータを 1 回のリクエストで処理する場合に適しています。

反対に、モデルに渡されたデータから低レイテンシですぐに予測を取得したい場合は、オンライン予測を使用します。

モデルがレジストリに登録されたので、モデルを使ってバッチ予測を実行してみましょう。

オンライン予測を取得する場合は、モデルをエンドポイントにデプロイする必要があります。これにより、保存済みのモデル アーティファクトと物理リソースが関連付けられ、低レイテンシで予測が実行されます。ns.

エンドポイントにデプロイするには、モデル行の右端にある「さらに表示」アイコンを選択して、[エンドポイントにデプロイ] を選択します。

deploy_model

エンドポイントに名前を付けます。残りの設定はそのままにして [続行] をクリックします。

endpoint_name

エンドポイントは自動スケーリングをサポートしているため、最小値と最大値を設定できます。コンピューティング ノードは、これらの境界内でトラフィックの需要に合わせてスケーリングされます。

このラボはデモを目的としたもので、このエンドポイントで大量のトラフィックを処理することはないため、[コンピューティング ノードの最大数] を 1 に設定し、[マシンタイプ] に n1-standard-4 を選択できます。

endpoint_compute

[モデルのモニタリング] はスキップしますが、この機能について詳しく知りたい場合は、ドキュメントをご覧ください。

次に [デプロイ] をクリックします。

デプロイには数分かかります。完了すると、モデルのデプロイ ステータスが「Vertex AI にデプロイ」に変わります。

SDK でモデルをデプロイする場合は、次のコマンドを実行します。

my_model = aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")

endpoint = my_model.deploy(
     deployed_model_display_name='my-endpoint',
     traffic_split={"0": 100},
     machine_type="n1-standard-4",
     accelerator_count=0,
     min_replica_count=1,
     max_replica_count=1,
   )

6. 予測を取得する

オンライン予測

モデルがエンドポイントにデプロイされると、残りのエンドポイントと同じように操作できます。クラウド関数、chatbot、ウェブアプリなどから呼び出すことができます。

ここではデモを目的としているため、このエンドポイントを Workbench から呼び出します。

前のラボで作成したノートブックに戻ります。Launcher から新しい TensorFlow 2 ノートブックを作成します。

tf_kernel

Vertex AI Python SDK、numpy、PIL をインポートします。

from google.cloud import aiplatform

import numpy as np
from PIL import Image

次の画像をダウンロードして、ワークベンチ インスタンスにアップロードします。このタンポポの画像でモデルをテストします。

test_image

まず、エンドポイントを定義します。次のように {PROJECT_NUMBER}{ENDPOINT_ID} を置き換える必要があります。

endpoint = aiplatform.Endpoint(
    endpoint_name="projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")

endpoint_id は、Cloud コンソールの [エンドポイント] セクションで確認できます。

endpoint_id

また、プロジェクト番号は、コンソールのホームページで確認できます。これは、プロジェクト ID とは異なります。

project_number

以下のコードが開き、PIL で画像のサイズが変更されます。

IMAGE_PATH = "test-image.jpg"
im = Image.open(IMAGE_PATH)

numpy データを float32 型に変換し、さらにリストに変換します。リストに変換するのは、numpy データが JSON でシリアル化できないためです。シリアル化できないと、リクエストの本文で送信できません。

x_test = np.asarray(im).astype(np.float32).tolist()

最後に、endpoint.predict を呼び出します。

endpoint.predict(instances=x_test).predictions

結果はモデルの出力で、5 個のユニットがあるソフトマックス レイヤになります。インデックスではなく文字列ラベルを返すようにカスタム ロジックを作成する場合は、カスタム予測ルーチンを使用できます。

バッチ予測

バッチ予測のデータをフォーマットする方法はいくつかあります。説明をわかりやすくするため、ここでは numpy データを json ファイルにダンプし、ファイルを Cloud Storage に保存します。

with open('test-data.json', 'w') as fp:
    json.dump(x_test, fp)

!gsutil cp test-data.json gs://{YOUR_BUCKET}

次に、モデルを定義します。これはエンドポイントの定義に似ていますが、ENDPOINT_ID ではなく MODEL_ID を指定する必要があります。

my_model=aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")

モデル ID を確認するには、コンソールの [モデル] セクションでモデル名とバージョンを選択して、[バージョンの詳細] を選択します。

model_id

最後に、SDK を使用してバッチ予測ジョブを呼び出します。json ファイルを保存した Cloud Storage パスを渡して、予測の結果を保存する Cloud Storage のロケーションを指定します。

batch_prediction_job = my_model.batch_predict(
    job_display_name='flower_batch_predict',
    gcs_source='gs://{YOUR_BUCKET}/test-data.json',
    gcs_destination_prefix='gs://{YOUR_BUCKET}/prediction-results',
    machine_type='n1-standard-4',)

ジョブの進行状況は、コンソールの [バッチ予測] セクションで追跡できます。単一画像にバッチ予測ジョブを実行するのは効率的ではありません。

batch_pred

次のステップ

この例では、テスト画像を NumPy に変換してから予測の呼び出しを行いました。実際のユースケースでは、画像自体を送信し、画像を NumPy に変換したくない場合もあります。その場合は、TensorFlow サービス提供関数を調整して、画像バイトをデコードする必要があります。すこし手間はかかりますが、サイズの大きい画像を処理する場合やアプリケーションを構築する場合は、こちらのほうが非常に効率的に処理できます。このノートブックの例をご覧ください

お疲れさまでした

Vertex AI を使って次のことを行う方法を学びました。

  • Vertex AI Model Registry にモデルをアップロードする
  • バッチ予測とオンライン予測を実行する

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

7. クリーンアップ

今後使用する予定がなければ、エンドポイントからモデルのデプロイを解除します。エンドポイント全体を削除することもできます。必要であれば、いつでもエンドポイントにモデルをデプロイできます。

undeploy_model

Workbench マネージド ノートブックは、アイドル状態が 180 分続くと自動的にタイムアウトします。インスタンスのシャットダウンを気にする必要はありません。インスタンスを手動でシャットダウンする場合は、コンソールで [Vertex AI] の [ワークベンチ] セクションにある [停止] ボタンをクリックします。ノートブックを完全に削除する場合は、[削除] ボタンをクリックします。

インスタンスの停止

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

ストレージを削除