使用监督式调优来调优文本模型

监督式调优使用有标签样本来训练模型。每个样本都演示了您希望文本模型在推理期间提供的输出。如果模型的输出并非特别复杂且易于定义,则监督式调优是个不错的选择。

文本模型监督式调优分步指南

以下引导式教程可帮助您了解如何使用监督式调优在 Google Cloud 控制台中调优文本基础模型。


如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示

操作演示


监督式模型调优工作流

Vertex AI 上的监督式模型调整工作流包括以下步骤:

  1. 准备模型调整数据集。
  2. 将模型调优数据集上传到 Cloud Storage 存储桶。
  3. 创建监督式模型调整作业。

模型调整完成后,调整后的模型会部署到 Vertex AI 端点。端点的名称与调整后模型的名称相同。如果您想要创建新提示,则可以在 Vertex AI Studio 中选择调优后的模型。

支持的模型

以下文本基础模型支持监督式调优:

  • 文本生成 - text-bison@002text-bison-32k
  • 文本聊天 - chat-bison@002chat-bison-32k
  • 代码生成 - code-bison@002code-bison-32k
  • 代码聊天 - codechat-bison@002codechat-bison-32k
  • 文本嵌入 - textembedding-gecko@001(预览版)

对文本模型使用监督式调整的用例

如果预期输出或任务可以在提示中清晰且简明地定义,并且提示始终如一地生成预期输出,则基础文本模型效果良好。如果您希望模型学习偏离常规语言模式的特定领域或特定内容,则不妨考虑调优该模型。例如,您可以使用模型调优来训练模型学习以下内容:

  • 用于生成输出的特定结构或格式。
  • 特定行为,例如何时提供简洁或详细输出。
  • 针对特定输入类型的特定自定义输出。

以下示例是难以仅根据提示说明捕获的使用场景:

  • 分类:预期响应是特定的字词或短语。

    调优模型有助于防止模型生成详细的响应。

  • 摘要:摘要遵循特定格式。 例如,您可能需要移除聊天摘要中的个人身份信息 (PII)。

    这种将讲话人姓名替换为 #Person1#Person2 的格式很难描述,基础模型可能无法自然地产生此类响应。

  • 提取式问答:问题与上下文有关,回答是上下文的子字符串。

    响应“Last Glacial Maximum”是上下文中的特定词组。

  • 聊天:您需要自定义模型响应以遵循人设、角色或人物。

您还可以在以下情况下调优模型:

  • 提示无法产生一致性足够好的预期结果。
  • 任务过于复杂,无法在提示中定义。例如,您希望模型针对难以在提示中清晰表达的行为进行行为克隆。
  • 您对任务有难以表述的理解,可以抽丝剥茧层层引出,但很难在提示中规范表达。
  • 您希望通过移除少量样本示例来缩短语境长度。

准备监督式调优数据集

用于调优基础模型的数据集需要包含与您希望模型执行的任务相配的样本。以文本到文本格式构建训练数据集。数据集中的每条记录或者说每一行都包含与模型的预期输出配对的输入文本(也称为提示)。监督式调优使用数据集来训练模型,以模拟所需的行为或任务,方法是向数据集提供数百个样本来说明该行为。

您的数据集必须至少包含 10 个样本,但为了获得良好的结果,我们建议至少使用 100 到 500 个样本。您在数据集中提供的样本越多,结果就越好。

如需查看示例数据集,请参阅本页面上的示例数据集

数据集格式

模型调优数据集必须采用 JSON 行 (JSONL) 格式,其中每行包含一个调优样本。用于调优文本生成模型的数据集格式与用于调优文本聊天模型的数据集格式不同。在调优模型之前,您必须先将数据集上传到 Cloud Storage 存储桶

文本

每个示例都包含一个 input_text 字段(包含模型提示)和一个 output_text 字段(包含经过调优的模型预期生成的示例响应)。 结构化提示中的其他字段(例如 context)会被忽略。

input_text 的词元长度上限为 8192,output_text 的词元长度上限为 1024。如果任一字段超过词元长度上限,则多余的词元将被截断。

文本生成模型的数据集最多可包含的样本数量为 10,000。

数据集样本

{"input_text": "question: How many people live in Beijing? context:
With over 21 million residents, Beijing is the world's most populous national
capital city and is China's second largest city after Shanghai. It is
located in Northern China, and is governed as a municipality under the direct
administration of the State Council with 16 urban, suburban, and rural
districts.[14] Beijing is mostly surrounded by Hebei Province with the exception
of neighboring Tianjin to the southeast; together, the three divisions form the
Jingjinji megalopolis and the national capital region of China.",
"output_text": "over 21 million people"}

