カスタム トレーニング: カスタム画像分類モデルから取得した予測情報を提供する

このページでは、画像分類モデルから予測を行い、その結果をウェブアプリで表示する手順について説明します。

このドキュメントは「Hello カスタム トレーニング」チュートリアルの一部です。このチュートリアルでは、Vertex AI を使用して画像分類モデルをトレーニングし、そのモデルを使用して予測を提供する方法について説明しています。このチュートリアルでは、Vertex AI のカスタム トレーニング機能を使用して、Vertex AI のビルド済みコンテナ環境のいずれかで TensorFlow Keras トレーニング アプリケーションを実行します。このカスタム トレーニング ジョブは、花の画像をタイプで分類するように機械学習(ML)モデルをトレーニングします。このチュートリアルでは、ML モデルをトレーニングした後、エンドポイントを作成し、そのエンドポイントからシンプルなウェブアプリに予測を提供する方法を説明します。

このチュートリアルには複数のページが含まれます。

  1. プロジェクトと環境の設定

  2. カスタム画像分類モデルのトレーニング

  3. カスタム画像分類モデルから取得した予測情報の提供

  4. プロジェクトのクリーンアップ

各ページは、前のページのチュートリアルの手順をすでに実施していることを前提としています。

このドキュメントの以降の内容は、このチュートリアルの最初のページの手順を実施したときに作成したものと同じ Cloud Shell 環境を使用していることを前提としています。元の Cloud Shell セッションが開かれていない場合は、次の手順を行ってその環境に戻ることができます。

  1. Cloud Console で、Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

  2. Cloud Shell セッションで次のコマンドを実行します。

    cd hello-custom-sample
    

1. エンドポイントを作成する

このチュートリアルの前のページでトレーニングした ML モデルからオンライン予測を取得するため、Vertex AI エンドポイントを作成します。エンドポイントは 1 つ以上のモデルからオンライン予測を提供します。

  1. Google Cloud Console の Vertex AI セクションで、[モデル] ページに移動します。

    [モデル] に移動

  2. このチュートリアルの前のステップでトレーニングしたモデル(hello_custom) を探し、モデル名をクリックしてモデルの詳細ページを開きます。

  3. [デプロイとテスト] タブで、[エンドポイントへのデプロイ] をクリックして、[エンドポイントへのデプロイ] ペインを開きます。

  4. [エンドポイントの定義] で、エンドポイントの基本情報を追加します。

    1. [新しいエンドポイントを作成する] を選択します。

    2. [エンドポイント名] フィールドに「hello_custom」と入力します。

    3. [モデル設定] セクションに、モデルの名前(hello_custom)が表示されていることを確認します。次のモデル設定を指定します。

      1. [トラフィック分割] フィールドに「100」と入力します。Vertex AI では、エンドポイントの複数のモデルへのトラフィックの分割がサポートされていますが、このチュートリアルではこの機能は使用しません。

      2. [コンピューティング ノードの最小数] フィールドに「1」と入力します。

      3. [Machine type] プルダウン リストで、[標準] セクションから [n1-standard-2] を選択します。

      4. [完了] をクリックします。

    4. [ロギング] セクションで、両方のタイプの予測ロギングが有効になっていることを確認します。

    [続行] をクリックします。

  5. [エンドポイントの詳細] で、エンドポイントが us-central1 (Iowa) にデプロイされていることを確認します。

    [顧客管理の暗号鍵(CMEK)を使用する] チェックボックスはオンにしないでください。このチュートリアルでは、CMEK は使用しません。

  6. [デプロイ] をクリックしてエンドポイントを作成し、モデルをエンドポイントにデプロイします。

数分後、[エンドポイント] テーブルの新しいエンドポイントの横に が表示されます。エンドポイントの作成が完了し、モデルがエンドポイントにデプロイされたことを知らせるメールが届きます。

2. Cloud Functions の関数をデプロイする

作成した Vertex AI エンドポイントから予測を取得するには、Vertex AI API の REST インターフェースにリクエストを送信します。ただし、オンライン予測リクエストを送信できるのは、aiplatform.endpoints.predict 権限を持つプリンシパルのみです。ウェブアプリなどからリクエストを送信するためにエンドポイントを公開することはできません。

