对代码模型调优

您可以使用监督式调优来对代码模型调优。监督式调优使用有标签样本,这些样本展示了您希望在推理期间从代码生成或代码聊天模型获得的输出类型。代码模型不支持使用基于人类反馈的强化学习 (RLHF) 调优

使用代码模型调优的场景

如果您希望模型学习偏离常规语言和代码模式的特定领域或特定情况,则需要进行调优。以下示例说明您可以训练 code-bisoncodechat-bison 模型的内容:

  • 如何为自定义库生成代码。通过使用自定义库的有标签样本训练代码模型,可以生成或讨论特定于该自定义库的代码。
  • 如何使用代码库。通过使用代码库的有标签样本训练模型,您可以生成代码,或讨论在代码库中使用独特特性的代码。
  • 如何使用编程语言的变体生成代码。通过使用语言变体的加标签样本训练代码模型,您可以生成或讨论使用该语言变体的特定惯例和标准的代码。

这些场景包括单纯通过提示说明难以捕获的代码要求。下面列出了一些示例:

代码生成

  • 此示例提示和响应有助于对 code-bison 调优以使用特定数据集。

  • 此示例提示和响应有助于训练 code-bison 使用 Python 创建产品。

代码聊天

  • 此示例提示和响应有助于对 codechat-bison 调优,以帮助用户了解如何使用特定数据集。

  • 此示例提示和回复有助于对 codechat-bison 调优,帮助用户了解如何在聊天会话期间使用 Python 创建产品。

准备代码模型调优数据集

用于对代码模型调优的数据集包含与您希望模型执行的任务一致的示例。您的数据集必须至少包含 10 个样本,但为了获得良好的结果,我们建议至少使用 500 个样本。您提供的示例越多,结果就越好。

用于对代码模型调优的数据集格式

代码生成模型和代码聊天模型的调优数据集必须采用 JSON 行 (JSONL) 格式。下文详细介绍了每个模型的数据集格式和数据集示例:

代码生成

代码生成模型调优数据集必须采用 JSON 行 (JSONL) 格式,其中每行包含一个调优示例。每个样本都包含一个 input_text 字段(包含模型提示)和一个 output_text 字段(包含经过调优的模型预期生成的示例回复)。

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

代码生成模型调优数据集示例

本主题展示了两个代码生成模型调优数据集示例。以下是代码生成调优数据集的第一个示例:

{"input_text": "How to create a product in Python with the Cloud Vision API?", "output_text": "Use this
Python code sample to learn how to create a
product with the Cloud Vision API:\n\n```python\n\r\n\r\n\r\n\r\n\r\nfrom google.cloud import
vision\r\nfrom google.protobuf import field_mask_pb2 as field_mask\r\n\r\ndef
create_product(\r\n project_id, location, product_id, product_display_name,\r\n
product_category):\r\n \"\"\"Create one product.\r\n Args:\r\n project_id: Id of
the project.\r\n location: A compute region name.\r\n product_id: Id of the
product.\r\n product_display_name: Display name of the product.\r\n
product_category: Category of the product.\r\n \"\"\"\r\n client =
vision.ProductSearchClient()\r\n\r\n # A resource that represents Google Cloud
Platform location.\r\n location_path =
f\"projects/{project_id}/locations/{location}\"\r\n\r\n # Create a product with
the product specification in the region.\r\n # Set product display name and
product category.\r\n product = vision.Product(\r\n
display_name=product_display_name,\r\n
product_category=product_category)\r\n\r\n # The response is the product with
the `name` field populated.\r\n response = client.create_product(\r\n
parent=location_path,\r\n product=product,\r\n product_id=product_id)\r\n\r\n #
Display the product information.\r\n print('Product name:
{}'.format(response.name))\r\n```"}

以下是代码生成调优数据集的第二个示例:

{"input_text": "python to retrieve the labels of a dataset for a given dataset
ID in BigQuery", "output_text": "Here is a Python code sample to retrieve the labels of a
dataset for a given dataset ID in BigQuery.\n\n```python\n\n from google.cloud import
bigquery\n\n # Construct a BigQuery client object.\n client =
bigquery.Client()\n\n # TODO(developer): Set dataset_id to the ID of the dataset
to fetch.\n # dataset_id = \"your-project.your_dataset\"\n\n dataset =
client.get_dataset(dataset_id) # Make an API request.\n\n # View dataset
labels.\n print(\"Dataset ID: {}\".format(dataset_id))\n print(\"Labels:\")\n if
dataset.labels:\n for label, value in dataset.labels.items():\n print(\"\\t{}:
{}\".format(label, value))\n else:\n print(\"\\tDataset has no labels
defined.\")\n```"}

代码聊天

代码聊天模型调优数据集必须采用 JSON 行 (JSONL) 格式,其中每行包含一个调优示例。每个样本都包含一个 messages 字段,其中包含经过调优的模型预期生成的聊天提示和回复示例。

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

代码聊天模型调优数据集示例

本主题展示了两个代码聊天模型调优数据集示例。以下是代码聊天调优数据集的第一个示例:

{"messages": [{"author":"user", "content": "How to create a product in
Python with Cloud Vision?"}, {"author": "assistant", "content": "Use this Python code sample to
learn how to create a product with Cloud Vision:\n\n```python\n\r\n\r\n\r\n\r\n\r\nfrom
google.cloud import vision\r\nfrom google.protobuf import field_mask_pb2 as
field_mask\r\n\r\ndef create_product(\r\n project_id, location, product_id,
product_display_name,\r\n product_category):\r\n \"\"\"Create one product.\r\n
Args:\r\n project_id: Id of the project.\r\n location: A compute region
name.\r\n product_id: Id of the product.\r\n product_display_name: Display name
of the product.\r\n product_category: Category of the product.\r\n \"\"\"\r\n
client = vision.ProductSearchClient()\r\n\r\n # A resource that represents
Google Cloud Platform location.\r\n location_path =
f\"projects/{project_id}/locations/{location}\"\r\n\r\n # Create a product with
the product specification in the region.\r\n # Set product display name and
product category.\r\n product = vision.Product(\r\n
display_name=product_display_name,\r\n
product_category=product_category)\r\n\r\n # The response is the product with
the `name` field populated.\r\n response = client.create_product(\r\n
parent=location_path,\r\n product=product,\r\n product_id=product_id)\r\n\r\n #
Display the product information.\r\n print('Product name:
{}'.format(response.name))\r\n```"}]}

以下是代码聊天调优数据集的第二个示例:

{"messages": [{"author":"user", "content": "Python to retrieve the labels of a
dataset for a given dataset ID in BigQuery"}, {"author": "assistant", "content": "Here is a
Python code sample to retrieve the labels of a dataset for a given dataset
ID in BigQuery.\n\n```python\n\n from google.cloud import bigquery\n\n # Construct a
BigQuery client object.\n client = bigquery.Client()\n\n # TODO(developer): Set
dataset_id to the ID of the dataset to fetch.\n # dataset_id =
\"your-project.your_dataset\"\n\n dataset = client.get_dataset(dataset_id) #
Make an API request.\n\n # View dataset labels.\n print(\"Dataset ID:
{}\".format(dataset_id))\n print(\"Labels:\")\n if dataset.labels:\n for label,
value in dataset.labels.items():\n print(\"\\t{}: {}\".format(label, value))\n
else:\n print(\"\\tDataset has no labels defined.\")\n```"}]}

与生产数据保持一致

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

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

在样本中添加说明

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

排除说明

{
  "input_text": "Calculate the sum of a list of integers.",
  "output_text": "```python\nnums = [1, 2, 3]\ntotal_sum = sum(nums)\n```"
}

包含说明

{
  "input_text": "Write the code in Python: calculate the sum of a list of integers",
  "output_text": "```python\nnums = [1, 2, 3]\ntotal_sum = sum(nums)\n```"
}

将调优数据集上传到 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 控制台、API 或 Python 版 Vertex AI SDK 创建监督式调优作业。如需查看模型调优配置的指导信息,请参阅推荐配置

创建代码生成模型调优作业

下面展示了如何使用 Google Cloud 控制台或 REST API 命令创建代码生成模型调优作业。

REST

如需创建代码生成模型调优作业,请使用 pipelineJobs 方法发送 POST 请求。

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

  • PROJECT_ID:您的项目 ID
  • TUNINGPIPELINE_DISPLAYNAME:pipelineJob 的显示名称。
  • OUTPUT_DIR:要将流水线工件输出到的存储桶的 URI。
  • MODEL_DISPLAYNAME:pipelineJob 上传(创建)的模型的显示名称。
  • DATASET_URI:数据集文件的 URI。
  • EVAL_DATASET_URI:(可选)包含评估数据集(用于批量预测和评估)的 JSONL 文件的 URI。codechat-bison 不支持评估。如需了解详情,请参阅用于对代码模型调优的数据集格式。评估数据集需要 10 到 250 个样本。
  • EVAL_INTERVAL:(可选,默认值为 20)每次评估之间的调优步数。聊天模型不支持评估间隔。由于评估是针对整个评估数据集运行,因此评估间隔越小,调优时间就越长。例如,如果 steps 为 200 且 EVAL_INTERVAL 为 100,则您将仅获得评估指标的两个数据点。此参数要求设置 evaluation_data_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 区域进行。
  • ENABLE_EARLY_STOPPING:(可选,默认值为 true)一个 boolean,如果设置为 true,且模型性能在两次评估运行中没有得到足够的改进(通过预测词元的准确率来衡量),则在完成所有调优步骤之前停止调优。如果为 false,则继续调整,直到所有调整步骤完成。此参数要求设置 evaluation_data_uri。 聊天模型不支持启用早停法。
  • ENABLE_CHECKPOINT_SELECTION:一个字符串值,可以是 truefalsedefault。如果设置为 `true`,Vertex AI 会从调节作业期间创建的所有检查点中选择并返回具有最佳模型评估性能的检查点。如果设置为 `false`,则返回在调节作业期间创建的最终检查点。每个检查点是指模型在调节作业期间的快照。
  • 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 管理的密钥。在所有其他可用区域中,系统默认使用 Google 拥有的密钥和 Google 管理的密钥。如需了解详情,请参阅 CMEK 概览
  • 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。

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",
      "evaluation_data_uri": "EVAL_DATASET_URI",
      "evaluation_interval": "EVAL_INTERVAL",
      "enable_early_stopping": "ENABLE_EARLY_STOPPING",
      "enable_checkpoint_selection": "ENABLE_CHECKPOINT_SELECTION",
      "tensorboard_resource_id": "TENSORBOARD_RESOURCE_ID",
      "location": "MODEL_UPLOAD_REGION",
      "accelerator_type": "ACCELERATOR_TYPE",
      "large_model_reference": "code-bison@002",
      "train_steps": STEPS,
      "learning_rate_multiplier": LEARNING_RATE_MULTIPLIER
    }
  }
  "templateUri": "https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v3.0.0"
}

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

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

控制台

如需使用 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 拥有的密钥和 Google 管理的密钥或客户管理的加密密钥 (CMEK)。CMEK 只能在 us-central1 区域用于加密。在所有其他可用区域中,系统会使用 Google 拥有的密钥和 Google 管理的密钥。如需了解详情,请参阅 CMEK 概览
    • 服务账号:(可选)选择用户管理的服务账号。服务账号决定了您的服务代码可以访问哪些 Google Cloud 资源。如果您未选择服务账号,系统会使用服务代理,其中包含适合大多数模型的权限。
  7. 点击继续
  8. 如果要上传数据集文件,请选择 将 JSONL 文件上传到 Cloud Storage。如果您的数据集文件已在 Cloud Storage 存储桶中,请选择 Cloud Storage 上的现有 JSONL 文件

    上传 JSONL 文件

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

    使用现有的 JSONL 文件

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

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

Python

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

from __future__ import annotations

import os

PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")


def tune_code_generation_model(project_id: str) -> None:
    from google.auth import default

    import vertexai
    from vertexai.language_models import CodeGenerationModel

    # Initialize Vertex AI
    # TODO(developer): Update project
    credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
    vertexai.init(project=PROJECT_ID, location="us-central1", credentials=credentials)

    model = CodeGenerationModel.from_pretrained("code-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


用于对代码生成模型调优的示例 curl 命令

PROJECT_ID=myproject
DATASET_URI=gs://my-gcs-bucket-uri/dataset
EVAL_DATASET_URI=gs://cloud-samples-data/vertex-ai/model-evaluation/eval_sample.jsonl
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://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/pipelineJobs?pipelineJobId=tune-large-model-$(date +%Y%m%d%H%M%S)" -d \
$'{
  "displayName": "'${PIPELINE_NAME}'",
  "runtimeConfig": {
    "gcsOutputDirectory": "'${OUTPUT_DIR}'",
    "parameterValues": {
      "project": "'${PROJECT_ID}'",
      "model_display_name": "The display name for your model in the UI",
      "dataset_uri": "'${DATASET_URI}'",
      "evaluation_data_uri:": "'${EVAL_DATASET_URI}'",
      "location": "'${LOCATION}'",
      "accelerator_type": "'${ACCELERATOR_TYPE}'",
      "large_model_reference": "code-bison@002",
      "learning_rate_multiplier": 1,
      "train_steps": 300
    }
  },
  "templateUri": "https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-model/v3.0.0"
}'

创建代码聊天模型调优作业

下面展示了如何使用 Google Cloud 控制台或 REST API 命令创建代码聊天模型调优作业。

REST

如需创建代码聊天模型调优作业,请使用 pipelineJobs 方法发送 POST 请求。

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

  • PROJECT_ID:您的项目 ID
  • TUNINGPIPELINE_DISPLAYNAME:pipelineJob 的显示名称。
  • OUTPUT_DIR:要将流水线工件输出到的存储桶的 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 区域进行。
  • MODEL_DISPLAYNAME:pipelineJob 上传(创建)的模型的显示名称。
  • DATASET_URI:数据集文件的 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 管理的密钥。在所有其他可用区域中,系统默认使用 Google 拥有的密钥和 Google 管理的密钥。如需了解详情,请参阅 CMEK 概览
  • DEFAULT_CONTEXT:适用于调优数据集中所有调优样本的语境。在样本中设置 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。

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",
      "tensorboard_resource_id": "TENSORBOARD_RESOURCE_ID",
      "location": "MODEL_UPLOAD_REGION",
      "accelerator_type": "ACCELERATOR_TYPE",
      "large_model_reference": "codechat-bison@002",
      "default_context": "DEFAULT_CONTEXT",
      "train_steps": STEPS,
      "learning_rate_multiplier": LEARNING_RATE_MULTIPLIER
    }
  },
  "templateUri": "https://us-kfp.pkg.dev/ml-pipeline/large-language-model-pipelines/tune-large-chat-model/v3.0.0"
}

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

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

控制台

如需使用 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 拥有的密钥和 Google 管理的密钥或客户管理的加密密钥 (CMEK)。CMEK 只能在 us-central1 区域用于加密。在所有其他可用区域中,系统会使用 Google 拥有的密钥和 Google 管理的密钥。如需了解详情,请参阅 CMEK 概览
    • 服务账号:(可选)选择用户管理的服务账号。服务账号决定了您的服务代码可以访问哪些 Google Cloud 资源。如果您未选择服务账号,系统会使用服务代理,其中包含适合大多数模型的权限。
  7. 点击继续
  8. 如果要上传数据集文件,请选择 将 JSONL 文件上传到 Cloud Storage。如果您的数据集文件已在 Cloud Storage 存储桶中,请选择 Cloud Storage 上的现有 JSONL 文件

    上传 JSONL 文件

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

    使用现有的 JSONL 文件

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

  9. (可选)如需评估调优后的模型,请选择启用模型评估并配置模型评估:
    • 评估数据集:(可选)包含评估数据集(用于批量预测和评估)的 JSONL 文件的 URI。codechat-bison 不支持评估。如需了解详情,请参阅用于对代码模型调优的数据集格式。评估数据集需要 10 到 250 个样本。
    • 评估间隔(可选,默认值为 20)每次评估之间的调优步数。聊天模型不支持评估间隔。由于评估是针对整个评估数据集运行,因此评估间隔越小,调优时间就越长。例如,如果 steps 为 200 且 EVAL_INTERVAL 为 100,则您将仅获得评估指标的两个数据点。此参数要求设置 evaluation_data_uri
    • 启用早停法:(可选,默认值为 trueboolean,如果设置为 true,且模型性能在两次评估运行中没有得到足够的改进(通过预测词元的准确率来衡量),则在完成所有调优步骤之前停止调优。如果为 false,则继续调整,直到所有调整步骤完成。此参数要求设置 evaluation_data_uri。 聊天模型不支持启用早停法。
    • 启用检查点选择:启用后,Vertex AI 会从调节作业期间创建的所有检查点中选择并返回具有最佳模型评估性能的检查点。停用后,系统将返回在调节作业期间创建的最终检查点。每个检查点是指模型在调节作业期间的快照。
    • TensorBoard Id:(可选)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://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/pipelineJobs?pipelineJobId=tune-large-chat-model-$(date +%Y%m%d%H%M%S)" -d \
$'{
  "displayName": "'${PIPELINE_NAME}'",
  "runtimeConfig": {
    "gcsOutputDirectory": "'${OUTPUT_DIR}'",
    "parameterValues": {
      "project": "'${PROJECT_ID}'",
      "model_display_name": "your-model-display-name",
      "dataset_uri": "'${DATASET_URI}'",
      "location": "'${LOCATION}'",
      "large_model_reference": "codechat-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-chat-model/v3.0.0"
}'

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

任务 数据集中的示例数 训练步骤
代码生成 500+ 200-1000
代码聊天 500+ 200-1000

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

查看经过调优的模型列表

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

查看经过调优的代码模型列表(控制台)

如需在 Google Cloud 控制台中查看经过调优的代码聊天和代码生成模型,请进入 Vertex AI Model Registry 页面。

进入 Vertex AI Model Registry

查看经过调优的代码生成模型 (SDK) 列表

以下示例代码使用 Python 版 Vertex AI SDK 列出当前项目中经过调优的代码生成模型:

import vertexai
from vertexai.preview.language_models import CodeGenerationModel

model = CodeGenerationModel.from_pretrained("code-bison@002").list_tuned_model_names()

查看经过调优的代码聊天模型 (SDK) 列表

以下示例代码使用 Python 版 Vertex AI SDK 列出当前项目中经过调优的代码聊天模型:

import vertexai
from vertexai.preview.language_models import CodeChatModel

model = CodeChatModel.from_pretrained("codechat-bison@002").list_tuned_model_names()

加载经过调优的模型

您可以使用 Python 版 Vertex AI SDK 加载经过调优的代码模型。

加载经过调优的代码生成模型

以下示例代码使用 Python 版 Vertex AI SDK 加载经过调优的代码生成模型。在示例代码中,将 TUNED_MODEL_NAME 替换为经过调优的模型的限定资源名称。此名称的格式为 projects/PROJECT_ID/locations/LOCATION/models/MODEL_ID。您可以在 Vertex AI Model Registry中找到经过调优的模型的模型 ID。

import vertexai
from vertexai.preview.language_models import CodeGenerationModel

model = CodeGenerationModel.get_tuned_model(TUNED_MODEL_NAME)

加载经过调优的代码聊天模型

以下示例代码使用 Python 版 Vertex AI SDK 加载经过调优的代码聊天模型:

import vertexai
from vertexai.preview.language_models import CodeChatModel

model = CodeChatModel.get_tuned_model(TUNED_MODEL_NAME)

调整和评估指标

您可以配置模型调整作业来收集和报告模型调整和模型评估指标,然后可以使用 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 而不指定评估数据集,则只提供调优指标的可视化内容。

配额

us-central1 中的调优作业使用八个 A100 80 GB GPU。

europe-west4 中的调优作业使用 TPU v3 pod 自定义模型训练资源的 64 个核心。

如果您没有足够的配额或想要在 Google Cloud 项目中运行多个并发调优作业,则必须申请更多配额

  • 对于 us-central1,以 8 的倍数的形式在 us-central1 区域中提交对 Restricted image training Nvidia A100 80 GB GPUs per region 的请求。

  • 对于 europe-west4,以 64 的倍数的形式在 europe-west4 区域中提交对 Restricted image training TPU V3 pod cores per region 的请求。

后续步骤

  • 如需了解更多模型、高级功能以及最多可转写 8 小时的文件的功能,请参阅 Speech-to-Text