{"input_text": "question: How many parishes are there in Louisiana? context: The U.S. state of Louisiana is divided into 64 parishes (French: paroisses) in the same manner that 48 other states of the United States are divided into counties, and Alaska is divided into boroughs.", "output_text": "64"}

在样本中添加说明

对于分类等任务,可以创建不包含说明的样本数据集。但是,如果从数据集中的示例中排除说明,则与包含说明相比,在调优后性能会下降,对于较小的数据集尤甚。

排除说明

{"input_text": "5 stocks to buy now",
"output_text": "business"}

包含说明

{"input_text": "Classify the following text into one of the following classes:
[business, entertainment] Text: 5 stocks to buy now",
"output_text": "business"}

聊天

聊天调优数据集中的每个对话示例由一个 messages 字段(必需)和一个 context 字段(可选)组成。

messages 字段包含一组作者-内容对。author 字段指消息的作者,并交替设置为 userassistantcontent 字段是消息的内容。每个对话示例都应该有两到三个用户-智能助理消息对,代表来自用户的消息和来自模型的响应。

通过 context 字段,您可以指定聊天的上下文。如果您指定示例的上下文,则该上下文将覆盖在 default_context 中提供的值。

对于每个对话示例,contextmessages 的总词元长度上限为 8192 个词元。此外,assistant 的每个 content 字段不应超过 1,024 个词元。

在文本聊天模型的数据集中,样本最多可以包含 10,000 个 author 字段。此上限是所有样本的所有 messages 中所有 author 字段的总和。

示例

{
  "context": "You are a pirate dog named Captain Barktholomew.",
  "messages": [
    {
      "author": "user",
      "content": "Hi"
    },
    {
      "author": "assistant",
      "content": "Argh! What brings ye to my ship?"
    },
    {
      "author": "user",
      "content": "What's your name?"
    },
    {
      "author": "assistant",
      "content": "I be Captain Barktholomew, the most feared pirate dog of the seven seas."
    }
  ]
}

示例数据集

您可以使用示例数据集来开始调优 text-bison@002 模型。下面是一个分类任务数据集,其中包含各种医学专业领域的示例医疗转写记录。数据来自 mtsamples.comKaggle 上提供了该数据集。

  • 调优数据集示例 URI:

    gs://cloud-samples-data/vertex-ai/model-evaluation/peft_train_sample.jsonl

  • 评估数据集示例 URI:

    gs://cloud-samples-data/vertex-ai/model-evaluation/peft_eval_sample.jsonl

如需使用这些数据集,请在创建文本模型监管式调优作业时指定适用参数中的 URI。

例如:

...
"dataset_uri": "gs://cloud-samples-data/vertex-ai/model-evaluation/peft_train_sample.jsonl",
...
"evaluation_data_uri": "gs://cloud-samples-data/vertex-ai/model-evaluation/peft_eval_sample.jsonl",
...

与生产数据保持一致

数据集中的样本应与您的预期生产流量相匹配。如果您的数据集包含特定的格式、关键字、说明或信息,则生产数据应以相同方式设置格式并包含相同的说明。

例如,如果数据集中的样本包含 "question:""context:",则生产流量的格式也应设置为包含 "question:""context:",其顺序与在数据集样本中的显示顺序相同。如果排除了语境,则模型将无法识别该模式,即使确切的问题包含在数据集内的样本中也是如此。

将调优数据集上传到 Cloud Storage

若要运行调优作业,您需要将一个或多个数据集上传到 Cloud Storage 存储桶。您可以创建新的 Cloud Storage 存储桶,也可以使用现有的存储桶来存储数据集文件。存储桶的区域无关紧要,但我们建议您使用您计划用于对模型调优的同一 Google Cloud 项目中的存储桶。

存储桶准备就绪后,将数据集文件上传到存储桶。

监督式调优区域设置

配置监督式调优作业时,您可以指定三个 Google Cloud 区域设置。一个区域是运行模型调优流水线的位置。另一个区域是运行模型调优作业和上传调优后模型的位置。

流水线作业区域

流水线作业区域是运行流水线作业的区域。如果未指定可选的模型上传区域,则模型将上传并部署到流水线作业区域。中间数据(例如转换后的数据集)存储在流水线作业区域中。如需了解可用于流水线作业区域的区域,请参阅支持的流水线作业和模型上传区域。您必须使用以下方法之一指定流水线作业区域:

  • 如果您使用 Vertex AI SDK,则可以使用表示您正在调优的模型的对象的 tune_model 方法(例如,TextGenerationModel.tune_model 方法)上的 tuning_job_location 参数来指定流水线作业运行的区域。

  • 如果您通过使用 pipelineJobs.create 方法发送 POST 请求来创建监督式调优作业,则可以使用网址来指定流水线作业运行的区域。在以下网址中,将出现的两个 PIPELINE_JOB_REGION 替换为流水线运行的区域:

     https://PIPELINE_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/PIPELINE_JOB_REGION/pipelineJobs
    
  • 如果您使用 Google Cloud 控制台创建监督式模型调优作业,则可以在创建调优作业时在区域控件中指定流水线作业区域。在 Google Cloud 控制台中,区域控件同时指定流水线作业区域和模型上传区域。当您使用 Google Cloud 控制台创建监督式模型调优作业时,这两个区域始终相同。

