ML.GENERATE_EMBEDDING 関数を使用して画像エンベディングを生成する
このドキュメントでは、Vertex AI エンベディングの基盤モデルを参照する、BigQuery ML のリモートモデルを作成する方法について説明します。次に、そのモデルを ML.GENERATE_EMBEDDING
関数で使用し、BigQuery のオブジェクト テーブルのデータを使用して画像エンベディングに変換します。
必要なロール
接続を作成するには、次の Identity and Access Management(IAM)ロールのメンバーシップが必要です。
roles/bigquery.connectionAdmin
接続のサービス アカウントに権限を付与するには、次の権限が必要です。
resourcemanager.projects.setIamPolicy
BigQuery ML を使用してモデルを作成するには、次の IAM 権限が必要です。
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
推論を実行するには、次の権限が必要です。
- テーブルに対する
bigquery.tables.getData
- モデルに対する
bigquery.models.getData
bigquery.jobs.create
- テーブルに対する
始める前に
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
BigQuery, BigQuery Connection, and Vertex AI API を有効にします。
データセットを作成する
ML モデルを保存する BigQuery データセットを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
「アクションを表示」> [データセットを作成] をクリックします。
[データセットを作成する] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。
一般公開データセットは
US
マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
接続を作成する
クラウド リソース接続を作成し、接続のサービス アカウントを取得します。前の手順で作成したデータセットと同じロケーションに接続を作成します。
次のオプションのいずれかを選択します。
コンソール
[BigQuery] ページに移動します。
接続を作成するには、[
追加] をクリックし、続いて [外部データソースへの接続] をクリックします。[接続タイプ] リストで、[Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)] を選択します。
[接続 ID] フィールドに接続の名前を入力します。
[接続を作成] をクリックします。
[接続へ移動] をクリックします。
[接続情報] ペインで、次の手順で使用するサービス アカウント ID をコピーします。
bq
コマンドライン環境で接続を作成します。
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
--project_id
パラメータは、デフォルト プロジェクトをオーバーライドします。次のように置き換えます。
REGION
: 接続のリージョンPROJECT_ID
: 実際の Google Cloud プロジェクト IDCONNECTION_ID
: 接続の ID
接続リソースを作成すると、BigQuery は、一意のシステム サービス アカウントを作成し、それを接続に関連付けます。
トラブルシューティング: 次の接続エラーが発生した場合は、Google Cloud SDK を更新します。
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
後の手順で使用するため、サービス アカウント 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
main.tf
ファイルに次のセクションを追加します。
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }次のように置き換えます。
CONNECTION_ID
: 接続の IDPROJECT_ID
: 実際の Google Cloud プロジェクト IDREGION
: 接続のリージョン
サービス アカウントにアクセス権を付与する
接続の使用権限をサービス アカウントに付与します。権限を付与しないと、エラーが発生します。次のオプションのいずれかを選択します。
コンソール
[IAM と管理] ページに移動します。
[
アクセスを許可] をクリックします。[プリンシパルを追加] ダイアログが開きます。
[新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。
[ロールを選択] フィールドで、[Vertex AI] を選択し、[Vertex AI ユーザー] を選択します。
[保存] をクリックします。
gcloud
gcloud projects add-iam-policy-binding
コマンドを実行します。
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None
次のように置き換えます。
PROJECT_NUMBER
: プロジェクトの番号MEMBER
: 先ほどコピーしたサービス アカウント ID
オブジェクト テーブルを作成する
画像コンテンツを含むオブジェクト テーブルを作成します。オブジェクト テーブルを使用すると、Cloud Storage から画像を移動せずに分析できます。
モデルを作成する
Google Cloud コンソールで [BigQuery] ページに移動します。
SQL エディタを使用してリモートモデルを作成します。
CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS (ENDPOINT = 'ENDPOINT');
次のように置き換えます。
PROJECT_ID
: プロジェクト IDDATASET_ID
: モデルを格納するデータセットの IDMODEL_NAME
: モデルの名前REGION
: 接続で使用されるリージョンCONNECTION_ID
: BigQuery 接続の IDGoogle Cloud コンソールで接続の詳細を表示する場合、これは [接続 ID] に表示される完全修飾接続 ID の最後のセクションの値です。例:
projects/myproject/locations/connection_location/connections/myconnection
ENDPOINT
: 使用するエンベディング LLM。この場合はmultimodalembedding@001
です。
画像エンベディングを生成する
オブジェクト テーブルの画像データを使用して、ML.GENERATE_EMBEDDING
関数で画像エンベディングを生成します。
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, TABLE PROJECT_ID.DATASET_ID.TABLE_NAME, STRUCT(FLATTEN_JSON AS flatten_json_output) );
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET_ID
: モデルを保存するデータセットの ID。MODEL_NAME
:multimodalembedding@001
モデルのリモートモデルの名前。TABLE_NAME
: 埋め込む画像を含むオブジェクト テーブルの名前。FLATTEN_JSON
: 埋め込みを解析して別の列に変換するかどうかを示すBOOL
値。デフォルト値はTRUE
です。
例
次の例は、images
オブジェクト テーブル内に画像エンベディングを作成する方法を示しています。
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `mydataset.embedding_model`, TABLE `mydataset.images`, STRUCT(TRUE AS flatten_json_output) );