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

1. 简介

为什么微调很重要

基础模型是为一般用途而训练的,有时其执行效果不符合您的预期。这可能是因为,您希望模型执行的任务是特殊任务,仅凭提示设计很难训练模型。在这些情况下,您可以使用模型调整来提高模型在特定任务中的性能。当指令不足时,模型调整还有助于遵循特定的输出要求。大语言模型 (LLM) 可包含大量信息,并执行许多任务,但只有在提供专业训练时才能表现出色。通过微调,您可以训练 LLM,从而根据您的具体需求调整预训练的 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”并使用 Python 版 Vertex AI SDK 用新闻数据进行微调。
  • 评估结果:将经过微调的模型与基本模型的效果进行比较,看看标题生成质量是否有所提升。
  • 部署和使用模型:通过 API 端点提供经过微调的模型,并开始为新报道自动生成标题。

2. 准备工作

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

3. 微调大语言模型

此 Codelab 使用 Python 版 Vertex AI SDK 对模型进行微调。您也可以使用其他选项(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

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

如需使用基本模型 (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

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

加载经微调的模型

加载刚刚微调的模型可能会更容易。但请注意,在第 3 步中,它是在代码本身的作用域内调用的,因此它仍将已调参的模型保存在变量 tune_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

评估结果中的 rougeLSum 指标指定摘要的 ROUGE-L 得分。ROUGE-L 是一个基于召回率的指标,用于衡量摘要和参考文件摘要之间的重叠情况。计算方法是用两次摘要之间的最长公共子序列 (LCS) 除以参考摘要的长度。

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

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

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

9. 重要注意事项

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

10. 清理

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

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

11. 恭喜

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

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