Vertex AI のリモートモデルで予測を行う

Vertex AI エンドポイントをリモートモデルとして登録し、ML.PREDICT を使用して BigQuery から直接呼び出すことができます。

これは、モデルが大きすぎて BigQuery にインポートできない場合や、オンライン、バッチ、マイクロバッチのユースケースで単一の推論ポイントを使用する場合に便利です。

このチュートリアルでは、書式なしテキストの IMDB 映画レビューを使用して BERT モデルを微調整することにより、カスタマイズされた感情分析モデルを使用します。結果のモデルでは、テキスト入力(映画レビュー)を使用し、感情スコアを (0, 1) の範囲で返します。モデルは Vertex AI Model Registry に登録され、Vertex AI エンドポイントで提供されます。そこから、モデルはリモートモデルとして BigQuery に追加されます。BigQuery 内のリモートモデルを使用して、テキスト列の感情予測(100,000 行のテーブル bigquery-public-data.imdb.reviews から映画のレビュー)を取得できます。

Python バージョンの GitHub チュートリアルについては、BQML リモート モデル チュートリアルをご覧ください。

ワークフローの概要

チュートリアルのセットアップ

このチュートリアルでは、課金対象である Google Cloud コンポーネントである Cloud Storage、Vertex AI、BigQuery を使用します。チュートリアルの終了時に、課金対象のコンポーネントを削除します。

  1. Vertex AI、Cloud Storage、BigQuery の Cloud Resource Connections の API を有効にするには、こちらをクリックしてください。
  2. Cloud Storage: こちらの手順に沿って、デフォルトの US マルチリージョンにバケットを作成します。

ML モデルの作成

BQML リモートモデル チュートリアルを使用してモデルを作成します。これには、分類レイヤを追加しながら BERT モデルを微調整して作成された感情分析予測モデルが含まれています。

すでにサンプルモデルをトレーニングし、直接使用できるように gs://cloud-samples-data/bigquery/ml/remote_model_tutorial/ にアップロードしています。

Vertex AI にモデルをデプロイする

手順に沿って、Vertex AI Model Registry にモデルを登録します。

手順に従って、Vertex AI モデル レジストリから Vertex AI エンドポイントにモデルをデプロイします。

コンピューティング ノードの最大数を設定することをおすすめします。これにより、Vertex AI 側の自動スケーリング機能が有効になり、BigQuery データテーブルに大量の行がある場合にエンドポイントがより多くのリクエストを処理できるようになります。

BigQuery ML リモートモデル

BigQuery ML リモートモデルの作成には、BigQuery クラウド リソース接続と、その接続を使用する BigQuery リモートモデルの 2 つのコンポーネントがあります。

BigQuery クラウド リソース接続を作成する

Vertex AI に接続するには、クラウド リソース接続が必要です。

次のオプションのいずれかを選択します。

コンソール

  1. BigQuery ページに移動します。

    [BigQuery] に移動

  2. 接続を作成するには、[追加] をクリックし、続いて [外部データソースへの接続] をクリックします。

  3. [接続タイプ] リストで、[Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)] を選択します。

  4. [接続 ID] フィールドに接続の名前を入力します。

  5. [接続を作成] をクリックします。

  6. [接続へ移動] をクリックします。

  7. [接続情報] ペインで、後の手順で使用するサービス アカウント ID をコピーします。

bq

  1. コマンドライン環境で接続を作成します。

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    --project_id パラメータは、デフォルト プロジェクトをオーバーライドします。

    以下を置き換えます。

    接続リソースを作成すると、BigQuery は、一意のシステム サービス アカウントを作成し、それを接続に関連付けます。

    トラブルシューティング: 次の接続エラーが発生した場合は、Google Cloud SDK を更新します。

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. 後の手順で使用するため、サービス アカウント ID を取得してコピーします。

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    出力は次のようになります。

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

google_bigquery_connection リソースを使用します。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

次の例では、US リージョンに my_cloud_resource_connection という名前の Cloud リソース接続を作成します。


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行う必要があります。
    terraform init

    必要に応じて、最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行し、プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」のメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

アクセス権限を設定する

接続のサービス アカウントに Vertex AI ユーザー ロールを付与します。このロールは、BigQuery ML リモートモデルの作成セクションでリモートモデル エンドポイントの URL に指定するプロジェクト(短いバージョンのエンドポイントを使用する場合はモデル プロジェクト)で付与する必要があります。別のプロジェクトでロールを付与すると、「bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource」というエラーが発生します。

