チューニングと評価を使用してモデルのパフォーマンスを改善する
このドキュメントでは、Vertex AI の gemini-1.5-flash-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-flash-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
google_bigquery_connection
リソースを使用します。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
次の例では、US
リージョンに my_cloud_resource_connection
という名前の Cloud リソース接続を作成します。
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行う必要があります。
terraform init
必要に応じて、最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行し、プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」のメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
接続のサービス アカウントにアクセス権を付与する
サービス アカウントが 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 サービス エージェントのインスタンスであるため、サービス エージェントのロールを割り当てることができます。
テストテーブルを作成する
Hugging Face の一般公開 task955_wiki_auto_style_transfer データセットに基づいて、トレーニング データと評価データのテーブルを作成します。
Cloud Shell を開きます。
Cloud Shell で次のコマンドを実行して、テストデータと評価データのテーブルを作成します。
python3 -m pip install pandas pyarrow fsspec huggingface_hub python3 -c "import pandas as pd; df_train = pd.read_parquet('hf://datasets/Lots-of-LoRAs/task955_wiki_auto_style_transfer/data/train-00000-of-00001.parquet').drop('id', axis=1); df_train['output'] = [x[0] for x in df_train['output']]; df_train.to_json('wiki_auto_style_transfer_train.jsonl', orient='records', lines=True);" python3 -c "import pandas as pd; df_valid = pd.read_parquet('hf://datasets/Lots-of-LoRAs/task955_wiki_auto_style_transfer/data/valid-00000-of-00001.parquet').drop('id', axis=1); df_valid['output'] = [x[0] for x in df_valid['output']]; df_valid.to_json('wiki_auto_style_transfer_valid.jsonl', orient='records', lines=True);" bq rm -t bqml_tutorial.wiki_auto_style_transfer_train bq rm -t bqml_tutorial.wiki_auto_style_transfer_valid bq load --source_format=NEWLINE_DELIMITED_JSON bqml_tutorial.wiki_auto_style_transfer_train wiki_auto_style_transfer_train.jsonl input:STRING,output:STRING bq load --source_format=NEWLINE_DELIMITED_JSON bqml_tutorial.wiki_auto_style_transfer_valid wiki_auto_style_transfer_valid.jsonl input:STRING,output:STRING
ベースライン モデルを作成する
Vertex AI gemini-1.0-flash-002
モデルにリモートモデルを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを実行して、リモートモデルを作成します。
CREATE OR REPLACE MODEL `bqml_tutorial.gemini_baseline` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT ='gemini-1.5-flash-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 ml_generate_text_llm_result, ground_truth FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini_baseline`, ( SELECT input AS prompt, output AS ground_truth FROM `bqml_tutorial.wiki_auto_style_transfer_valid` LIMIT 10 ), STRUCT(TRUE AS flatten_json_output));
出力データを調べて
ml_generate_text_llm_result
とground_truth
の値を比較すると、ベースライン モデルはグラウンド トゥルース コンテンツに提供された事実を正確に反映したテキストを生成していますが、テキストのスタイルはかなり異なります。
ベースライン モデルを評価する
モデルのパフォーマンスをより詳細に評価するには、ML.EVALUATE
関数を使用します。この関数は、生成されたテキストの精度と品質を測定するモデル指標を計算し、モデルのレスポンスと理想的なレスポンスの比較を確認します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.gemini_baseline`, ( SELECT input AS input_text, output AS output_text FROM `bqml_tutorial.wiki_auto_style_transfer_valid` ), STRUCT('text_generation' AS task_type));
出力は次のようになります。
+---------------------+---------------------+-------------------------------------------+--------------------------------------------+ | bleu4_score | rouge-l_precision | rouge-l_recall | rouge-l_f1_score | evaluation_status | +---------------------+---------------------+---------------------+---------------------+--------------------------------------------+ | 0.15289758194680161 | 0.24925921915413246 | 0.44622484204944518 | 0.30851122211104348 | { | | | | | | "num_successful_rows": 176, | | | | | | "num_total_rows": 176 | | | | | | } | +---------------------+---------------------+ --------------------+---------------------+--------------------------------------------+
評価指標に基づくと、ベースライン モデルのパフォーマンスは悪くありませんが、生成されたテキストと正解との類似性は低いことがわかります。これは、このユースケースのモデル パフォーマンスを改善できるかどうかを確認するために、教師ありチューニングを行う価値があることを示しています。
チューニング済みモデルの作成
モデルの作成で作成したものと非常によく似たリモートモデルを作成しますが、今回は、モデルをチューニングするトレーニング データを提供するために AS SELECT
句を指定します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを実行して、リモートモデルを作成します。
CREATE OR REPLACE MODEL `bqml_tutorial.gemini_tuned` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS ( endpoint = 'gemini-1.5-flash-002', max_iterations = 500, data_split_method = 'no_split') AS SELECT input AS prompt, output AS label FROM `bqml_tutorial.wiki_auto_style_transfer_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 ml_generate_text_llm_result, ground_truth FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini_tuned`, ( SELECT input AS prompt, output AS ground_truth FROM `bqml_tutorial.wiki_auto_style_transfer_valid` LIMIT 10 ), STRUCT(TRUE AS flatten_json_output));
出力データを調べると、チューニング済みモデルは、グラウンド トゥルース コンテンツのスタイルに非常に近いテキストを生成していることがわかります。
チューニング済みモデルを評価する
ML.EVALUATE
関数を使用して、チューニング済みモデルのレスポンスと理想的なレスポンスの比較を確認します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.gemini_tuned`, ( SELECT input AS prompt, output AS label FROM `bqml_tutorial.wiki_auto_style_transfer_valid` ), STRUCT('text_generation' AS task_type));
出力は次のようになります。
+---------------------+---------------------+-------------------------------------------+--------------------------------------------+ | bleu4_score | rouge-l_precision | rouge-l_recall | rouge-l_f1_score | evaluation_status | +---------------------+---------------------+---------------------+---------------------+--------------------------------------------+ | 0.19391708685890585 | 0.34170970869469058 | 0.46793189219384496 | 0.368190192211538 | { | | | | | | "num_successful_rows": 176, | | | | | | "num_total_rows": 176 | | | | | | } | +---------------------+---------------------+ --------------------+---------------------+--------------------------------------------+
トレーニング データセットで使用された例は 1,408 個のみですが、評価指標が高いことから、パフォーマンスが大幅に向上していることがわかります。
クリーンアップ
- 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.