事前トレーニング済みの TensorFlow モデルを使用したテキスト エンベディング

このチュートリアルでは、事前トレーニング済みの TensorFlow モデルを使用して、BigQuery で NNLM、SWIVEL、BERT のテキスト エンベディングを生成する方法について説明します。テキスト エンベディングは、テキストの密ベクトル表現です。2 つのテキストが意味的に類似している場合、それらのエンベディングはエンベディング ベクトル空間内で密集します。

NNLM、SWIVEL、BERT モデル

NNLM、SWIVEL、BERT モデルは、サイズ、精度、スケーラビリティ、コストの点で異なります。次の表を参考にして、使用するモデルを決定してください。

モデル モデルのサイズ エンべディング ディメンション ユースケース 説明
NNLM 150 MB 未満 50 短いフレーズ、ニュース、ツイート、レビュー Neural Network Language Model
SWIVEL 150 MB 未満 20 短いフレーズ、ニュース、ツイート、レビュー Submatrix-wise Vector Embedding Learner
BERT 200 MB 未満 768 短いフレーズ、ニュース、ツイート、レビュー、短い段落 Bidirectional Encoder Representations from Transformers

このチュートリアルでは、NNLM モデルと SWIVEL モデルはインポートした TensorFlow モデルであり、BERT モデルは Vertex AI でのリモートモデルです。

必要な権限

  • データセットを作成するには、bigquery.datasets.create Identity and Access Management(IAM)権限が必要です。

  • バケットを作成するには、storage.buckets.create IAM 権限が必要です。

  • モデルを Cloud Storage にアップロードするには、storage.objects.createstorage.objects.get の IAM 権限が必要です。

  • 接続リソースを作成するには、次の IAM 権限が必要です。

    • bigquery.connections.create
    • bigquery.connections.get
  • モデルを BigQuery ML に読み込むには、次の IAM 権限が必要です。

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 推論を実行するには、次の IAM 権限が必要です。

    • オブジェクト テーブルに対する bigquery.tables.getData
    • モデルに対する bigquery.models.getData
    • bigquery.jobs.create

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

  • BigQuery: You incur costs for the queries that you run in BigQuery.
  • BigQuery ML: You incur costs for the model that you create and the inference that you perform in BigQuery ML.
  • Cloud Storage: You incur costs for the objects that you store in Cloud Storage.
  • Vertex AI: If you follow the instructions for generating the BERT model, then you incur costs for deploying the model to an endpoint.

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

詳しくは、次のリソースをご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. BigQuery, BigQuery Connection, and Vertex AI API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. BigQuery, BigQuery Connection, and Vertex AI API を有効にします。

    API を有効にする

データセットを作成する

作成したモデルを保存する tf_models_tutorial という名前のデータセットを作成するには、次のいずれかのオプションを選択します。

SQL

CREATE SCHEMA ステートメントを使用します。

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

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE SCHEMA `PROJECT_ID.tf_models_tutorial`;
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにします

  2. データセットを作成するには、bq mk コマンドを実行します。

    bq mk --dataset --location=us PROJECT_ID:tf_models_tutorial
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

モデルを生成して Cloud Storage にアップロードする

事前トレーニング済みの TensorFlow モデルを使用してテキスト エンベディングを生成する詳細な手順については、Colab ノートブックをご覧ください。または、次のいずれかのモデルを選択してください。

