为 Gemini 模型使用持续调优

通过持续调优,您可以添加更多周期或训练示例,继续调优已调优的模型或模型检查点。使用已调优的模型或检查点作为基础模型,可以更高效地进行调优实验。

您可以出于以下目的使用持续调优:

  • 如果现有调优模型出现欠拟合,则使用更多数据进行调优。
  • 为了提升性能或使模型能够根据新数据及时更新。
  • 进一步自定义现有的调优模型。

以下 Gemini 模型支持持续调优:

如需详细了解 Gemini 模型版本,请参阅 Google 模型以及模型版本和生命周期

配置持续调优

创建持续调优作业时,请注意以下事项:

  • Google Gen AI SDK 支持持续调优。Vertex AI SDK for Python 不支持此功能。
  • 您必须提供模型资源名称:

    • 在 Google Cloud 控制台中,模型资源名称会显示在 Vertex AI Tuning 页面中的调优详细信息 > 模型名称字段中。
    • 模型资源名称采用以下格式:
    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. 如果模型至少有一个检查点,系统会显示检查点下拉字段。选择所需的检查点。
  4. 点击继续

REST

如需配置持续调优,请使用 tuningJobs.create 方法发送 POST 请求。某些参数只受部分模型支持。确保仅包含您要调优的模型的适用参数。

在使用任何请求数据之前,请先进行以下替换:

  • 持续调优的参数:
    • TUNED_MODEL_NAME:要使用的调优模型的名称。
    • CHECKPOINT_ID(可选):要使用的检查点的 ID。
  • 其余参数与监督式微调偏好调优相同。

HTTP 方法和网址:

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'