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

このチュートリアルでは、Vertex AI エンドポイントを BigQuery のリモートモデルとして登録します。次に、ML.PREDICT 関数を使用して、リモートモデルで予測を行います。

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

モデルを Vertex AI Model Registry にインポートする

このチュートリアルでは、Cloud Storage の gs://cloud-samples-data/bigquery/ml/remote_model_tutorial/ にある事前トレーニング済みの TensorFlow モデルを使用します。Cloud Storage バケットは US マルチリージョン ロケーションにあります。

このモデルは、saved_model.pb という名前の TensorFlow モデルです。これは、カスタマイズされた感情分析モデルです。書式なしテキストの IMDB 映画レビューを使用して BERT モデルをファインチューニングしたものです。このモデルは、映画レビューのテキスト入力を使用し、0~1 の感情スコアを返します。モデルを Model Registry にインポートする場合は、ビルド済みの TensorFlow コンテナを使用します。

モデルをインポートする手順は次のとおりです。

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

    [Model Registry] に移動

  2. [インポート] をクリックします。

  3. [ステップ 1: 名前とリージョン] で、次の操作を行います。

    1. [新しいモデルとしてインポート] を選択します。

    2. [名前] に「bert_sentiment」と入力します。

    3. [説明] に「BQML tutorial model」と入力します。

    4. [リージョン] で us-central1 を選択します。Cloud Storage バケットは US マルチリージョン ロケーションにあるため、米国ベースのリージョンを選択する必要があります。

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

  4. [ステップ 2: モデルの設定] で、次の操作を行います。

    1. [新しいビルド済みコンテナにモデル アーティファクトをインポートする] を選択します。

    2. [ビルド済みコンテナ設定] セクションで、次の操作を行います。

      1. [モデル フレームワーク] で [TensorFlow] を選択します。

      2. [モデル フレームワークのバージョン] で [2.15] を選択します。

      3. [アクセラレータ タイプ] で [GPU] を選択します。

      4. [モデル アーティファクトの場所] に「gs://cloud-samples-data/bigquery/ml/remote_model_tutorial/」と入力します。

      5. 残りのオプションはすべてデフォルト値のままにして、[インポート] をクリックします。

インポートが完了すると、モデルが [Model Registry] ページに表示されます。

モデルを Vertex AI エンドポイントにデプロイする

モデルをエンドポイントにデプロイする手順は次のとおりです。

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

    [Model Registry] に移動

  2. [名前] 列で [bert_sentiment] をクリックします。

  3. [デプロイとテスト] タブをクリックします。

  4. [エンドポイントへのデプロイ] をクリックします。

  5. ステップ 1「エンドポイントを定義する」では、次の操作を行います。

    1. [新しいエンドポイントを作成] をクリックします。

    2. [エンドポイント名] に「bert sentiment endpoint」と入力します。

    3. 残りのデフォルト値は変更せず、[続行] をクリックします。

  6. ステップ 2 の [モデル設定] で、次の操作を行います。

    1. [コンピューティングの設定] セクションの [コンピューティング ノードの最小数] に「1」と入力します。これは、モデルで常に使用できる必要のあるノードの数です。

    2. [高度なスケーリング オプション] セクションの [マシンタイプ] で、[Standard(n1-standard-2)] を選択します。モデルのインポート時にアクセラレータ タイプとして GPU を選択したため、マシンタイプを選択すると、アクセラレータ タイプとアクセラレータ数が自動的に設定されます。

    3. 残りのデフォルト値は変更せずに、[デプロイ] をクリックします。

      モデルがエンドポイントにデプロイされると、ステータスは Active に変わります。

    4. [ID] 列の数値エンドポイント ID と [リージョン] 列の値をコピーします。これらは後で必要になります。

データセットを作成する

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

コンソール

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

    [BigQuery] ページに移動

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

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

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

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

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

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

bq

新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset コマンドのリファレンスをご覧ください。

  1. データの場所が US に設定され、BigQuery ML tutorial dataset という説明の付いた、bqml_tutorial という名前のデータセットを作成します。

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    このコマンドでは、--dataset フラグの代わりに -d ショートカットを使用しています。-d--dataset を省略した場合、このコマンドはデフォルトでデータセットを作成します。

  2. データセットが作成されたことを確認します。

    bq ls

API

定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

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

Vertex AI エンドポイントに接続するには、Cloud リソース接続が必要です。

コンソール

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

    BigQuery に移動

  2. 左側のペインで、 [エクスプローラ] をクリックします。

    エクスプローラ ペインのボタンがハイライト表示されている。

    左側のペインが表示されていない場合は、 左側のペインを開くをクリックしてペインを開きます。

  3. [エクスプローラ] ペインで、 [データを追加] をクリックします。

    [データを追加] ダイアログが開きます。

  4. [フィルタ条件] ペインの [データソースのタイプ] セクションで、[データベース] を選択します。

    または、[データソースを検索] フィールドに「Vertex AI」と入力します。

  5. [特徴量データソース] セクションで、[Vertex AI] をクリックします。

  6. [Vertex AI モデル: BigQuery フェデレーション] ソリューション カードをクリックします。

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

  8. [接続 ID] フィールドに「bqml_tutorial」と入力します。

  9. [マルチリージョン - US] が選択されていることを確認します。

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

  11. ウィンドウの下部にある [接続に移動] をクリックします。または、[エクスプローラ] ペインで [接続] をクリックし、[us.bqml_tutorial] をクリックします。

  12. [接続情報] ペインで、サービス アカウント ID をコピーします。この ID は、接続の権限を設定するときに必要になります。接続リソースを作成すると、BigQuery は、一意のシステム サービス アカウントを作成し、それを接続に関連付けます。

