使用监督式微调来调优 Gemini 模型

本文档介绍如何使用监督式微调来调优 Gemini 模型。

准备工作

在开始之前,您必须准备好监督式微调数据集。具体要求因您的使用场景而异。

支持的模型

  • gemini-1.5-pro-002(正式版)
  • gemini-1.5-flash-002(正式版)
  • gemini-1.0-pro-002(处于预览版阶段,仅支持文本调优)

创建调优作业

您可以使用 REST API、Vertex AI SDK for Python、Google Cloud 控制台或 Colab Enterprise 创建监督式微调作业。

REST

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

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

  • PROJECT_ID:您的项目 ID
  • TUNING_JOB_REGION:运行调优作业的区域。这也是上传调优后模型的默认区域。
  • BASE_MODEL:要调整的基础模型的名称。支持的值:gemini-1.5-pro-002gemini-1.5-flash-002gemini-1.0-pro-002
  • TRAINING_DATASET_URI:训练数据集的 Cloud Storage URI。数据集必须采用 JSONL 文件格式。为获得最佳效果,请提供至少 100 到 500 个样本。如需了解详情,请参阅监督式调优数据集简介
  • VALIDATION_DATASET_URI可选:验证数据集文件的 Cloud Storage URI。
  • EPOCH_COUNT可选:在训练期间,模型完整通过整个训练数据集的次数。如果不设置,则使用预先填充的建议值
  • ADAPTER_SIZE可选:用于调优作业的适配器大小。 适配器大小会影响调优作业的可训练参数数量。适配器越大,意味着模型可以学习更复杂的任务,但需要更大的训练数据集和更长的训练时间。
  • LEARNING_RATE_MULTIPLIER:可选:要应用于建议的学习速率的调节系数。如果不设置,则使用建议的值
  • TUNED_MODEL_DISPLAYNAME可选:调优后模型的显示名称。如果未设置,则会生成随机名称。

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "baseModel": "BASE_MODEL",
  "supervisedTuningSpec" : {
      "trainingDatasetUri": "TRAINING_DATASET_URI",
      "validationDatasetUri": "VALIDATION_DATASET_URI",
      "hyperParameters": {
          "epochCount": EPOCH_COUNT,
          "adapterSize": "ADAPTER_SIZE",
          "learningRateMultiplier": LEARNING_RATE_MULTIPLIER
      },
  },
  "tunedModelDisplayName": "TUNED_MODEL_DISPLAYNAME"
}

如需发送请求,请选择以下方式之一:

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=us-central1
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 \
$'{
   "baseModel": "gemini-1.5-pro-002",
   "supervisedTuningSpec" : {
      "training_dataset_uri": "gs://cloud-samples-data/ai-platform/generative_ai/sft_train_data.jsonl",
      "validation_dataset_uri": "gs://cloud-samples-data/ai-platform/generative_ai/sft_validation_data.jsonl"
   },
   "tunedModelDisplayName": "tuned_gemini_pro"
}'

Python


import time

import vertexai
from vertexai.tuning import sft

# TODO(developer): Update and un-comment below line
# PROJECT_ID = "your-project-id"
vertexai.init(project=PROJECT_ID, location="us-central1")

sft_tuning_job = sft.train(
    source_model="gemini-1.5-pro-002",
    train_dataset="gs://cloud-samples-data/ai-platform/generative_ai/gemini-1_5/text/sft_train_data.jsonl",
    # The following parameters are optional
    validation_dataset="gs://cloud-samples-data/ai-platform/generative_ai/gemini-1_5/text/sft_validation_data.jsonl",
    epochs=4,
    adapter_size=4,
    learning_rate_multiplier=1.0,
    tuned_model_display_name="tuned_gemini_1_5_pro",
)

# Polling for job completion
while not sft_tuning_job.has_ended:
    time.sleep(60)
    sft_tuning_job.refresh()

print(sft_tuning_job.tuned_model_name)
print(sft_tuning_job.tuned_model_endpoint_name)
print(sft_tuning_job.experiment)
# Example response:
# projects/123456789012/locations/us-central1/models/1234567890@1
# projects/123456789012/locations/us-central1/endpoints/123456789012345
# <google.cloud.aiplatform.metadata.experiment_resources.Experiment object at 0x7b5b4ae07af0>

控制台