模型上传区域

您可以使用可选的 tuned_model_location 参数指定调优后模型上传到的位置。如果未指定模型上传区域,系统会将调优后的模型上传到流水线作业区域。您可以使用支持的流水线作业和模型上传区域中的区域。您可以使用以下某种方法指定模型上传区域:

  • 如果您使用 Vertex AI SDK,则在代表您正在调优的模型的对象的 tune_model 方法(例如,TextGenerationModel.tune_model 方法)上指定 tuned_model_location 参数。

  • 如果您通过使用 pipelineJobs 方法发送 POST 请求来创建监督式模型调优作业,则可以使用 location 参数指定模型上传区域。

  • 如果您使用 Google Cloud 控制台创建监督式模式调优作业,则在创建调优作业时在区域控件中指定模型上传区域。在 Google Cloud 控制台中,区域控件同时指定模型上传区域和流水线作业区域。当您使用 Google Cloud 控制台创建监督式模型调优作业时,这两个区域始终相同。

模型调优区域

模型调优区域是进行模型调优计算的位置。此区域由您选择的加速器类型决定。如果您将加速器类型指定为 TPU,则模型调优计算会在 europe-west4 中进行。如果您将加速器类型指定为 GPU,则模型调优在 us-central1 中进行。

支持的流水线作业和模型上传区域

您可以使用以下区域之一来指定模型上传区域并指定流水线作业区域:

  • us-central1
  • europe-west4
  • asia-southeast1
  • us-west1
  • europe-west3
  • europe-west2
  • asia-northeast1
  • us-east4
  • us-west4
  • northamerica-northeast1
  • europe-west9
  • europe-west1
  • asia-northeast3

创建文本模型监督式调优作业

您可以使用 Google Cloud 控制台或 Python 版 Vertex AI SDK 创建监督式文本模型调优作业。如需查看模型调优配置的指导信息,请参阅推荐配置

