微调大语言模型:Vertex AI 如何让 LLM 更上一层楼

1. 简介

微调的重要性

基础模型是为一般用途训练的,有时不能按预期执行任务。这可能是因为您希望模型执行的任务是专业任务,很难仅通过提示设计来训练模型。在这些情况下,可以使用模型调优来提高模型针对特定任务的性能。当说明不够充分时,模型调优还有助于遵循特定的输出要求。大语言模型 (LLM) 可以包含大量信息并执行许多任务,但只有在接受专门训练后才能发挥出色。微调可以训练大语言模型,让您可以根据自己的特定需求调整预训练大语言模型。

在此 Codelab 中,您将学习如何使用监督式调优方法对 LLM 模型执行微调。

监督式调优通过教授新技能来提高模型的性能。此方法使用包含数百个有标签样本的数据来训练模型,让其模拟所需的行为或任务。我们将提供一个包含输入文本(提示)和输出文本(回答)的有标签数据集,以训练模型如何针对我们的特定用例自定义回答。

如需详细了解模型自定义,请点击 此处

构建内容

用例:为新闻报道生成标题

假设您要为新闻报道自动生成标题。借助 Vertex AI,您可以微调 LLM,使其以特定样式生成合适的摘要标题,并根据新闻频道的准则自定义标题。

在此 Codelab 中,您将执行以下操作:

  • 使用 BBC FULLTEXT DATA(由 BigQuery 公共数据集 bigquery-public-data.bbc_news.fulltext 提供)。
  • 将 LLM (text-bison@002) 微调为名为“bbc-news-summary-tuned”的新微调模型,并将结果与基础模型的回答进行比较。代码库中提供了此 Codelab 的示例 JSONL 文件。您可以将该文件上传到 Cloud Storage 存储分区,然后执行以下微调步骤:
  • 准备数据: 首先准备一个包含新闻报道及其相应标题的数据集,例如示例代码中使用的 BBC News 数据集。
  • 微调预训练模型: 选择一个基础模型(例如“text-bison@002”),然后使用 Vertex AI SDK for Python 通过新闻数据对其进行微调。
  • 评估结果: 将微调模型的性能与基础模型的性能进行比较,以了解标题生成质量的提升情况。
  • 部署和使用模型: 通过 API 端点提供微调模型,并开始自动为新报道生成标题。

2. 准备工作

  1. Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 确保您的 Google Cloud 项目已启用结算功能。了解如何 检查项目是否已启用结算功能
  3. 打开 Colab 笔记本,并登录与当前活跃 Google Cloud 账号相同的账号。

3. 微调大语言模型

此 Codelab 使用 Vertex AI SDK for Python 来微调模型。您也可以使用其他选项(HTTP、C网址 命令、Java SDK、控制台)执行微调。

您可以通过 5 个步骤微调和评估模型,以获得自定义回答。您可以参阅 llm_fine_tuning_supervised.ipynb 文件中的完整代码,该文件位于 代码库 中。

4. 第 1 步:安装和导入依赖项

!pip install google-cloud-aiplatform
!pip install --user datasets
!pip install --user google-cloud-pipeline-components

按照 仓库 中 .ipynb 文件中所示的其余步骤操作。请务必将 PROJECT_ID 和 BUCKET_NAME 替换为您的凭据。

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import warnings
warnings.filterwarnings('ignore')
import vertexai
vertexai.init(project=PROJECT_ID, location=REGION)
import kfp
import sys
import uuid
import json
import pandas as pd
from google.auth import default
from datasets import load_dataset
from google.cloud import aiplatform
from vertexai.preview.language_models import TextGenerationModel, EvaluationTextSummarizationSpec

5. 第 2 步:准备和加载训练数据

将 YOUR_BUCKET 替换为您的存储分区,并将示例 TRAIN.jsonl 训练数据文件上传到该存储分区。我们已在上述链接中为此用例预配了示例数据。

json_url = 'https://storage.googleapis.com/YOUR_BUCKET/TRAIN.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)

此步骤应产生以下结果:

17274866af36a47c.png

6. 第 3 步:微调大语言模型

此时,您可以调优任何大语言模型(具体取决于支持情况)。不过,在此代码段中,我们将使用在上一步中加载的训练数据的数据框来调优预训练模型“text-bison@002”:

model_display_name = 'bbc-finetuned-model' # @param {type:"string"}
tuned_model = TextGenerationModel.from_pretrained("text-bison@002")
tuned_model.tune_model(
training_data=df,
train_steps=100,
tuning_job_location="europe-west4",
tuned_model_location="europe-west4",
)

此步骤需要几个小时才能完成。您可以使用结果中的流水线作业链接跟踪微调进度。

