事前トレーニング済みの 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.create
とstorage.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.
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
詳しくは、次のリソースをご覧ください。
始める前に
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
データセットを作成する
作成したモデルを保存する tf_models_tutorial
という名前のデータセットを作成するには、次のいずれかのオプションを選択します。
SQL
CREATE SCHEMA
ステートメントを使用します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
CREATE SCHEMA `PROJECT_ID.tf_models_tutorial`;
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
bq
Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。
データセットを作成するには、
bq mk
コマンドを実行します。bq mk --dataset --location=us PROJECT_ID:tf_models_tutorial
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。
モデルを生成して Cloud Storage にアップロードする
事前トレーニング済みの TensorFlow モデルを使用してテキスト エンベディングを生成する詳細な手順については、Colab ノートブックをご覧ください。または、次のいずれかのモデルを選択してください。
NNLM
pip を使用して
bigquery-ml-utils
ライブラリをインストールします。pip install bigquery-ml-utils
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
は、モデルを一時的に保存するローカル フォルダのパスに置き換えます。省略可: 生成されたモデルの署名を出力します。
import tensorflow as tf reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH) print(reload_embedding_model.signatures["serving_default"])
生成されたモデルをローカル フォルダから Cloud Storage バケットにコピーするには、Google Cloud CLI を使用します。
gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/nnlm_model --recursive
BUCKET_PATH
は、モデルのコピー先の Cloud Storage バケットの名前に置き換えます。
SWIVEL
pip を使用して
bigquery-ml-utils
ライブラリをインストールします。pip install bigquery-ml-utils
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
は、モデルを一時的に保存するローカル フォルダのパスに置き換えます。省略可: 生成されたモデルの署名を出力します。
import tensorflow as tf reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH) print(reload_embedding_model.signatures["serving_default"])
生成されたモデルをローカル フォルダから Cloud Storage バケットにコピーするには、Google Cloud CLI を使用します。
gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/swivel_model --recursive
BUCKET_PATH
は、モデルのコピー先の Cloud Storage バケットの名前に置き換えます。
BERT
pip を使用して
bigquery-ml-utils
ライブラリをインストールします。pip install bigquery-ml-utils
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
は、モデルを一時的に保存するローカル フォルダのパスに置き換えます。省略可: 生成されたモデルの署名を出力します。
import tensorflow as tf reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH) print(reload_embedding_model.signatures["serving_default"])
生成されたモデルをローカル フォルダから Cloud Storage バケットにコピーするには、Google Cloud CLI を使用します。
gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/bert_model --recursive
BUCKET_PATH
は、モデルのコピー先の Cloud Storage バケットの名前に置き換えます。
モデルを BigQuery に読み込む
次のいずれかのモデルを選択します。
NNLM
CREATE MODEL
ステートメントを使用します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
CREATE OR REPLACE MODEL
tf_models_tutorial.nnlm_model
OPTIONS ( model_type = 'TENSORFLOW', model_path = 'gs://BUCKET_NAME/nnlm_model/*');BUCKET_NAME
は、以前に作成したバケットの名前に置き換えます。[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
SWIVEL
CREATE MODEL
ステートメントを使用します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
CREATE OR REPLACE MODEL
tf_models_tutorial.swivel_model
OPTIONS ( model_type = 'TENSORFLOW', model_path = 'gs://BUCKET_NAME/swivel_model/*');BUCKET_NAME
は、以前に作成したバケットの名前に置き換えます。[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
BERT
BERT モデルを BigQuery に読み込むには、BERT モデルを Vertex AI にインポートし、モデルを Vertex AI エンドポイントにデプロイして、接続を作成してから、BigQuery でリモートモデルを作成します。
BERT モデルを Vertex AI にインポートするには、次の手順を行います。
Google Cloud コンソールで、Vertex AI [Model Registry] ページに移動します。
[インポート] をクリックして、次の操作を行います。
- [名前] に「
BERT
」と入力します。 - [リージョン] で、Cloud Storage バケットのリージョンと一致するリージョンを選択します。
- [名前] に「
[続行] をクリックして、次の操作を行います。
- [モデル フレームワークのバージョン] で、[
2.8
] を選択します。 - [モデル アーティファクトの場所] に、モデルファイルを保存した Cloud Storage バケットへのパスを入力します。例:
gs://BUCKET_PATH/bert_model
- [モデル フレームワークのバージョン] で、[
[インポート] をクリックします。インポートが完了すると、モデルが [モデル レジストリ] ページに表示されます。
BERT モデルを Vertex AI エンドポイントにデプロイして BigQuery に接続するには、次の手順に沿って操作します。
Google Cloud コンソールで、Vertex AI [Model Registry] ページに移動します。
モデルの名前をクリックします。
[デプロイとテスト] をクリックします。
[エンドポイントへのデプロイ] をクリックします。
[エンドポイント名] に「
bert_model_endpoint
」と入力します。[続行] をクリックします。
コンピューティング リソースを選択します。
[デプロイ] をクリックします。
BigQuery Cloud リソース接続を作成し、接続のサービス アカウントにアクセス権を付与します。
Vertex AI エンドポイントに基づいてリモートモデルを作成するには、CREATE MODEL
ステートメントを使用します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
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
: プロジェクト IDCONNECTION_LOCATION
: BigQuery 接続のロケーションCONNECTION_ID
: BigQuery 接続の IDGoogle Cloud コンソールで接続の詳細を表示する場合、これは [接続 ID] に表示される完全修飾接続 ID の最後のセクションの値です。例:
projects/myproject/locations/connection_location/connections/myconnection
ENDPOINT_LOCATION
: Vertex AI エンドポイントのロケーション。例: "us-central1"ENDPOINT_ID
: モデル エンドポイントの ID
[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
テキスト エンベディングを生成する
このセクションでは、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 | | | | ... | | | +--------------+---------------------+----------------------------------------+
クリーンアップ
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.