REST

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

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

  • PIPELINEJOB_DISPLAYNAME:pipelineJob 的显示名称。
  • OUTPUT_DIR:要将流水线工件输出到的存储桶的 URI。
  • PROJECT_ID:您的项目 ID
  • MODEL_DISPLAYNAME:pipelineJob 上传(创建)的模型的显示名称。
  • DATASET_URI:数据集文件的 URI。
  • PIPELINE_JOB_REGION:运行流水线调优作业的区域。这也是上传调优后模型的默认区域。如果要将模型上传到其他区域,请使用 location 参数指定调优后模型上传区域。如需了解详情,请参阅模型上传区域
  • MODEL_UPLOAD_REGION:(可选)上传调优后模型的区域。如果未指定模型上传区域,则调优后的模型会上传到运行流水线作业的同一区域。如需了解详情,请参阅模型上传区域
  • ACCELERATOR_TYPE:(可选,默认为 GPU)用于模型调优的加速器类型。有效选项包括:
    • GPU:使用 8 个 A100 80 GB GPU 进行调优。请确保您有足够的配额。如果您选择 GPU,则支持 VPC-SC。如果调优位置和模型上传位置为 us-centra1,则支持 CMEK。如需了解详情,请参阅监督式调优区域设置。如果您选择 GPU,则模型调优计算会在 us-central1 区域进行。
    • TPU:使用 64 个 TPU v3 Pod 核心进行调优。请确保您有足够的配额。不支持 CMEK,但支持 VPC-SC。如果您选择 TPU,则模型调优计算会在 europe-west4 区域进行。
  • LARGE_MODEL_REFERENCE:要调优的基础模型的名称。选项包括:
    • text-bison@002
    • chat-bison@002
  • DEFAULT_CONTEXT (chat only):适用于调优数据集中所有调优样本的语境。在样本中设置 context 字段会替换默认上下文。
  • STEPS:模型调优所要运行的步数。默认值为 300。批次大小因调优位置和模型大小而异。对于 8k 模型,例如 text-bison@002chat-bison@002code-bison@002codechat-bison@002
    • us-central1 的批次大小为 8。
    • europe-west4 的批次大小为 24。
    对于 32k 模型,例如 text-bison-32kchat-bison-32kcode-bison-32kcodechat-bison-32k
    • us-central1 的批次大小为 8。
    • europe-west4 的批次大小为 8。

    例如,如果您在 europe-west4 中训练 text-bison@002,训练数据集中有 240 个样本,并且将 steps 设置为 20,则训练样本数为 20 步与批次大小 24 的乘积,即训练步数为 480。在这种情况下,训练过程有两个周期,因为它遍历样本两次。在 us-central1 中,如果训练数据集中有 240 个样本,并且您将 steps 设置为 15,则训练样本数为 15 步与批次大小 8 的乘积,即训练步数为 120。在这种情况下有 0.5 个周期,因为训练步数是样本数的一半。

  • LEARNING_RATE_MULTIPLIER:要应用于建议的学习速率的调节系数。如需使用建议的学习速率,请使用 1.0
  • EVAL_DATASET_URI (text only):(可选)包含评估数据集(用于批量预测和评估)的 JSONL 文件的 URI。chat-bison 不支持评估。如需了解详情,请参阅用于对代码模型调优的数据集格式。评估数据集需要 10 到 250 个样本。
  • EVAL_INTERVAL (text only):(可选,默认值为 20)每次评估之间的调优步数。聊天模型不支持评估间隔。由于评估是针对整个评估数据集运行,因此评估间隔越小,调优时间就越长。例如,如果 steps 为 200 且 EVAL_INTERVAL 为 100,则您将仅获得评估指标的两个数据点。此参数要求设置 evaluation_data_uri
  • ENABLE_EARLY_STOPPING (text only):(可选,默认值为 true)一个 boolean,如果设置为 true,且模型性能在两次评估运行中没有得到足够的改进(通过预测词元的准确率来衡量),则在完成所有调优步骤之前停止调优。如果为 false,则继续调优,直到所有调优步骤完成。此参数要求设置 evaluation_data_uri。 聊天模型不支持启用早停法。
  • TENSORBOARD_RESOURCE_ID:(可选)Vertex AI TensorBoard 实例的 ID。Vertex AI TensorBoard 实例用于在调优作业完成后创建实验。Vertex AI TensorBoard 实例需要与调优流水线位于同一区域。
  • ENCRYPTION_KEY_NAME:(可选)要用于数据加密的客户管理的加密密钥 (CMEK) 的完全限定名称。CMEK 仅在 us-central1 中可用。如果您使用 us-central1 并且未指定 CMEK,则系统会使用 Google 管理的加密密钥。在所有其他可用区域中,系统默认使用 Google 管理的加密密钥。如需了解详情,请参阅 CMEK 概览
  • TEMPLATE_URI:要使用的调优模板取决于您要调优的模型:
    • 文本模型:https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0
    • 聊天模型:https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-chat-model/v3.0.0
  • SERVICE_ACCOUNT:(可选)Vertex AI 用于运行流水线作业的服务账号。默认情况下,系统会使用项目的 Compute Engine 默认服务账号 (PROJECT_NUMBER‑compute@developer.gserviceaccount.com)。详细了解如何关联自定义服务账号

HTTP 方法和网址:

POST https://PIPELINE_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/PIPELINE_JOB_REGION/pipelineJobs

请求 JSON 正文:

{
  "displayName": "PIPELINEJOB_DISPLAYNAME",
  "runtimeConfig": {
    "gcsOutputDirectory": "gs://OUTPUT_DIR",
    "parameterValues": {
      "project": "PROJECT_ID",
      "model_display_name": "MODEL_DISPLAYNAME",
      "dataset_uri": "gs://DATASET_URI",
      "location": "MODEL_UPLOAD_REGION",
      "accelerator_type": "ACCELERATOR_TYPE",
      "large_model_reference": "LARGE_MODEL_REFERENCE",
      "default_context": "DEFAULT_CONTEXT (chat only)",
      "train_steps": STEPS,
      "learning_rate_multiplier": LEARNING_RATE_MULTIPLIER,
      "evaluation_data_uri": "gs://EVAL_DATASET_URI (text only)",
      "evaluation_interval": EVAL_INTERVAL (text only),
      "enable_early_stopping": ENABLE_EARLY_STOPPING (text only),
      "enable_checkpoint_selection": "ENABLE_CHECKPOINT_SELECTION (text only)",
      "tensorboard_resource_id": "TENSORBOARD_ID",
      "encryption_spec_key_name": "ENCRYPTION_KEY_NAME"
    }
  },
  "encryptionSpec": {
    "kmsKeyName": "ENCRYPTION_KEY_NAME"
  },
  "serviceAccount": "SERVICE_ACCOUNT",
  "templateUri": "TEMPLATE_URI"
}

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

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://PIPELINE_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/PIPELINE_JOB_REGION/pipelineJobs"

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://PIPELINE_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/PIPELINE_JOB_REGION/pipelineJobs" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应。请注意,为节省空间,系统截断了 pipelineSpec

