Gemini ビジョンモデルを使用して画像を分析する
このチュートリアルでは、Vertex AI gemini-1.0-pro-vision
モデルに基づいて BigQuery ML リモートモデルを作成する方法を説明します。このモデルを ML.GENERATE_TEXT
関数と組み合わせて使用し、映画のポスター画像を分析します。
このチュートリアルでは、次のタスクについて説明します。
- Cloud Storage バケット内の画像データに対して BigQuery オブジェクト テーブルを作成する。
- Vertex AI
gemini-1.0-pro-vision
モデル(プレビュー)をターゲットとする BigQuery ML リモートモデルを作成する。 ML.GENERATE_TEXT
関数でリモートモデルを使用して、一連の映画ポスターに関連付けられた映画を特定する。
映画のポスターデータは、公開の Cloud Storage バケット gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters
から入手できます。
必要なロール
接続を作成するには、BigQuery 接続管理者(
roles/bigquery.connectionAdmin
)のロールが必要です。接続のサービス アカウントに権限を付与するには、プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
)のロールが必要です。データセット、モデル、テーブルを作成するには、BigQuery データ編集者(
roles/bigquery.dataEditor
)のロールが必要です。BigQuery ジョブを実行するには、BigQuery ユーザー(
roles/bigquery.user
)ロールが必要です。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- BigQuery ML: You incur costs for the data that you process in BigQuery.
- Vertex AI: You incur costs for calls to the Vertex AI model that is represented by the BigQuery remote model.
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
BigQuery の料金の詳細については、BigQuery ドキュメントの BigQuery の料金をご覧ください。
Vertex AI の生成 AI の料金の詳細については、Vertex AI の料金のページをご覧ください。
始める前に
-
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.
データセットを作成する
ML モデルを保存する BigQuery データセットを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
「アクションを表示」> [データセットを作成] をクリックします。
[データセットを作成する] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。
一般公開データセットは
US
マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
接続を作成する
クラウド リソース接続を作成し、接続のサービス アカウントを取得します。
コンソール
[BigQuery] ページに移動します。
接続を作成するには、[
追加] をクリックし、続いて [外部データソースへの接続] をクリックします。[接続タイプ] リストで、[Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)] を選択します。
[接続 ID] フィールドに「
tutorial
」と入力します。[接続を作成] をクリックします。
[接続へ移動] をクリックします。
後で使用するサービス アカウント ID を [接続情報] ペインからコピーします。
bq
コマンドライン環境で接続を作成します。
bq mk --connection --location=us --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE tutorial
--project_id
パラメータは、デフォルト プロジェクトをオーバーライドします。PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。接続リソースを作成すると、BigQuery は、一意のシステム サービス アカウントを作成し、それを接続に関連付けます。
トラブルシューティング: 次の接続エラーが発生した場合は、Google Cloud SDK を更新します。
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
後の手順で使用するため、サービス アカウント ID を取得してコピーします。
bq show --connection PROJECT_ID.us.tutorial
出力は次のようになります。
name properties 1234.us.tutorial {"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 = "tutorial" project = "PROJECT_ID" location = "us" cloud_resource {} }
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。
接続のサービス アカウントに権限を付与する
Cloud Storage サービスと Vertex AI サービスにアクセスするために、接続のサービス アカウントに適切なロールを付与します。これらのロールは、始める前にで作成または選択したプロジェクトで付与する必要があります。別のプロジェクトでロールを付与すると、bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource
エラーが発生します。
適切なロールを付与する手順は次のとおりです。
[IAM と管理] ページに移動します。
[
アクセス権を付与] をクリックします。[新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。
[ロールを選択] フィールドで、[Vertex AI]、[Vertex AI ユーザー] の順に選択します。
[別のロールを追加] をクリックします。
[ロールを選択] フィールドで、[Cloud Storage] を選択し、続いて [Storage オブジェクト閲覧者] を選択します。
[保存] をクリックします。
オブジェクト テーブルを作成する
公開 Cloud Storage バケットにある映画のポスター画像に対してオブジェクト テーブルを作成します。オブジェクト テーブルを使用すると、Cloud Storage から画像を移動せずに分析できます。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のクエリを実行してオブジェクト テーブルを作成します。
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.movie_posters` WITH CONNECTION `us.tutorial` OPTIONS ( object_metadata = 'SIMPLE', uris = ['gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters/*']);
リモートモデルを作成する
Vertex AI gemini-1.0-pro-vision
モデルを表すリモートモデルを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のクエリを実行してリモートモデルを作成します。
CREATE OR REPLACE MODEL `bqml_tutorial.gemini-pro-vision` REMOTE WITH CONNECTION `us.tutorial` OPTIONS (ENDPOINT = 'gemini-pro-vision');
クエリが完了するまでに数秒かかります。完了後、
gemini-pro-vision
モデルが [エクスプローラ] ペインのbqml_tutorial
データセットに表示されます。クエリはCREATE MODEL
ステートメントを使用してモデルを作成するため、クエリの結果はありません。
映画のポスターを分析する
リモートモデルを使用して映画のポスターを分析し、各ポスターが表す映画を特定してから、そのデータをテーブルに書き込みます。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のクエリを実行して、映画のポスター画像を分析します。
CREATE OR REPLACE TABLE `bqml_tutorial.movie_posters_results` AS ( SELECT uri, ml_generate_text_llm_result FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini-pro-vision`, TABLE `bqml_tutorial.movie_posters`, STRUCT( 0.2 AS temperature, 'For the movie represented by this poster, what is the movie title and year of release? Answer in JSON format with two keys: title, year. title should be string, year should be integer.' AS PROMPT, TRUE AS FLATTEN_JSON_OUTPUT)));
クエリエディタで、次のステートメントを実行してテーブルデータを表示します。
SELECT * FROM `bqml_tutorial.movie_posters_results`;
出力は次のようになります。
+--------------------------------------------+----------------------------------+ | uri | ml_generate_text_llm_result | +--------------------------------------------+----------------------------------+ | gs://cloud-samples-data/vertex-ai/dataset- | ```json | | management/datasets/classic-movie- | { | | posters/little_annie_rooney.jpg | "title": "Little Annie Rooney", | | | "year": 1912 | | | } | | | ``` | +--------------------------------------------+----------------------------------+ | gs://cloud-samples-data/vertex-ai/dataset- | ```json | | management/datasets/classic-movie- | { | | posters/mighty_like_a_mouse.jpg | "title": "Mighty Like a Moose", | | | "year": 1926 | | | } | | | ``` | +--------------------------------------------+----------------------------------+ | gs://cloud-samples-data/vertex-ai/dataset- | ```json | | management/datasets/classic-movie- | { | | posters/brown_of_harvard.jpeg | "title": "Brown of Harvard", | | | "year": 1926 | | | } | | | ``` | +--------------------------------------------+----------------------------------+
モデルの出力をフォーマットする
モデルから返された映画分析データをフォーマットして、映画のタイトルと公開年を読みやすくします。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のクエリを実行してデータをフォーマットします。
CREATE OR REPLACE TABLE `bqml_tutorial.movie_posters_results_formatted` AS ( SELECT uri, JSON_QUERY(RTRIM(LTRIM(results.ml_generate_text_llm_result, " ```json"), "```"), "$.title") AS title, JSON_QUERY(RTRIM(LTRIM(results.ml_generate_text_llm_result, " ```json"), "```"), "$.year") AS year FROM `bqml_tutorial.movie_posters_results` results );
クエリエディタで、次のステートメントを実行してテーブルデータを表示します。
SELECT * FROM `bqml_tutorial.movie_posters_results_formatted`;
出力は次のようになります。
+--------------------------------------------+----------------------------+------+ | uri | title | year | +--------------------------------------------+----------------------------+------+ | gs://cloud-samples-data/vertex-ai/dataset- | "Barque sortant du port" | 1895 | | management/datasets/classic-movie- | | | | posters/barque_sortant_du_port.jpeg | | | +--------------------------------------------+----------------------------+------+ | gs://cloud-samples-data/vertex-ai/dataset- | "The Great Train Robbery" | 1903 | | management/datasets/classic-movie- | | | | posters/the_great_train_robbery.jpg | | | +--------------------------------------------+----------------------------+------+ | gs://cloud-samples-data/vertex-ai/dataset- | "Little Annie Rooney" | 1912 | | management/datasets/classic-movie- | | | | posters/little_annie_rooney.jpg | | | +--------------------------------------------+----------------------------+------+
クリーンアップ
- 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.