bq

  1. 接続を作成するには:

    bq mk --connection --location=US --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE bqml_tutorial

    PROJECT_ID は、実際のGoogle Cloud プロジェクト 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.us.bqml_tutorial

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

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

接続アクセスを設定する

Cloud リソース接続のサービス アカウントに Vertex AI ユーザーロールを付与します。このロールは、リモートモデル エンドポイントを作成したプロジェクトで付与する必要があります。

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

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

    [IAM と管理] に移動

  2. [アクセスを許可] をクリックします。

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

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

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

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

BigQuery ML リモートモデルを作成するには、REMOTE WITH CONNECTION 句を指定して CREATE MODEL ステートメントを使用します。CREATE MODEL ステートメントの詳細については、カスタムモデルを介したリモートモデルの CREATE MODEL ステートメントをご覧ください。

モデルは US マルチリージョン ロケーションに作成します。BigQuery マルチリージョン(USEU)データセットでは、同じマルチリージョン ロケーション(USEU)内のリージョンにデプロイされたエンドポイントに接続するリモートモデルのみを作成できます。

リモートモデルを作成する際には、Vertex AI にモデルをデプロイしたときに生成されたエンドポイント ID が必要です。また、入力と出力のフィールドの名前と型は、Vertex AI モデルの入力と出力と完全に同じでなければなりません。この例では、入力はテキスト STRING で、出力は FLOAT64 タイプの ARRAY です。

コンソール

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

    [BigQuery] に移動

  2. [新規作成] で [SQL クエリ] をクリックします。

  3. クエリエディタで次の CREATE MODEL ステートメントを入力し、[実行] をクリックします。

    CREATE OR REPLACE MODEL `PROJECT_ID.bqml_tutorial.bert_sentiment`
    INPUT (text STRING)
    OUTPUT(scores ARRAY<FLOAT64>)
    REMOTE WITH CONNECTION `PROJECT_ID.us.bqml_tutorial`
    OPTIONS(ENDPOINT = 'https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/endpoints/ENDPOINT_ID')

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

    • PROJECT_ID: プロジェクト名。
    • ENDPOINT_ID: 前にコピーしたエンドポイント ID。

    オペレーションが完了すると、Successfully created model named bert_sentiment のようなメッセージが表示されます。

    新しいモデルが [リソース] パネルに表示されます。モデルにはモデルアイコン モデルアイコン がついています。

    [リソース] パネルで新しいモデルを選択すると、そのモデルに関する情報がクエリエディタの下に表示されます。

bq

  1. 次の CREATE MODEL ステートメントを入力して、リモートモデルを作成します。

    bq query --use_legacy_sql=false \
    "CREATE OR REPLACE MODEL `PROJECT_ID.bqml_tutorial.bert_sentiment`
    INPUT (text STRING)
    OUTPUT(scores ARRAY<FLOAT64>)
    REMOTE WITH CONNECTION `PROJECT_ID.us.bqml_tutorial`
    OPTIONS(ENDPOINT = 'https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/endpoints/ENDPOINT_ID')"

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

    • PROJECT_ID: プロジェクト名。
    • ENDPOINT_ID: 前にコピーしたエンドポイント ID。
  2. モデルを作成したら、モデルがデータセットに表示されていることを確認します。

    bq ls -m bqml_tutorial

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

    Id               Model Type   Labels    Creation Time
    ---------------- ------------ -------- -----------------
    bert_sentiment                         28 Jan 17:39:43

ML.PREDICT を使用して予測を取得する

ML.PREDICT 関数を使用して、リモートモデルから感情の予測を取得します。入力は、bigquery-public-data.imdb.reviews テーブルの映画のレビューを含むテキスト列(review)です。

この例では、10,000 件のレコードが選択され、予測用に送信されています。リモートモデルには、リクエストのバッチサイズとして、デフォルトで 128 個のインスタンスが設定されています。

コンソール

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

    [BigQuery] に移動

  2. [新規作成] セクションで、[SQL クエリ] をクリックします。

  3. クエリエディタで、ML.PREDICT 関数を使用する次のクエリを入力し、[実行] をクリックします。

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

    クエリ結果は次のようになります。

    クエリ結果

bq

次のコマンドを入力して、ML.PREDICT を使用するクエリを実行します。

bq query --use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT (
MODEL `PROJECT_ID.bqml_tutorial.bert_sentiment`,
  (
    SELECT review as text
    FROM `bigquery-public-data.imdb.reviews`
    LIMIT 10000
  )
)'