Python

如需了解如何安装或更新 Python 版 Vertex AI SDK,请参阅安装 Python 版 Vertex AI SDK。如需了解详情,请参阅 Python API 参考文档

from __future__ import annotations

def tuning(
    project_id: str,
) -> None:
    import vertexai
    from vertexai.language_models import TextGenerationModel
    from google.auth import default

    credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])

    # Initialize Vertex AI
    # TODO(developer): Update project_id
    vertexai.init(project=project_id, location="us-central1", credentials=credentials)

    model = TextGenerationModel.from_pretrained("text-bison@002")

    tuning_job = model.tune_model(
        training_data="gs://cloud-samples-data/ai-platform/generative_ai/headline_classification.jsonl",
        tuning_job_location="europe-west4",
        tuned_model_location="us-central1",
    )

    print(tuning_job._status)
    return model

Node.js

在尝试此示例之前,请按照《Vertex AI 快速入门:使用客户端库》中的 Node.js 设置说明执行操作。如需了解详情,请参阅 Vertex AI Node.js API 参考文档

如需向 Vertex AI 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';
const aiplatform = require('@google-cloud/aiplatform');
const {PipelineServiceClient} = aiplatform.v1;

// Import the helper module for converting arbitrary protobuf.Value objects.
const {helpers} = aiplatform;

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'europe-west4-aiplatform.googleapis.com',
};
const model = 'text-bison@001';

const pipelineClient = new PipelineServiceClient(clientOptions);