NNLM

  1. pip を使用して bigquery-ml-utils ライブラリをインストールします。

    pip install bigquery-ml-utils
    
  2. NNLM モデルを生成します。次の Python コードは、TensorFlow Hub から NNLM モデルを読み込み、BigQuery 用に準備します。

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate an NNLM model.
    text_embedding_model_generator.generate_text_embedding_model('nnlm', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH は、モデルを一時的に保存するローカル フォルダのパスに置き換えます。

  3. 省略可: 生成されたモデルの署名を出力します。

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 生成されたモデルをローカル フォルダから Cloud Storage バケットにコピーするには、gsutil ツールを使用します。

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/nnlm_model
    

    BUCKET_PATH は、モデルのコピー先の Cloud Storage バケットの名前に置き換えます。

SWIVEL

  1. pip を使用して bigquery-ml-utils ライブラリをインストールします。

    pip install bigquery-ml-utils
    
  2. SWIVEL モデルを生成します。次の Python コードは、TensorFlow Hub から SWIVEL モデルを読み込んで BigQuery 用に準備します。

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate a SWIVEL model.
    text_embedding_model_generator.generate_text_embedding_model('swivel', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH は、モデルを一時的に保存するローカル フォルダのパスに置き換えます。

  3. 省略可: 生成されたモデルの署名を出力します。

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 生成されたモデルをローカル フォルダから Cloud Storage バケットにコピーするには、gsutil ツールを使用します。

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/swivel_model
    

    BUCKET_PATH は、モデルのコピー先の Cloud Storage バケットの名前に置き換えます。

BERT

  1. pip を使用して bigquery-ml-utils ライブラリをインストールします。

    pip install bigquery-ml-utils
    
  2. BERT モデルを生成します。次の Python コードは、TensorFlow Hub から BERT モデルを読み込んで BigQuery 用に準備します。

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate a BERT model.
    text_embedding_model_generator.generate_text_embedding_model('bert', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH は、モデルを一時的に保存するローカル フォルダのパスに置き換えます。

  3. 省略可: 生成されたモデルの署名を出力します。

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 生成されたモデルをローカル フォルダから Cloud Storage バケットにコピーするには、gsutil ツールを使用します。

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/bert_model
    

    BUCKET_PATH は、モデルのコピー先の Cloud Storage バケットの名前に置き換えます。

モデルを BigQuery に読み込む

次のいずれかのモデルを選択します。

NNLM

CREATE MODEL ステートメントを使用します。

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

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE OR REPLACE MODEL tf_models_tutorial.nnlm_model
    OPTIONS (
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/nnlm_model/*');
    

    BUCKET_NAME は、以前に作成したバケットの名前に置き換えます。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

SWIVEL

CREATE MODEL ステートメントを使用します。

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

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE OR REPLACE MODEL tf_models_tutorial.swivel_model
    OPTIONS (
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/swivel_model/*');
    

    BUCKET_NAME は、以前に作成したバケットの名前に置き換えます。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

BERT

BERT モデルを BigQuery に読み込むには、BERT モデルを Vertex AI にインポートし、モデルを Vertex AI エンドポイントにデプロイして、接続を作成してから、BigQuery でリモートモデルを作成します。

BERT モデルを Vertex AI にインポートするには、次の手順を行います。

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

    [Model Registry] に移動

  2. [インポート] をクリックして、次の操作を行います。

    • [名前] に「BERT」と入力します。
    • [リージョン] で、Cloud Storage バケットのリージョンと一致するリージョンを選択します。
  3. [続行] をクリックして、次の操作を行います。

    • [モデル フレームワークのバージョン] で、[2.8] を選択します。
    • [モデル アーティファクトの場所] に、モデルファイルを保存した Cloud Storage バケットへのパスを入力します。例: gs://BUCKET_PATH/bert_model
  4. [インポート] をクリックします。インポートが完了すると、モデルが [モデル レジストリ] ページに表示されます。

BERT モデルを Vertex AI エンドポイントにデプロイして BigQuery に接続するには、次の手順に沿って操作します。

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

    [Model Registry] に移動

  2. モデルの名前をクリックします。

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

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

  5. [エンドポイント名] に「bert_model_endpoint」と入力します。

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

  7. コンピューティング リソースを選択します。

  8. [デプロイ] をクリックします。

  9. BigQuery Cloud リソース接続を作成し、接続のサービス アカウントにアクセス権を付与します。

Vertex AI エンドポイントに基づいてリモートモデルを作成するには、CREATE MODEL ステートメントを使用します。

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

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE OR REPLACE MODEL tf_models_tutorial.bert_model
    INPUT(content STRING)
    OUTPUT(embedding ARRAY<FLOAT64>)
    REMOTE WITH CONNECTION `PROJECT_ID.CONNECTION_LOCATION.CONNECTION_ID`
    OPTIONS (
      ENDPOINT = "https://ENDPOINT_LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/ENDPOINT_LOCATION/endpoints/ENDPOINT_ID");
    

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

    • PROJECT_ID: プロジェクト ID
    • CONNECTION_LOCATION: BigQuery 接続のロケーション
    • CONNECTION_ID: BigQuery 接続の ID

      Google Cloud コンソールで接続の詳細を表示する場合、これは [接続 ID] に表示される完全修飾接続 ID の最後のセクションの値です。例: projects/myproject/locations/connection_location/connections/myconnection

    • ENDPOINT_LOCATION: Vertex AI エンドポイントのロケーション。例: "us-central1"
    • ENDPOINT_ID: モデル エンドポイントの ID

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

テキスト エンベディングを生成する

このセクションでは、ML.PREDICT() 推論関数を使用して、一般公開データセット bigquery-public-data.imdb.reviews から review 列のテキスト エンベディングを生成します。このクエリでは、処理されるデータ量を削減するために、テーブルが 500 行に制限されています。

NNLM

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.nnlm_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

次のような結果になります。

+-----------------------+----------------------------------------+
| embedding             | content                                |
+-----------------------+----------------------------------------+
|  0.08599445223808289  | Isabelle Huppert must be one of the... |
| -0.04862852394580841  |                                        |
| -0.017750458791851997 |                                        |
|  0.8658871650695801   |                                        |
| ...                   |                                        |
+-----------------------+----------------------------------------+

SWIVEL

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.swivel_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

次のような結果になります。

+----------------------+----------------------------------------+
| embedding            | content                                |
+----------------------+----------------------------------------+
|  2.5952553749084473  | Isabelle Huppert must be one of the... |
| -4.015787601470947   |                                        |
|  3.6275434494018555  |                                        |
| -6.045154333114624   |                                        |
| ...                  |                                        |
+----------------------+----------------------------------------+

BERT

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.bert_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

次のような結果になります。

+--------------+---------------------+----------------------------------------+
| embedding    | remote_model_status | content                                |
+--------------+---------------------+----------------------------------------+
| -0.694072425 | null                | Isabelle Huppert must be one of the... |
|  0.439208865 |                     |                                        |
|  0.99988997  |                     |                                        |
| -0.993487895 |                     |                                        |
| ...          |                     |                                        |
+--------------+---------------------+----------------------------------------+

クリーンアップ

  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.