Gemini モデルで継続的チューニングを使用する

継続的なチューニングでは、エポックやトレーニング例を追加して、チューニング済みのモデルまたはモデル チェックポイントのチューニングを継続できます。すでにチューニングされたモデルまたはチェックポイントをベースモデルとして使用すると、チューニング テストをより効率的に行えます。

継続的なチューニングは、次の目的で使用できます。

  • 既存のチューニング済みモデルが過小適合している場合に、より多くのデータでチューニングするため。
  • パフォーマンスを向上させる、または新しいデータでモデルを最新の状態に保つため。
  • 既存のチューニング済みモデルをさらにカスタマイズするため。

継続的なチューニングは、次の Gemini モデルでサポートされています。

Gemini モデル バージョンの詳細については、Google モデルモデルのバージョンとライフサイクルをご覧ください。

継続的なチューニングを構成する

継続的なチューニング ジョブを作成する際は、次の点に注意してください。

  • 継続的なチューニングは Google Gen AI SDK でサポートされています。Vertex AI SDK for Python ではサポートされていません。
  • モデルリソース名を指定する必要があります。

    • Google Cloud コンソールでは、モデルリソース名は [Vertex AI チューニング] ページの [チューニングの詳細] > [モデル名] フィールドに表示されます。
    • モデルリソース名には次の形式を使用します。
    projects/{project}/locations/{location}/models/{modelId}@{version_id}
    
    • {version_id} は省略可能で、生成されたバージョン ID またはユーザーが指定したバージョン エイリアスのいずれかになります。省略すると、デフォルトのバージョンが使用されます。
  • モデルのバージョンを指定しない場合は、デフォルトのバージョンが使用されます。

  • チェックポイントをベースモデルとして使用し、チェックポイント ID を指定しない場合は、デフォルトのチェックポイントが使用されます。詳細については、Gemini モデルの教師ありファインチューニングでチェックポイントを使用するをご覧ください。 Google Cloud コンソールで、デフォルトのチェックポイントは次のように確認できます。

    1. [Model Registry] ページに移動します。
    2. モデルの [モデル名] をクリックします。
    3. [すべてのバージョンを表示] をクリックします。
    4. 目的のバージョンをクリックして、チェックポイントのリストを表示します。デフォルトのチェックポイントは、チェックポイント ID の横に default という単語で示されます。
  • デフォルトでは、新しいモデル バージョンは、事前チューニング済みモデルと同じ親モデルの下に作成されます。新しいチューニング済みモデルの表示名を指定すると、新しいモデルが作成されます。

  • 継続的なチューニングのベースモデルとして使用できるのは、2025 年 7 月 11 日以降にチューニングされた教師ありチューニング ベースモデルのみです。

  • 顧客管理の暗号鍵(CMEK)を使用している場合、継続的なチューニング ジョブでは、事前チューニングされたモデルのチューニング ジョブで使用されたものと同じ CMEK を使用する必要があります。

コンソール

Google Cloud コンソールを使用して事前チューニング済みモデルの継続的なチューニングを構成する手順は次のとおりです。

  1. Google Cloud コンソールの [Vertex AI] セクションで、[Vertex AI Studio] ページに移動します。

    [Vertex AI Studio] に移動

  2. [チューニング済みモデルを作成] をクリックします。

  3. [モデルの詳細] で、次のように構成します。

    1. [事前チューニング済みモデルをチューニングする] を選択します。
    2. [事前チューニング済みモデル] フィールドで、事前チューニング済みモデルの名前を選択します。
    3. モデルに 1 つ以上のチェックポイントがある場合は、[チェックポイント] プルダウン フィールドが表示されます。目的のチェックポイントを選択します。
  4. [続行] をクリックします。

REST

継続的なチューニングを構成するには、tuningJobs.create メソッドを使用して POST リクエストを送信します。一部のパラメータは、すべてのモデルでサポートされているわけではありません。チューニングするモデルに適用可能なパラメータのみを含めるようにしてください。

リクエストのデータを使用する前に、次のように置き換えます。

HTTP メソッドと URL:

POST https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs

リクエストの本文(JSON):

