事前トレーニング済みの 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.
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
CREATE SCHEMA `PROJECT_ID.tf_models_tutorial`;
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。[
実行] をクリックします。Google Cloud コンソールで Cloud Shell をアクティブにします。
データセットを作成するには、
bq mk
コマンドを実行します。bq mk --dataset --location=us PROJECT_ID:tf_models_tutorial
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。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 バケットの名前に置き換えます。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 バケットの名前に置き換えます。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 バケットの名前に置き換えます。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
は、以前に作成したバケットの名前に置き換えます。[
実行] をクリックします。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
は、以前に作成したバケットの名前に置き換えます。[
実行] をクリックします。Google Cloud コンソールで、Vertex AI の [Model Registry] ページに移動します。
[インポート] をクリックして、次の操作を行います。
- [名前] に「
BERT
」と入力します。 - [リージョン] で、Cloud Storage バケットのリージョンと一致するリージョンを選択します。
- [名前] に「
[続行] をクリックして、次の操作を行います。
- [モデル フレームワークのバージョン] で、[
2.8
] を選択します。 - [モデル アーティファクトの場所] に、モデルファイルを保存した Cloud Storage バケットへのパスを入力します。例:
gs://BUCKET_PATH/bert_model
- [モデル フレームワークのバージョン] で、[
[インポート] をクリックします。インポートが完了すると、モデルが [モデル レジストリ] ページに表示されます。
Google Cloud コンソールで、Vertex AI の [Model Registry] ページに移動します。
モデルの名前をクリックします。
[デプロイとテスト] をクリックします。
[エンドポイントへのデプロイ] をクリックします。
[エンドポイント名] に「
bert_model_endpoint
」と入力します。[続行] をクリックします。
コンピューティング リソースを選択します。
[デプロイ] をクリックします。
BigQuery Cloud リソース接続を作成し、接続のサービス アカウントにアクセス権を付与します。
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
[
実行] をクリックします。- 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.
データセットを作成する
作成したモデルを保存する tf_models_tutorial
という名前のデータセットを作成するには、次のいずれかのオプションを選択します。
SQL
CREATE SCHEMA
ステートメントを使用します。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
bq
モデルを生成して Cloud Storage にアップロードする
事前トレーニング済みの TensorFlow モデルを使用してテキスト エンベディングを生成する詳細な手順については、Colab ノートブックをご覧ください。または、次のいずれかのモデルを選択してください。
NNLM
SWIVEL
BERT
モデルを BigQuery に読み込む
次のいずれかのモデルを選択します。
NNLM
CREATE MODEL
ステートメントを使用します。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
SWIVEL
CREATE MODEL
ステートメントを使用します。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
BERT
BERT モデルを BigQuery に読み込むには、BERT モデルを Vertex AI にインポートし、モデルを Vertex AI エンドポイントにデプロイして、接続を作成してから、BigQuery でリモートモデルを作成します。
BERT モデルを Vertex AI にインポートするには、次の手順で操作します。
BERT モデルを Vertex AI エンドポイントにデプロイして BigQuery に接続するには、次の手順で操作します。
Vertex AI エンドポイントに基づいてリモートモデルを作成するには、CREATE MODEL
ステートメントを使用します。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
テキスト エンベディングを生成する
このセクションでは、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 | | | | ... | | | +--------------+---------------------+----------------------------------------+