如需使用 Google Cloud 控制台通过监督式微调功能来调整文本模型,请执行以下步骤:

  1. 在 Google Cloud 控制台的 Vertex AI 部分中,进入 Vertex AI Studio 页面。

    进入 Vertex AI Studio

  2. 点击创建经调整的模型

  3. 调优方法下,选择监督式调优单选按钮。

  4. 模型详情下,配置以下内容:

    1. 已调优模型的名称字段中,输入新的调优后模型的名称,最多 128 个字符。
    2. 基本模型字段中,选择 gemini-1.5-pro-002
    3. 区域下拉字段中,选择运行流水线调优作业以及部署调优后模型的区域。
  5. 可选:展开高级选项下拉箭头,然后配置以下内容:

    1. 周期数字段中,输入要为模型调优运行的步数。
    2. 适配器大小字段中,输入要用于模型调优的适配器大小。
    3. 学习速率调节系数字段中,输入每个迭代的步长。默认值为 1。
  6. 点击继续

    调优数据集页面随即会打开。

  7. 如需上传数据集文件,请选择以下选项之一:

    1. 如果您尚未上传数据集,请选中将文件上传到 Cloud Storage 单选按钮。
    2. 选择 JSONL 文件字段中,点击浏览,然后选择数据集文件。
    3. 数据集位置字段中,点击浏览并选择要存储数据集文件的 Cloud Storage 存储桶。
    4. 如果您的数据集文件已在 Cloud Storage 存储桶中,请选择 Cloud Storage 上的现有文件单选按钮。
    5. Cloud Storage 文件路径字段中,点击浏览,然后选择数据集文件所在的 Cloud Storage 存储桶。
  8. (可选)如需在训练期间获取验证指标,请点击启用模型验证切换开关。

    1. 验证数据集文件中,输入验证数据集的 Cloud Storage 路径。
  9. 点击开始调优

    您的新模型会显示在“调优和提炼”页面上的 Gemini Pro 调优模型部分下。模型调优完成后,状态会显示成功

Colab Enterprise

您可以使用 Colab Enterprise 中的侧边栏在 Vertex AI 中创建模型调优作业。侧边栏会将相关代码段添加到您的笔记本中。然后,修改代码段并运行它们,以创建优化作业。如需详细了解如何将侧边栏与 Vertex AI 调优作业搭配使用,请参阅与 Vertex AI 交互以调优模型

  1. 在 Google Cloud 控制台中,进入 Colab Enterprise Notebooks 页面。

    转到 Notebooks

  2. 区域菜单中,选择包含您的笔记本的区域。

  3. 我的笔记本标签页中,点击要打开的笔记本。如果您尚未创建笔记本,请创建笔记本

  4. 在记事本右侧的侧边栏中,点击  Tuning 按钮。

    侧边栏会展开调整标签页。

  5. 点击对 Gemini 模型进行调优按钮。

    Colab Enterprise 会向您的笔记本中添加代码单元格,以便调优 Gemini 模型。

  6. 在笔记本中,找到用于存储参数值的代码单元格。 您将使用这些参数与 Vertex AI 交互。

  7. 更新以下参数的值:

    • PROJECT_ID:笔记本所在项目的 ID。
    • REGION:您的记事本所在的区域。
    • TUNED_MODEL_DISPLAY_NAME:经过调整的模型的名称。
  8. 在下一个代码单元中,更新模型调优参数:

    • source_model:您要使用的 Gemini 模型,例如 gemini-1.0-pro-002
    • train_dataset:训练数据集的网址。
    • validation_dataset:验证数据集的网址。
    • 根据需要调整其余参数。
  9. 运行侧边栏向您的笔记本添加的代码单元。

  10. 运行最后一个代码单元后,点击随即显示的  View tuning job(查看优化作业)按钮。

  11. 侧边栏会显示有关模型调优作业的相关信息。

    • 当指标准备就绪时,监控标签页会显示调优指标。
    • Dataset(数据集)标签页会在数据集处理完毕后显示有关数据集的摘要和指标。
    • 详细信息标签页会显示有关调整作业的信息,例如调整方法和您使用的基准模型(来源模型)。
  12. 调优作业完成后,您可以直接从调优详情标签页前往用于测试模型的页面。 点击测试

    Google Cloud 控制台会打开 Vertex AI 文本聊天页面,您可以在其中测试模型。

调整超参数

建议您在提交第一个调优作业时不更改超参数。默认值是根据我们的基准测试结果推荐的值,可生成最佳模型输出质量。

  • 周期数:在训练期间,模型完整通过整个训练数据集的次数。Vertex AI 会根据您的训练数据集大小自动调整默认值。此值基于基准测试结果,用于优化模型输出质量。
  • 适配器大小:用于调优作业的适配器大小。适配器大小会影响调优作业的可训练参数数量。适配器越大,意味着模型可以学习更复杂的任务,但需要更大的训练数据集和更长的训练时间。
  • 学习速率调节系数:输入要应用于建议的学习速率的调节系数。您可以增加此值以加快收敛速度,也可以降低此值以避免过拟合。

查看调优作业列表

您可以使用 Google Cloud 控制台、Vertex AI SDK for Python 或使用 tuningJobs 方法发送 GET 请求来查看当前项目中的调优作业列表。