7. 第 4 步:使用新的微调模型进行预测

微调作业完成后,您就可以使用新模型进行预测。如需使用新的调优模型进行预测,请执行以下操作:

response = tuned_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

您应该会看到以下结果:

67061c36b7ba39b7.png

如需使用基础模型 (text-bison@002) 进行预测以进行比较,请运行以下命令:

base_model = TextGenerationModel.from_pretrained("text-bison@002")
response = base_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

您应该会看到以下结果:

22ec58e4261405d6.png

虽然生成的两个标题看起来都合适,但第一个标题(使用微调模型生成)更符合相关数据集中使用的标题样式。

加载微调模型

加载刚刚微调的模型可能会更容易。但请注意,在第 3 步中,它是在代码本身的范围内调用的,因此它仍然将调优模型保留在变量 tuned_model 中。但如果您想调用过去调优的模型,该怎么办?

为此,您可以使用 Vertex AI Model Registry 中已部署的微调模型的完整 ENDPOINT 网址,对 LLM 调用 get_tuned_model() 方法。请注意,在这种情况下,您输入的是 PROJECT_NUMBER 和 MODEL_NUMBER,而不是它们各自的 ID。

tuned_model_1 = TextGenerationModel.get_tuned_model("projects/<<PROJECT_NUMBER>>/locations/europe-west4/models/<<MODEL_NUMBER>>")
print(tuned_model_1.predict("YOUR_PROMPT"))

8. 第 5 步:评估新的微调模型

评估是评估生成回答的质量和相关性的关键方面。它涉及检查生成式语言模型的输出,以确定其连贯性、准确性以及与所提供提示的一致性。模型评估有助于确定需要改进的方面、优化模型性能,并确保生成的文本符合所需的质量和实用性标准。如需了解详情,请参阅 文档。现在,我们将了解如何获取有关微调模型的一些评估指标,并与基础模型进行比较。

  1. 加载 EVALUATION 数据集
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
  1. 为微调模型上的文本摘要任务定义评估规范。
task_spec = EvaluationTextSummarizationSpec(
 task_name = "summarization",
 ground_truth_data=df
)

此步骤需要几分钟才能完成。您可以使用结果中的流水线作业链接跟踪进度。完成后,您应该会看到以下评估结果:

387843d6c970e02.png

评估结果中的 rougeLSum 指标指定了摘要的 ROUGE-L 得分。ROUGE-L 是一种基于召回率的指标,用于衡量摘要与参考摘要之间的重叠程度。它的计算方法是取两个摘要之间的最长公共子序列 (LCS),然后将其除以参考摘要的长度。

所提供表达式中的 rougeLSum 得分为 0.36600753600753694,这意味着摘要与参考摘要的重叠率为 36.6%。

如果您对基准模型运行评估步骤,您会发现微调模型的摘要得分相对较高。

您可以在创建评估作业时指定的 Cloud Storage 输出目录中找到评估结果。该文件名为 evaluation_metrics.json。对于经过调优的模型,您还可以在 Google Cloud 控制台的 Vertex AI Model Registry 页面中查看评估结果。

9. 重要注意事项

  • 模型支持: 请务必查看模型文档,了解最新的兼容性信息。
  • 快速发展: 大语言模型 领域发展迅速。与基于旧基础模型构建的微调模型相比,更新、更强大的模型可能会表现更好。好消息是,当这些功能可用时,您可以将这些微调技术应用于更新的模型。
  • LoRA: LoRA 是一种高效微调 LLM 的技术。它通过在现有预训练模型的层中引入可训练的低秩分解矩阵来实现这一点。如需了解详情,请点击此处。LoRA 不会更新大型大语言模型的所有参数,而是学习较小的矩阵,这些矩阵会添加到原始模型的权重矩阵中或与原始模型的权重矩阵相乘。这可以显著减少微调期间引入的额外参数数量。

10. 清理

为避免系统因本 Codelab 中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 管理资源 页面。
  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关停 以删除项目。
  4. 或者,您可以前往 Model Registry,导航到“模型部署和测试”标签页,然后取消部署端点并删除已部署的调优模型。

11. 恭喜

恭喜!您已成功使用 Vertex AI 微调 LLM 模型。微调是一种强大的技术,可让您根据自己的领域和任务自定义 LLM。借助 Vertex AI,您可以获得高效且有效地微调模型所需的工具和资源。

探索 GitHub 代码库并试用示例代码,亲身体验 微调评估。考虑如何使用微调的大语言模型来满足您的特定需求,例如生成有针对性的营销文案、总结复杂文档或翻译具有文化细微差别的语言。利用 Vertex AI 提供的全套工具和服务,轻松构建、训练、评估和部署微调模型。