ロールを付与する手順は次のとおりです。

  1. [IAM と管理] ページに移動します。

    [IAM と管理] に移動

  2. [アクセス権を付与] をクリックします。

  3. [新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。

  4. [ロールを選択] フィールドで、[Vertex AI]、[Vertex AI ユーザーロール] の順に選択します。

  5. [保存] をクリックします。

データセットを作成する

ML モデルを保存する BigQuery データセットを作成します。

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

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. 「アクションを表示」> [データセットを作成] をクリックします。

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

  4. [データセットを作成する] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。

      一般公開データセットは US マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

      データセットの作成ページ

BigQuery ML リモートモデルを作成する

エンドポイントにリクエストを送信して TensorFlow モデルの入力スキーマと出力スキーマを確認するには次のようにします。

リクエストの例:

curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/ENDPOINT_ID:predict -d "{'instances': [{ 'text': 'This is an amazing movie'}, { 'text': 'The movie was terrible'}]}"

レスポンスの例:

{
  "predictions": [
    [
      [ 0.999410391 ]
    ],
    [
      [ 0.000628352049 ]
    ]
  ]
}

リモートモデルを作成する場合、入力と出力のフィールドの名前と型は、Vertex AI の入出力と完全に同じである必要があります。

単一出力モデルの場合、Vertex AI はフィールド名を返しません。CREATE MODEL では、任意のフィールド名を指定できます。

次の例は、接続を使用してリモートモデルを作成する方法を示しています。

CREATE OR REPLACE MODEL `PROJECT_ID.bqml_tutorial.bert_sentiment`
    INPUT (text STRING)
    OUTPUT(scores ARRAY<FLOAT64>)
    REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS(endpoint = 'ENDPOINT_URL')

ML.PREDICT で予測を取得する

ML.PREDICT 関数を使用して、BigQuery 内のリモートモデルから予測を取得します。ここでは、10,000 件のレコードが選択され、予測用に送信されています。リモートモデルはデフォルトで、リクエストのバッチサイズとして 128 個のインスタンスに設定されています。

SELECT *
FROM ML.PREDICT (
    MODEL `PROJECT_ID.bqml_tutorial.bert_sentiment`,
    (
        SELECT review as text
        FROM `bigquery-public-data.imdb.reviews`
        LIMIT 10000
    )
)

サポートされるリージョン

BigQuery のロケーションには、次の 2 種類があります。

  • リージョンは、ロンドンなどの特定の地理的な場所です。
  • マルチリージョンは、米国などの、2 つ以上の地理的な場所を含む広い地理的なエリアとなります。

シングル リージョン

BigQuery の単一リージョン データセットでは、同じリージョンにデプロイされた Vertex AI エンドポイントを使用するリモートモデルのみを作成できます。 BigQuery の単一リージョン us-central1 のリモートモデルは、us-central1 の Vertex AI のみを使用できます。 そのため、単一リージョンの場合、リモートモデルは Vertex AI と BigQuery の両方をサポートするリージョンでのみサポートされます。

マルチリージョン

BigQuery マルチリージョン(USEU)データセットでは、同じ大規模な地理的領域(USEU)内のリージョンにデプロイされたリモートモデルを使用するリモートモデルのみを作成できます。例: BigQuery US マルチリージョン内のリモートモデルでは、米国の地理的領域の任意の単一リージョン(us-central1us-east4us-west2 など)にデプロイされた Vertex AI エンドポイントのみを使用できます。

BigQuery EU マルチリージョン内のリモートモデルでは、EU の加盟国にある任意の単一リージョン(europe-north1europe-west3 など)にデプロイされた Vertex AI エンドポイントのみを使用できます。

BigQuery のリージョンとマルチリージョンの詳細については、データセットのロケーション ページをご覧ください。Vertex AI リージョンの詳細については、Vertex AI のロケーションをご覧ください。

VPC Service Controls の使用

VPC Service Controls は、Google Cloud の機能で、データ漏洩を防ぐためのセキュアな境界を設定できます。セキュリティをさらに強化するために、リモートモデルで VPC Service Controls を使用するには、VPC Service Controls ガイドに沿って次の操作を行います。 サービス境界を作成します。

リモート関数を使用したクエリの BigQuery プロジェクトを境界に追加します。エンドポイント プロジェクトを境界に追加し、エンドポイント タイプに基づいて制限付きサービスに Vertex AI API を設定します。詳細については、Vertex AI VPC Service Controls をご覧ください。

クリーンアップ

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.