REST

如需查看模型调优作业列表,请使用 tuningJobs.list 方法发送 GET 请求。

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

  • PROJECT_ID:您的项目 ID
  • TUNING_JOB_REGION:运行调优作业的区域。这也是上传调优后模型的默认区域。

HTTP 方法和网址:

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

如需发送请求,请选择以下方式之一:

curl

执行以下命令:

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs"

PowerShell

执行以下命令:

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

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应。

Python

import vertexai
from vertexai.tuning import sft

# TODO(developer): Update and un-comment below line
# PROJECT_ID = "your-project-id"
vertexai.init(project=PROJECT_ID, location="us-central1")

responses = sft.SupervisedTuningJob.list()

for response in responses:
    print(response)
# Example response:
# <vertexai.tuning._supervised_tuning.SupervisedTuningJob object at 0x7c85287b2680>
# resource name: projects/12345678/locations/us-central1/tuningJobs/123456789012345

控制台

如需在 Google Cloud 控制台中查看调优作业,请进入 Vertex AI Studio 页面。

进入 Vertex AI Studio

Gemini 调优作业列在 Gemini Pro 调优模型部分下的表格中。

获取调优作业的详细信息

如需获取当前项目中调优作业的详细信息,您可以使用 Google Cloud 控制台、Vertex AI SDK for Python 或使用 tuningJobs 方法发送 GET 请求。

REST

如需查看模型调优作业列表,请使用 tuningJobs.get 方法发送 GET 请求并指定 TuningJob_ID

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

  • PROJECT_ID:您的项目 ID
  • TUNING_JOB_REGION:运行调优作业的区域。这也是上传调优后模型的默认区域。
  • TUNING_JOB_ID:调优作业的 ID。

HTTP 方法和网址:

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

如需发送请求,请选择以下方式之一:

curl

执行以下命令:

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID"

PowerShell

执行以下命令:

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

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应。

Python

import vertexai
from vertexai.tuning import sft

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# LOCATION = "us-central1"
vertexai.init(project=PROJECT_ID, location=LOCATION)

tuning_job_id = "4982013113894174720"
response = sft.SupervisedTuningJob(
    f"projects/{PROJECT_ID}/locations/{LOCATION}/tuningJobs/{tuning_job_id}"
)

print(response)
# Example response:
# <vertexai.tuning._supervised_tuning.SupervisedTuningJob object at 0x7cc4bb20baf0>
# resource name: projects/1234567890/locations/us-central1/tuningJobs/4982013113894174720

控制台

  1. 如需在 Google Cloud 控制台中查看调优后模型的详细信息,请进入 Vertex AI Studio 页面。

    进入 Vertex AI Studio

  2. Gemini Pro 调优模型表中,找到您的模型,然后点击详细信息

    系统会显示模型的详细信息。

取消调优作业

您可以使用 Google Cloud 控制台、Vertex AI SDK for Python 或使用 tuningJobs 方法发送 POST 请求来取消当前项目中的调优作业。

REST

如需查看模型调优作业列表,请使用 tuningJobs.cancel 方法发送 GET 请求并指定 TuningJob_ID

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

  • PROJECT_ID:您的项目 ID
  • TUNING_JOB_REGION:运行调优作业的区域。这也是上传调优后模型的默认区域。
  • TUNING_JOB_ID:调优作业的 ID。

HTTP 方法和网址:

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

如需发送请求,请选择以下方式之一:

curl

执行以下命令:

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

PowerShell

执行以下命令:

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

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs/TUNING_JOB_ID:cancel" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应。

Python

import vertexai
from vertexai.tuning import sft

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# LOCATION = "us-central1"
vertexai.init(project=PROJECT_ID, location=LOCATION)

tuning_job_id = "4982013113894174720"
job = sft.SupervisedTuningJob(
    f"projects/{PROJECT_ID}/locations/{LOCATION}/tuningJobs/{tuning_job_id}"
)
job.cancel()

控制台

  1. 如需在 Google Cloud 控制台中取消调优作业,请进入 Vertex AI Studio 页面。

    进入 Vertex AI Studio

  2. Gemini Pro 调优模型表格中,点击 管理运行作业

  3. 点击取消

通过提示测试调优后的模型

您可以通过使用 Vertex AI SDK for Python 或使用 tuningJobs 方法发送 POST 请求,在当前项目中测试调优作业。

以下示例向模型提示“为什么天空是蓝色的?”这一问题。

REST