async function tuneLLM() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}`;

  const parameters = {
    train_steps: helpers.toValue(trainSteps),
    project: helpers.toValue(project),
    location: helpers.toValue('us-central1'),
    dataset_uri: helpers.toValue(datasetUri),
    large_model_reference: helpers.toValue(model),
    model_display_name: helpers.toValue(modelDisplayName),
    accelerator_type: helpers.toValue('GPU'), // Optional: GPU or TPU
  };

  const runtimeConfig = {
    gcsOutputDirectory,
    parameterValues: parameters,
  };

  const pipelineJob = {
    templateUri:
      'https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0',
    displayName: 'my-tuning-job',
    runtimeConfig,
  };

  const createPipelineRequest = {
    parent,
    pipelineJob,
    pipelineJobId,
  };
  await new Promise((resolve, reject) => {
    pipelineClient.createPipelineJob(createPipelineRequest).then(
      response => resolve(response),
      e => reject(e)
    );
  }).then(response => {
    const [result] = response;
    console.log('Tuning pipeline job:');
    console.log(`\tName: ${result.name}`);
    console.log(
      `\tCreate time: ${new Date(1970, 0, 1)
        .setSeconds(result.createTime.seconds)
        .toLocaleString()}`
    );
    console.log(`\tStatus: ${result.status}`);
  });
}

await tuneLLM();

Java

在尝试此示例之前,请按照《Vertex AI 快速入门:使用客户端库》中的 Java 设置说明执行操作。如需了解详情,请参阅 Vertex AI Java API 参考文档

如需向 Vertex AI 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import com.google.cloud.aiplatform.v1.CreatePipelineJobRequest;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.PipelineJob;
import com.google.cloud.aiplatform.v1.PipelineJob.RuntimeConfig;
import com.google.cloud.aiplatform.v1.PipelineServiceClient;
import com.google.cloud.aiplatform.v1.PipelineServiceSettings;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CreatePipelineJobModelTuningSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String location = "europe-west4"; // europe-west4 and us-central1 are the supported regions
    String pipelineJobDisplayName = "PIPELINE_JOB_DISPLAY_NAME";
    String modelDisplayName = "MODEL_DISPLAY_NAME";
    String outputDir = "OUTPUT_DIR";
    String datasetUri = "DATASET_URI";
    int trainingSteps = 300;

    createPipelineJobModelTuningSample(
        project,
        location,
        pipelineJobDisplayName,
        modelDisplayName,
        outputDir,
        datasetUri,
        trainingSteps);
  }

  // Create a model tuning job
  public static void createPipelineJobModelTuningSample(
      String project,
      String location,
      String pipelineJobDisplayName,
      String modelDisplayName,
      String outputDir,
      String datasetUri,
      int trainingSteps)
      throws IOException {
    final String endpoint = String.format("%s-aiplatform.googleapis.com:443", location);
    PipelineServiceSettings pipelineServiceSettings =
        PipelineServiceSettings.newBuilder().setEndpoint(endpoint).build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (PipelineServiceClient client = PipelineServiceClient.create(pipelineServiceSettings)) {
      Map<String, Value> parameterValues = new HashMap<>();
      parameterValues.put("project", stringToValue(project));
      parameterValues.put("model_display_name", stringToValue(modelDisplayName));
      parameterValues.put("dataset_uri", stringToValue(datasetUri));
      parameterValues.put(
          "location",
          stringToValue(
              "us-central1")); // Deployment is only supported in us-central1 for Public Preview
      parameterValues.put("large_model_reference", stringToValue("text-bison@001"));
      parameterValues.put("train_steps", numberToValue(trainingSteps));
      parameterValues.put("accelerator_type", stringToValue("GPU")); // Optional: GPU or TPU

      RuntimeConfig runtimeConfig =
          RuntimeConfig.newBuilder()
              .setGcsOutputDirectory(outputDir)
              .putAllParameterValues(parameterValues)
              .build();

      PipelineJob pipelineJob =
          PipelineJob.newBuilder()
              .setTemplateUri(
                  "https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0")
              .setDisplayName(pipelineJobDisplayName)
              .setRuntimeConfig(runtimeConfig)
              .build();

      LocationName parent = LocationName.of(project, location);
      CreatePipelineJobRequest request =
          CreatePipelineJobRequest.newBuilder()
              .setParent(parent.toString())
              .setPipelineJob(pipelineJob)
              .build();

      PipelineJob response = client.createPipelineJob(request);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }

  static Value stringToValue(String str) {
    return Value.newBuilder().setStringValue(str).build();
  }

  static Value numberToValue(int n) {
    return Value.newBuilder().setNumberValue(n).build();
  }
}

控制台

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

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

    进入 Vertex AI Studio

  2. 点击 Tune and distill(调参和蒸馏)标签页。
  3. 点击 创建经调优的模型
  4. 点击监督式调优
  5. 配置模型详情:
    • 已调参模型的名称:输入调优后模型的名称。
    • 基本模型:选择要调优的模型。
    • 区域:选择运行流水线调优作业以及部署调优后模型的区域。
    • 输出目录:输入对模型调优时用于存储工件的 Cloud Storage 位置。
  6. 展开高级选项以配置高级设置。
    • 训练步数:输入要为模型调优运行的步数。默认值为 300。批次大小因调优位置和模型大小而异。对于 8k 模型,例如 text-bison@002chat-bison@002code-bison@002codechat-bison@002
      • us-central1 的批次大小为 8。
      • europe-west4 的批次大小为 24。
      对于 32k 模型,例如 text-bison-32kchat-bison-32kcode-bison-32kcodechat-bison-32k
      • us-central1 的批次大小为 8。
      • europe-west4 的批次大小为 8。

      例如,如果您在 europe-west4 中训练 text-bison@002,训练数据集中有 240 个样本,并且将 steps 设置为 20,则训练样本数为 20 步与批次大小 24 的乘积,即训练步数为 480。在这种情况下,训练过程有两个周期,因为它遍历样本两次。在 us-central1 中,如果训练数据集中有 240 个样本,并且您将 steps 设置为 15,则训练样本数为 15 步与批次大小 8 的乘积,即训练步数为 120。在这种情况下有 0.5 个周期,因为训练步数是样本数的一半。

    • 学习速率调节系数:输入每次迭代时的步长。默认值为 1。
    • 加速器类型:(可选)输入用于模型调优的加速器类型。有效选项包括:
      • GPU:使用 8 个 A100 80 GB GPU 进行调优。请确保您有足够的配额。如果您选择 GPU,则支持 VPC-SC。如果调优位置和模型上传位置为 us-centra1,则支持 CMEK。如需了解详情,请参阅监督式调优区域设置。如果您选择 GPU,则模型调优计算会在 us-central1 区域进行。
      • TPU:使用 64 个 TPU v3 Pod 核心进行调优。请确保您有足够的配额。不支持 CMEK,但支持 VPC-SC。如果您选择 TPU,则模型调优计算会在 europe-west4 区域进行。
    • 添加 TensorBoard 实例:(可选)Vertex AI TensorBoard 实例的 ID。Vertex AI TensorBoard 实例用于在调优作业完成后创建实验。Vertex AI TensorBoard 实例需要与调优流水线位于同一区域。
    • 加密(可选)选择使用 Google 管理的加密密钥或客户管理的加密密钥 (CMEK)。CMEK 只能在 us-central1 区域用于加密。在所有其他可用区域中,系统会使用 Google 管理的加密密钥。如需了解详情,请参阅 CMEK 概览
    • 服务账号(可选)选择用户管理的服务账号。服务账号决定了您的服务代码可以访问哪些 Google Cloud 资源。如果您未选择服务账号,则系统会使用由 Google 管理的服务账号,其中包含适合大多数模型的权限。
  7. 点击继续
  8. 如果要上传数据集文件,请选择 将 JSONL 文件上传到 Cloud Storage。如果您的数据集文件已在 Cloud Storage 存储桶中,请选择 Cloud Storage 上的现有 JSONL 文件

    上传 JSONL 文件

    • 选择 JSONL 文件中,点击浏览并选择数据集文件。
    • 数据集位置中,点击浏览并选择要存储数据集文件的 Cloud Storage 存储桶。

    使用现有的 JSONL 文件

    Cloud Storage 文件路径中,点击浏览,然后选择数据集文件所在的 Cloud Storage 存储桶。

  9. (可选)如需评估调优后的模型,请选择启用模型评估并配置模型评估:
    • 评估数据集:(可选)包含评估数据集(用于批量预测和评估)的 JSONL 文件的 URI。chat-bison 不支持评估。如需了解详情,请参阅用于对代码模型调优的数据集格式。评估数据集需要 10 到 250 个样本。
    • 评估间隔(可选,默认值为 20)每次评估之间的调优步数。聊天模型不支持评估间隔。由于评估是针对整个评估数据集运行,因此评估间隔越小,调优时间就越长。例如,如果 steps 为 200 且 EVAL_INTERVAL 为 100,则您将仅获得评估指标的两个数据点。此参数要求设置 evaluation_data_uri
    • 启用早停法:(可选,默认值为 trueboolean,如果设置为 true,且模型性能在两次评估运行中没有得到足够的改进(通过预测词元的准确率来衡量),则在完成所有调优步骤之前停止调优。如果为 false,则继续调优,直到所有调优步骤完成。此参数要求设置 evaluation_data_uri。 聊天模型不支持启用早停法。
    • 启用检查点选择:启用后,Vertex AI 会从调节作业期间创建的所有检查点中选择并返回具有最佳模型评估性能的检查点。停用后,系统将返回在调节作业期间创建的最终检查点。每个检查点是指模型在调节作业期间的快照。
    • TensorBoard 实例: (可选)Vertex AI TensorBoard 实例的 ID。Vertex AI TensorBoard 实例用于在调优作业完成后创建实验。Vertex AI TensorBoard 实例需要与调优流水线位于同一区域。
  10. 点击开始调优

示例 curl 命令

PROJECT_ID=myproject
DATASET_URI=gs://my-gcs-bucket-uri/dataset
OUTPUT_DIR=gs://my-gcs-bucket-uri/output
ACCELERATOR_TYPE=GPU
LOCATION=us-central1

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
"https://europe-west4-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/europe-west4/pipelineJobs?pipelineJobId=tune-large-model-$(date +%Y%m%d%H%M%S)" -d \
$'{
  "displayName": "tune-llm",
  "runtimeConfig": {
    "gcsOutputDirectory": "'${OUTPUT_DIR}'",
    "parameterValues": {
      "project": "'${PROJECT_ID}'",
      "model_display_name": "The display name for your model in the UI",
      "dataset_uri": "'${DATASET_URI}'",
      "location": "'${LOCATION}'",
      "accelerator_type:": "'${ACCELERATOR_TYPE}'",
      "large_model_reference": "text-bison@002",
      "train_steps": 300,
      "learning_rate_multiplier": 1,
      "encryption_spec_key_name": "projects/myproject/locations/us-central1/keyRings/sample-key/cryptoKeys/sample-key"
    }
  },
  "encryptionSpec": {
    "kmsKeyName": "projects/myproject/locations/us-central1/keyRings/sample-key/cryptoKeys/sample-key"
  },
  "templateUri": "https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v2.0.0"
}'

下表显示了调优基础模型的建议配置,按任务列出:

任务 数据集中的示例数 训练步数
分类 超过 100 个 100-500
摘要 100-500+ 200-1000
抽样质量检查 超过 100 个 100-500
聊天 200 多个 1,000

对于训练步骤,您可以针对特定数据集尝试使用多个值来获得最佳性能,例如 100、200、500。

查看经过调优的模型列表

您可以使用 Google Cloud 控制台或 Python 版 Vertex AI SDK 查看当前项目中的模型列表,包括经过调优的模型。

Python

在尝试此示例之前,请按照《Vertex AI 快速入门:使用客户端库》中的 Python 设置说明执行操作。如需了解详情,请参阅 Vertex AI Python API 参考文档

如需向 Vertex AI 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import vertexai

from vertexai.language_models import TextGenerationModel

# TODO(developer): Update values for project_id & location
vertexai.init(project=project_id, location=location)
model = TextGenerationModel.from_pretrained("text-bison@002")
tuned_model_names = model.list_tuned_model_names()
print(tuned_model_names)

控制台

如需在 Google Cloud 控制台中查看调优后模型,请进入 Vertex AI Model Registry 页面。

进入 Vertex AI Model Registry

加载调优后的文本模型

以下示例代码使用 Python 版 Vertex AI SDK 加载使用监督式调优方法调优的文本生成模型:

import vertexai
from vertexai.preview.language_models import TextGenerationModel

model = TextGenerationModel.get_tuned_model(TUNED_MODEL_NAME)

TUNED_MODEL_NAME 替换为经过调优的模型的限定资源名称。此名称的格式为 projects/PROJECT_ID/locations/LOCATION/models/MODEL_ID。您可以在 Vertex AI Model Registry中找到经过调优的模型的模型 ID。

调整和评估指标

您可以配置模型调整作业来收集和报告模型调整和模型评估指标,然后可以使用 Vertex AI TensorBoard 直观呈现这些指标。

模型调优指标

您可以配置模型调优作业来收集 chat-bisoncode-bisoncodechat-bisontext-bison 的以下调优指标:
  • /train_total_loss:一个训练步长中调整数据集的损失。
  • /train_fraction_of_correct_next_step_preds:一个训练步长中的词元准确率。单个预测由一系列词元组成。该指标衡量预测词元的准确率(与调优数据集中的标准答案相比)。
  • /train_num_predictions::一个训练步长中的预测词元数。

模型评估指标

您可以配置模型调优作业来收集 code-bisontext-bison 的以下评估指标:

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

模型调优作业完成后将提供指标的可视化内容。 如果您在创建调优作业时仅指定 Vertex AI TensorBoard 实例 ID 而不指定评估数据集,则只提供调优指标的可视化内容。

问题排查

以下主题可帮助您解决使用监督式调优方法来调优基础文本模型时遇到的问题。

尝试调优模型返回 500 错误或 Internal error encountered

如果您在尝试调优模型时遇到 500 错误,请尝试此解决方法:

运行以下 cURL 命令以创建空 Vertex AI 数据集。请确保在命令中配置您的项目 ID。

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://europe-west4-aiplatform.googleapis.com/ui/projects/$PROJECT_ID/locations/europe-west4/datasets \
-d '{
    "display_name": "test-name1",
    "metadata_schema_uri": "gs://google-cloud-aiplatform/schema/dataset/metadata/image_1.0.0.yaml",
    "saved_queries": [{"display_name": "saved_query_name", "problem_type": "IMAGE_CLASSIFICATION_MULTI_LABEL"}]
}'

命令完成后,等待五分钟,然后再次尝试调优模型。

错误:针对资源“...europe-west4/metadataStores/default”的权限“aiplatform.metadataStores.get”被拒绝。

确保已启用 Compute Engine API,并且默认 Compute Engine 服务账号 (PROJECT_NUM‑compute@developer.gserviceaccount.com) 已被授予 aiplatform.adminstorage.objectAdmin 角色。

如需向 Compute Engine 服务账号授予 aiplatform.adminstorage.objectAdmin 角色,请执行以下操作:

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    如果您希望在机器上使用终端,请安装和配置 Google Cloud CLI

  2. 使用 gcloud projects add-iam-policy-binding 命令aiplatform.admin 角色关联到 Compute Engine 服务账号:

    替换以下内容:

    • PROJECT_ID 替换为 Google Cloud 项目 ID。
    • PROJECT_NUM 替换为您的 Google Cloud 项目编号。
    gcloud projects add-iam-policy-binding PROJECT_ID --member serviceAccount:PROJECT_NUM-compute@developer.gserviceaccount.com --role roles/aiplatform.admin
    
  3. 使用 gcloud projects add-iam-policy-binding 命令storage.objectAdmin 角色关联到 Compute Engine 服务账号:

    • PROJECT_ID 替换为 Google Cloud 项目 ID。
    • PROJECT_NUM 替换为您的 Google Cloud 项目编号。
    gcloud projects add-iam-policy-binding PROJECT_ID --member serviceAccount:PROJECT_NUM-compute@developer.gserviceaccount.com  --role roles/storage.objectAdmin
    

错误:Vertex AI Service Agent service-{project-number}@gcp-sa-aiplatform.iam.gserviceaccount.com 无权访问 Artifact Registry 制品库 projects/vertex-ai-restricted/locations/us/repositories/llm。

此权限错误是传播延迟引起的。后续重试应可解决此错误。

后续步骤