このセクションでは、Cloud Functions にコードをデプロイして、未認証のリクエストを処理します。このチュートリアルの最初のページでダウンロードしたサンプルコードには、この Cloud Functions の関数が含まれています(function/ ディレクトリにあります)。必要に応じて、次のコマンドを実行して Cloud Functions の関数のコードを確認します。

less function/main.py

この関数をデプロイする目的は次のとおりです。

  • 認証されていないリクエストを受信するように Cloud Functions の関数を構成できます。また、デフォルトでは、編集者のロールを持つサービス アカウントを使用して関数を実行します。このロールには、Vertex AI エンドポイントから予測を取得するために必要な aiplatform.endpoints.predict 権限が含まれています。

  • この関数は、リクエストに対する便利な前処理も実行します。Vertex AI エンドポイントは、トレーニング済みの TensorFlow Keras グラフの最初のレイヤ(固定サイズの正規化された浮動小数点のテンソル)で予測リクエストを想定しています。この関数は、画像の URL を入力として受け取り、イメージをこの形式に前処理し、Vertex AI エンドポイントから予測をリクエストします。

Cloud Functions の関数をデプロイするには、次の操作を行います。

  1. Google Cloud Console の Vertex AI セクションで、[エンドポイント] ページに移動します。

    エンドポイントに移動

  2. 前のセクションで作成したエンドポイントの hello_custom 行を探します。この行で、[リクエストの例] をクリックして [リクエストの例] ペインを開きます。

  3. [リクエストの例] ペインで、次のパターンに一致するシェルコードの行を見つけます。

    ENDPOINT_ID="ENDPOINT_ID"
    

    ENDPOINT_ID は、この特定のエンドポイントを識別する番号です。

    このコードをコピーして Cloud Shell セッションで実行し、ENDPOINT_ID 変数を設定します。

  4. Cloud Shell セッションで次のコマンドを実行して、Cloud Functions の関数をデプロイします。

    gcloud functions deploy classify_flower \
      --region=us-central1 \
      --source=function \
      --runtime=python37 \
      --memory=2048MB \
      --trigger-http \
      --allow-unauthenticated \
      --set-env-vars=ENDPOINT_ID=${ENDPOINT_ID}
    

3. ウェブアプリをデプロイして予測リクエストを送信する

最後に、Cloud Storage で静的ウェブアプリをホストして、トレーニング済み ML モデルから予測を取得します。ウェブアプリは Cloud Functions の関数にリクエストを送信します。Cloud Functions はリクエストを前処理し、Vertex AI エンドポイントから予測を取得します。

ダウンロードしたサンプルコードの webapp ディレクトリには、サンプル ウェブアプリが含まれています。Cloud Shell セッションで次のコマンドを実行し、ウェブアプリを準備してデプロイします。

  1. 以下では、コマンドで使用するいくつかのシェル変数を設定します。

    PROJECT_ID=PROJECT_ID
    BUCKET_NAME=BUCKET_NAME
    

    次のように置き換えます。

  2. アプリを編集して、Cloud Functions の関数のトリガー URL を入力します。

    echo "export const CLOUD_FUNCTION_URL = 'https://us-central1-${PROJECT_ID}.cloudfunctions.net/classify_flower';" \
      > webapp/function-url.js
    
  3. webapp ディレクトリを Cloud Storage バケットにアップロードします。

    gsutil -m cp -r webapp gs://${BUCKET_NAME}/
    
  4. アップロードしたウェブアプリ ファイルを公開読み取り可能にします。

    gsutil -m acl ch -u AllUsers:R gs://${BUCKET_NAME}/webapp/**
    
  5. 次の URL に移動して、ウェブアプリを開き、予測を取得します。

    https://storage.googleapis.com/BUCKET_NAME/webapp/index.html
    

    ウェブアプリを開き、花の画像をクリックすると、ML モデルの花の種類の分類が表示されます。このウェブアプリは、予測を花の種類のリストとして提示し、画像に各種の花が含まれている可能性を示します。

次のスクリーンショットでは、ウェブアプリがすでに予測を 1 つ取得し、別の予測リクエストを送信しています。

ウェブアプリで、ラベル付きの花の画像が 4 つ表示されている。1 つの画像の下に予測ラベルの確率が表示されている。別の画像の下には、読み込みの進行状況を示すバーが表示されている。

次のステップ

チュートリアルの最後のページで、作成したリソースをクリーンアップする。