如需使用提示测试经过调优的模型,请发送 POST 请求并指定 TUNED_ENDPOINT_ID

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

  • PROJECT_ID:您的项目 ID
  • TUNING_JOB_REGION:运行调优作业的区域。这也是上传调优后模型的默认区域。
  • ENDPOINT_ID:GET API 中的经过调整的模型端点 ID。
  • TEMPERATURE:温度 (temperature) 在生成回答期间用于采样,在应用 topPtopK 时会生成回答。温度可以控制词元选择的随机性。 较低的温度有利于需要更少开放性或创造性回复的提示,而较高的温度可以带来更具多样性或创造性的结果。温度为 0 表示始终选择概率最高的词元。在这种情况下,给定提示的回复大多是确定的,但可能仍然有少量变化。

    如果模型返回的回答过于笼统、过于简短,或者模型给出后备回答,请尝试提高温度。

  • TOP_P:Top-P 可更改模型选择输出词元的方式。系统会按照概率从最高(见 top-K)到最低的顺序选择词元,直到所选词元的概率总和等于 top-P 的值。例如,如果词元 A、B 和 C 的概率分别为 0.3、0.2 和 0.1,并且 top-P 值为 0.5,则模型将选择 A 或 B 作为下一个词元(通过温度确定),并会排除 C,将其作为候选词元。

    指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。

  • TOP_K:Top-K 可更改模型选择输出词元的方式。如果 top-K 设为 1,表示所选词元是模型词汇表的所有词元中概率最高的词元(也称为贪心解码)。如果 top-K 设为 3,则表示系统将从 3 个概率最高的词元(通过温度确定)中选择下一个词元。

    在每个词元选择步骤中,系统都会对概率最高的 top-K 词元进行采样。然后,系统会根据 top-P 进一步过滤词元,并使用温度采样选择最终的词元。

    指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。

  • MAX_OUTPUT_TOKENS:回答中可生成的词元数量上限。词元约为 4 个字符。100 个词元对应大约 60-80 个单词。

    指定较低的值可获得较短的回答,指定较高的值可获得可能较长的回答。

HTTP 方法和网址:

POST https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/endpoints/ENDPOINT_ID:generateContent

请求 JSON 正文:

{
    "contents": [
        {
            "role": "USER",
            "parts": {
                "text" : "Why is sky blue?"
            }
        }
    ],
    "generation_config": {
        "temperature":TEMPERATURE,
        "topP": TOP_P,
        "topK": TOP_K,
        "maxOutputTokens": MAX_OUTPUT_TOKENS
    }
}

如需发送请求,请选择以下方式之一:

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/endpoints/ENDPOINT_ID:generateContent"

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/endpoints/ENDPOINT_ID:generateContent" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应。

Python

from vertexai.generative_models import GenerativeModel

sft_tuning_job = sft.SupervisedTuningJob("projects/<PROJECT_ID>/locations/<TUNING_JOB_REGION>/tuningJobs/<TUNING_JOB_ID>")
tuned_model = GenerativeModel(sft_tuning_job.tuned_model_endpoint_name)
print(tuned_model.generate_content(content))

控制台

  1. 如需在 Google Cloud 控制台中查看调优后模型的详细信息,请进入 Vertex AI Studio 页面。

    进入 Vertex AI Studio

  2. Gemini Pro 调优模型表中,选择测试

    此操作会打开一个页面,您可以在其中创建与调优后模型进行的对话。

调优和验证指标

您可以配置模型调优作业,以收集和报告模型调优和模型评估指标,然后在 Vertex AI Studio 中直观呈现这些指标。

  1. 如需在 Google Cloud 控制台中查看调优后模型的详细信息,请进入 Vertex AI Studio 页面。

    进入 Vertex AI Studio

  2. 调优和提炼表格中,点击要查看指标的调优模型的名称。

    调优指标会显示在监控标签页下。

模型调优指标

模型调优作业会自动为 gemini-1.5-pro-002 收集以下调优指标。

  • /train_total_loss:一个训练步长中调整数据集的损失。
  • /train_fraction_of_correct_next_step_preds:一个训练步长中的词元准确率。单个预测由一系列词元组成。该指标衡量预测词元的准确率(与调优数据集中的标准答案相比)。
  • /train_num_predictions::一个训练步长中的预测词元数。

模型验证指标:

您可以配置模型调优作业,以便为 gemini-1.5-pro-002 收集以下验证指标。

  • /eval_total_loss:一个验证步长中验证数据集的损失。
  • /eval_fraction_of_correct_next_step_preds:一个验证步长中的词元准确率。单个预测由一系列词元组成。该指标衡量评估词元的准确率(与验证数据集中的标准答案相比)。
  • /eval_num_predictions:一个验证步长中的预测词元数。

调优作业开始运行后,系统会提供指标可视化内容。 随着调优的进行,它会实时更新。 如果您在创建调优作业时未指定验证数据集,则系统只提供调优指标的可视化内容。

后续步骤