チューニングと評価を使用してモデルのパフォーマンスを改善する
このドキュメントでは、Vertex AI の gemini-1.0-pro-002
モデルを参照する BigQuery ML リモートモデルを作成する方法について説明します。次に、教師ありチューニングを使用して新しいトレーニング データでモデルを調整してから、ML.EVALUATE
関数でモデルを評価します。
これにより、ホストされた Vertex AI モデルをカスタマイズする必要があるシナリオ(モデルの想定される動作をプロンプトで簡潔に定義できない場合や、プロンプトで想定される結果が一貫して得られない場合など)に対処できます。教師ありチューニングは、モデルにも次のような影響を与えます。
- モデルが特定のレスポンスの種類(簡潔なレスポンスや詳細なレスポンスなど)を返すようにガイドします。
- モデルに新しい動作を教えます(特定のペルソナとしてプロンプトに応答するなど)。
- モデルが新しい情報で更新されるようにします。
必要な権限
接続を作成するには、次の 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
- テーブルに対する
始める前に
-
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, Vertex AI, and Compute Engine APIs.
費用
このドキュメントでは、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 processing that you perform in BigQuery ML.
- Vertex AI: You incur costs for calls to and
supervised tuning of the
gemini-1.0-pro-002
model.
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
詳しくは、次のリソースをご覧ください。
データセットを作成する
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
: 接続のリージョン
接続のサービス アカウントにアクセス権を付与する
サービス アカウントが Vertex AI にアクセスできるよう、サービス アカウントに Vertex AI サービス エージェント ロールを付与します。このロールを付与しないと、エラーが発生します。次のオプションのいずれかを選択します。
コンソール
[IAM と管理] ページに移動します。
[
アクセスを許可] をクリックします。[プリンシパルを追加] ダイアログが開きます。
[新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。
[ロールを選択] をクリックします。
[フィルタ] に「
Vertex AI Service Agent
」と入力して、そのロールを選択します。[保存] をクリックします。
gcloud
gcloud projects add-iam-policy-binding
コマンドを実行します。
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.serviceAgent' --condition=None
次のように置き換えます。
PROJECT_NUMBER
: プロジェクトの番号MEMBER
: 先ほどコピーしたサービス アカウント ID
接続に関連付けられたサービス アカウントは BigQuery Connection Delegation サービス エージェントのインスタンスであるため、サービス エージェントのロールを割り当てることができます。
Compute Engine のデフォルト サービス アカウントにアクセス権を付与する
Compute Engine API を有効にすると、Compute Engine のデフォルト サービス アカウントにプロジェクトの編集者ロールが自動的に付与されます。ただし、プロジェクトでこの動作を無効にしている場合は除きます。その場合は、Compute Engine のデフォルト サービス アカウントに編集者ロールを再度付与して、リモートモデルを作成してチューニングするための十分な権限を付与する必要があります。
コンソール
[IAM と管理] ページに移動します。
[
アクセス権を付与] をクリックします。[新しいプリンシパル] に、サービス アカウント ID(
PROJECT_NUMBER-compute@developer.gserviceaccount.com
)を入力します。[ロールを選択] をクリックします。
[ロールを選択] で [基本] を選択し、[編集者] を選択します。
[保存] をクリックします。
gcloud
gcloud projects add-iam-policy-binding
コマンドを実行します。
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/editor' --condition=None
次のように置き換えます。
PROJECT_NUMBER
: プロジェクトの番号。MEMBER
: サービス アカウント ID(PROJECT_NUMBER-compute@developer.gserviceaccount.com
)。
チューニング サービス エージェントを作成する
Vertex AI Secure ファイン チューニング サービス エージェントのインスタンスを作成します。
gcloud beta services identity create
コマンドを使用して、チューニング サービス エージェントを作成します。gcloud beta services identity create --service=aiplatform.googleapis.com --project=PROJECT_NUMBER
PROJECT_NUMBER
は、使用するプロジェクト番号に置き換えます。gcloud projects add-iam-policy-binding
コマンドを使用して、チューニング サービス エージェントに Vertex AI チューニング サービス エージェント(roles/aiplatform.tuningServiceAgent
)ロールを付与します。gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:service-PROJECT_NUMBER@gcp-sa-vertex-tune.iam.gserviceaccount.com' --role='roles/aiplatform.tuningServiceAgent'
PROJECT_NUMBER
は、使用するプロジェクト番号に置き換えます。
テストテーブルを作成する
音声文字変換された医療レポートである一般公開 MTSamples データセットに基づいて、トレーニング データと評価データのテーブルを作成します。このデータセットには、医療記録が含まれる input_text
列と、音声文字変換のカテゴリを最もよく表すラベル(Allergy/Immunology
、Dentistry
、Cardiovascular/Pulmonary
など)が含まれる output_text
列があります。また、医療関係の音声文字変換の分類用プロンプト データを含むテーブルを作成します。
一般公開された Cloud Storage バケットから医療関係の音声文字変換データをインポートします。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを実行して、評価データのテーブルを作成します。
LOAD DATA INTO `bqml_tutorial.medical_transcript_eval` FROM FILES(format='NEWLINE_DELIMITED_JSON', uris = ['gs://cloud-samples-data/vertex-ai/model-evaluation/peft_eval_sample.jsonl']);
クエリエディタで次のステートメントを実行して、トレーニング データのテーブルを作成します。
LOAD DATA INTO `bqml_tutorial.medical_transcript_train` FROM FILES(format='NEWLINE_DELIMITED_JSON', uris = ['gs://cloud-samples-data/vertex-ai/model-evaluation/peft_train_sample.jsonl']);
クエリエディタで次のステートメントを実行して、プロンプト テーブルを作成します。
CREATE OR REPLACE TABLE `bqml_tutorial.transcript_classification` AS (SELECT 'Please assign a label for the given medical transcript from among these labels [Allergy / Immunology, Autopsy, Bariatrics, Cardiovascular / Pulmonary, Chiropractic, Consult - History and Phy., Cosmetic / Plastic Surgery, Dentistry, Dermatology, Diets and Nutritions, Discharge Summary, ENT - Otolaryngology, Emergency Room Reports, Endocrinology, Gastroenterology, General Medicine, Hematology - Oncology, Hospice - Palliative Care, IME-QME-Work Comp etc., Lab Medicine - Pathology, Letters, Nephrology, Neurology, Neurosurgery, Obstetrics / Gynecology, Office Notes, Ophthalmology, Orthopedic, Pain Management, Pediatrics - Neonatal, Physical Medicine - Rehab, Podiatry, Psychiatry / Psychology, Radiology, Rheumatology, SOAP / Chart / Progress Notes, Sleep Medicine, Speech - Language, Surgery, Urology].' AS prompt);
ベースライン モデルを作成する
Vertex AI gemini-1.0-pro-002
モデルにリモートモデルを作成します。このモデルは、医療関係の音声文字変換の分類に使用できます。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを実行して、リモートモデルを作成します。
CREATE OR REPLACE MODEL `bqml_tutorial.gemini-baseline` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT ='gemini-1.0-pro-002');
次のように置き換えます。
LOCATION
: 接続のロケーション。CONNECTION_ID
: BigQuery 接続の ID。Google Cloud コンソールで接続の詳細を表示する場合、
CONNECTION_ID
は、[接続 ID] に表示される完全修飾接続 ID の最後のセクションの値になります(例:projects/myproject/locations/connection_location/connections/myconnection
)。
クエリが完了するまでに数秒かかります。完了後、
gemini-baseline
モデルが [エクスプローラ] ペインのbqml_tutorial
データセットに表示されます。このクエリではCREATE MODEL
ステートメントを使用してモデルを作成するため、クエリの結果はありません。
ベースライン モデルのパフォーマンスを確認する
リモートモデルで ML.GENERATE_TEXT
関数を実行し、チューニングされていない評価データでどのように動作するかを確認します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
SELECT * FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini-baseline`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT(TRUE AS flatten_json_output)) ORDER BY ml_generate_text_llm_result;
出力データを調べて
ml_generate_text_llm_result
とlabel
の値を比較すると、ベースライン モデルは多くの音声文字変換の分類を正しく予測していますが、一部の音声文字変換を誤って分類していることがわかります。以下は、誤った出力の代表的な例です。この例では、正しい分類はAutopsy
であり、Pulmonary Embolism
ではありません。+------------------------------------+---------------------------------+-------------------------------------------------------------------------+--------------+ | ml_generate_text_llm_result | ml_generate_text_rai_result | ml_generate_text_status | prompt | label | +------------------------------------+---------------------------------+-------------------------------------------------------------------------+--------------+ | ## Label:Pulmonary Embolism | [{"category":1,"probability":1 | | Please assign a label for the given medical | Autopsy | | | ,"probability_score":0.19433 | | transcript from among these labels [Allergy / | | | | "594,"severity":2,... | | Immunology, Autopsy, Bariatrics, | | | | | | Cardiovascular / Pulmonary, Chiropractic, | | | | | | Consult - History and Phy., Cosmetic / | | | | | | Plastic Surgery, Dentistry, Dermatology, | | | | | | Diets and Nutritions, Discharge Summary, ENT | | | | | | - Otolaryngology, Emergency Room Reports, | | | | | | Endocrinology, Gastroenterology, General | | | | | | Medicine, Hematology - Oncology, Hospice - | | | | | | Palliative Care, IME-QME-Work Comp etc., | | | | | | Lab Medicine - Pathology, Letters, | | | | | | Nephrology, Neurology, Neurosurgery, | | | | | | Obstetrics / Gynecology, Office Notes, | | | | | | Ophthalmology, Orthopedic, Pain Management, | | | | | | Pediatrics - Neonatal, Physical Medicine - | | | | | | Rehab, Podiatry, Psychiatry / Psychology, | | | | | | Radiology, Rheumatology, SOAP / Chart / | | | | | | Progress Notes, Sleep Medicine, Speech - | | | | | | Language, Surgery, Urology]. | | | | | | TRANSCRIPT: | | | | | | SUMMARY OF CLINICAL HISTORY:, | | | | | | OF The patient was a 35-year-old | | | | | | African-American male with no | | | | | | significant past medical history | | | | | | a who called EMS with shortness of breath | | | | | | had and chest pain. Upon EMS | | | | | | arrival, patient was... | | +------------------------------------+---------------------------------+-------------------------------------------------------------------------+--------------+
ベースライン モデルを評価する
モデルのパフォーマンスをより詳細に評価するには、ML.EVALUATE
関数を使用します。この関数は、モデルのレスポンスと理想的なレスポンスとの比較を確認するために、適合率、再現率、F1 スコアなどのモデル指標を計算します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.gemini-baseline`, ( SELECT CONCAT( (SELECT prompt FROM `bqml_tutorial.transcript_classification`), ' ', input_text) AS input_text, output_text FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT('classification' AS task_type)) ORDER BY label;
出力は次のようになります。
+------------------------------+----------------------------------+-------------------------------------------------------------------------+ | precision | recall | f1_score | label | evaluation_status | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+ | 0.0 | 0.0 | 0.0 | Allergy / Immunology | { | | | | | | "num_successful_rows": 474, | | | | | | "num_total_rows": 492 | | | | | | } | +---------------------+---------------------+ --------------------+----------------------------+--------------------------------------------+ | 0.0 | 0.0 | 0.0 | Autopsy | { | | | | | | "num_successful_rows": 474, | | | | | | "num_total_rows": 492 | | | | | | } | +---------------------+---------------------+--------------- -----+----------------------------+--------------------------------------------+ | 0.0 | 0.0 | 0.0 | Bariatrics | { | | | | | | "num_successful_rows": 474, | | | | | | "num_total_rows": 492 | | | | | | } | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+
ベースライン モデルは、f1
スコアが低いことから、このデータに対して良好に機能していないことを確認できます。これは、このユースケースのモデル パフォーマンスを改善できるかどうかを確認するために、教師ありチューニングを行う価値があることを示しています。
チューニング済みモデルの作成
モデルの作成で作成したものと非常によく似たリモートモデルを作成しますが、今回は、モデルをチューニングするトレーニング データを提供するために AS SELECT
句を指定します。このクエリの完了には数時間かかることがあります。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを実行して、リモートモデルを作成します。
CREATE OR REPLACE MODEL `bqml_tutorial.gemini-tuned` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS ( endpoint = 'gemini-1.0-pro-002', max_iterations = 300, data_split_method = 'no_split') AS SELECT CONCAT( (SELECT prompt FROM `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_train`;
次のように置き換えます。
LOCATION
: 接続のロケーション。CONNECTION_ID
: BigQuery 接続の ID。Google Cloud コンソールで接続の詳細を表示する場合、
CONNECTION_ID
は、[接続 ID] に表示される完全修飾接続 ID の最後のセクションの値になります(例:projects/myproject/locations/connection_location/connections/myconnection
)。
クエリが完了するまでに数時間かかることがあります。完了後、
gemini-tuned
モデルが [エクスプローラ] ペインのbqml_tutorial
データセットに表示されます。このクエリではCREATE MODEL
ステートメントを使用してモデルを作成するため、クエリの結果はありません。
チューニング済みモデルのパフォーマンスを確認する
ML.GENERATE_TEXT
関数を実行して、評価データに対するチューニング済みモデルのパフォーマンスを確認します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
SELECT * FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini-tuned`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT(TRUE AS flatten_json_output)) ORDER BY ml_generate_text_llm_result;
出力データを調べると、チューニング済みモデルがより多くの音声文字変換を正しく分類していることがわかります。先ほど見た例は、
Cardiovascular/ Pulmonary
として正しく分類されました。+-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | ml_generate_text_llm_result | ml_generate_text_rai_result | ml_generate_text_status | prompt | label | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | Autopsy | [{"category":1,"probability":1 | | Please assign a label for the given medical | Autopsy | | | ,"probability_score":0.19335938 | | transcript from among these labels [Allergy / | | | | ,"severity":2,"severity_scor... | | Immunology, Autopsy, Bariatrics, | | | | | | Cardiovascular / Pulmonary, Chiropractic, | | | | | | Consult - History and Phy., Cosmetic / | | | | | | Plastic Surgery, Dentistry, Dermatology, | | | | | | Diets and Nutritions, Discharge Summary, ENT | | | | | | - Otolaryngology, Emergency Room Reports, | | | | | | Endocrinology, Gastroenterology, General | | | | | | Medicine, Hematology - Oncology, Hospice - | | | | | | Palliative Care, IME-QME-Work Comp etc., | | | | | | Lab Medicine - Pathology, Letters, | | | | | | Nephrology, Neurology, Neurosurgery, | | | | | | Obstetrics / Gynecology, Office Notes, | | | | | | Ophthalmology, Orthopedic, Pain Management, | | | | | | Pediatrics - Neonatal, Physical Medicine - | | | | | | Rehab, Podiatry, Psychiatry / Psychology, | | | | | | Radiology, Rheumatology, SOAP / Chart / | | | | | | Progress Notes, Sleep Medicine, Speech - | | | | | | Language, Surgery, Urology]. | | | | | | TRANSCRIPT: | | | | | | SUMMARY OF CLINICAL HISTORY:, | | | | | | The patient was a 35-year-old | | | | | | African-American male with no | | | | | | significant past medical history | | | | | | a who called EMS with shortness of breath | | | | | | had and chest pain. Upon EMS | | | | | | arrival, patient was... | | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+
チューニング済みモデルを評価する
ML.EVALUATE
関数を使用して、チューニング済みモデルのレスポンスと理想的なレスポンスの比較を確認します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.gemini-tuned`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT('classification' AS task_type)) ORDER BY label;
出力は次のようになります。
+------------------------------+----------------------------------+-------------------------------------------------------------------------+ | precision | recall | f1_score | label | evaluation_status | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+ | 0.5 | 0.66666666666666663 | 0.5714285714285714 | Allergy/Immunology | { | | | | | | "num_successful_rows": 439, | | | | | | "num_total_rows": 492 | | | | | | } | +---------------------+---------------------+ --------------------+----------------------------+--------------------------------------------+ | 1.0 | 1.0 | 1.0 | Autopsy | { | | | | | | "num_successful_rows": 439, | | | | | | "num_total_rows": 492 | | | | | | } | +---------------------+---------------------+--------------- -----+----------------------------+--------------------------------------------+ | 0.5 | 1.0 | 0.66666666666666663 | Bariatrics | { | | | | | | "num_successful_rows": 439, | | | | | | "num_total_rows": 492 | | | | | | } | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+
トレーニング データセットで使用された例は 519 個のみですが、f1
スコアが高いことから、パフォーマンスが大幅に向上していることがわかります。
クリーンアップ
- 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.