{
  "preTunedModel": {
      "tunedModelName": "TUNED_MODEL_NAME",
      "checkpointId": "CHECKPOINT_ID",
  },
  "supervisedTuningSpec" : {
      "trainingDatasetUri": "TRAINING_DATASET_URI",
      "validationDatasetUri": "VALIDATION_DATASET_URI",
      "hyperParameters": {
          "epochCount": EPOCH_COUNT,
          "adapterSize": "ADAPTER_SIZE",
          "learningRateMultiplier": "LEARNING_RATE_MULTIPLIER"
      },
      "exportLastCheckpointOnly": EXPORT_LAST_CHECKPOINT_ONLY,
      "evaluationConfig": {
          "metrics": [
              {
                  "aggregation_metrics": ["AVERAGE", "STANDARD_DEVIATION"],
                  "METRIC_SPEC": {
                      "METRIC_SPEC_FIELD_NAME":
                          METRIC_SPEC_FIELD_CONTENT
                  }
              },
          ],
          "outputConfig": {
              "gcs_destination": {
                  "output_uri_prefix": "CLOUD_STORAGE_BUCKET"
              }
          },
      },
  },
  "tunedModelDisplayName": "TUNED_MODEL_DISPLAYNAME",
  "encryptionSpec": {
    "kmsKeyName": "KMS_KEY_NAME"
  },
  "serviceAccount": "SERVICE_ACCOUNT"
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

curl コマンドの例

PROJECT_ID=myproject
LOCATION=global
curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
"https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/tuningJobs" \
-d \
$'{
   "preTunedModel": "gemini-2.5-flash",
   "supervisedTuningSpec" : {
      "trainingDatasetUri": "gs://cloud-samples-data/ai-platform/generative_ai/gemini/text/sft_train_data.jsonl",
      "validationDatasetUri": "gs://cloud-samples-data/ai-platform/generative_ai/gemini/text/sft_validation_data.jsonl"
   },
   "tunedModelDisplayName": "tuned_gemini"
}'

Google Gen AI SDK

次の例では、Google Gen AI SDK を使用して継続的なチューニングを構成する方法を示します。

import time

from google import genai
from google.genai.types import HttpOptions, TuningDataset, CreateTuningJobConfig

# TODO(developer): Update and un-comment below line
# tuned_model_name = "projects/123456789012/locations/us-central1/models/1234567890@1"
# checkpoint_id = "1"

client = genai.Client(http_options=HttpOptions(api_version="v1beta1"))

training_dataset = TuningDataset(
    gcs_uri="gs://cloud-samples-data/ai-platform/generative_ai/gemini/text/sft_train_data.jsonl",
)
validation_dataset = TuningDataset(
    gcs_uri="gs://cloud-samples-data/ai-platform/generative_ai/gemini/text/sft_validation_data.jsonl",
)

tuning_job = client.tunings.tune(
    base_model=tuned_model_name,  # Note: Using a Tuned Model
    training_dataset=training_dataset,
    config=CreateTuningJobConfig(
        tuned_model_display_name="Example tuning job",
        validation_dataset=validation_dataset,
        pre_tuned_model_checkpoint_id=checkpoint_id,
    ),
)

running_states = set([
    "JOB_STATE_PENDING",
    "JOB_STATE_RUNNING",
])

while tuning_job.state in running_states:
    print(tuning_job.state)
    tuning_job = client.tunings.get(name=tuning_job.name)
    time.sleep(60)

print(tuning_job.tuned_model.model)
print(tuning_job.tuned_model.endpoint)
print(tuning_job.experiment)
# Example response:
# projects/123456789012/locations/us-central1/models/1234567890@2
# projects/123456789012/locations/us-central1/endpoints/123456789012345
# projects/123456789012/locations/us-central1/metadataStores/default/contexts/tuning-experiment-2025010112345678

if tuning_job.tuned_model.checkpoints:
    for i, checkpoint in enumerate(tuning_job.tuned_model.checkpoints):
        print(f"Checkpoint {i + 1}: ", checkpoint)
    # Example response:
    # Checkpoint 1:  checkpoint_id='1' epoch=1 step=10 endpoint='projects/123456789012/locations/us-central1/endpoints/123456789000000'
    # Checkpoint 2:  checkpoint_id='2' epoch=2 step=20 endpoint='projects/123456789012/locations/us-central1/endpoints/123456789012345'