关于此 Codelab
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 新闻数据集。
- 微调预训练模型:选择“
text-bison@002
”等基础模型,然后使用 Vertex AI SDK for Python 使用新闻数据对其进行微调。 - 评估结果:将经过微调的模型的效果与基准模型的效果进行比较,看看标题生成质量是否有所提升。
- 部署和使用模型:通过 API 端点提供经过微调的模型,并开始自动为新文章生成标题。
2. 准备工作
- 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。
- 确保您的 Google Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
- 打开 Colab Notebook,然后登录与您当前有效的 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
按照 repo 中的 .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)
此步骤应产生以下结果:
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)
您应该会看到以下结果:
如需使用基准模型 (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)
您应该会看到以下结果:
虽然这两个生成的标题看起来都很合适,但第一个标题(使用经过微调的模型生成)更符合相关数据集中所用标题的风格。
加载经过微调的模型
加载您刚刚微调的模型可能更容易。但请记得,在第 3 步中,它是在代码本身的范围内调用的,因此它仍会在变量 tuned_model 中保留经过调优的模型。但是,如果您想调用过去调优过的模型,该怎么办?
为此,您可以使用 Vertex AI Model Registry 中部署的经过微调模型的完整端点网址,在 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 步:评估新的微调模型
评估是评估生成的回答的质量和相关性的关键方面。它涉及检查生成式语言模型的输出,以确定其连贯性、准确性以及与所提供的提示的一致性。模型评估有助于确定需要改进的方面、优化模型性能,并确保生成的文本符合所需的质量和实用性标准。如需了解详情,请参阅文档。现在,我们将了解如何获取经过微调的模型的一些评估指标,并与基准模型进行比较。
- 加载评估数据集:
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
- 为经过微调的模型定义文本摘要任务的评估规范。
task_spec = EvaluationTextSummarizationSpec(
task_name = "summarization",
ground_truth_data=df
)
此步骤需要几分钟才能完成。您可以使用结果中的流水线作业链接跟踪进度。完成后,您应该会看到以下评估结果:
评估结果中的 rougeLSum
指标指定了摘要的 ROUGE-L 得分。ROUGE-L 是一种基于召回率的指标,用于衡量摘要与参考摘要之间的重叠程度。其计算方式为:取两个摘要之间的最长公共子序列 (LCS),然后将其除以参考摘要的长度。
所提供表达式的 rougeLSum
得分为 0.36600753600753694,这意味着摘要与参考摘要有 36.6% 的重叠。
如果您对基准模型运行评估步骤,会发现经过微调的模型的摘要得分相对较高。
您可以在创建评估作业时指定的 Cloud Storage 输出目录中找到评估结果。该文件的名称为 evaluation_metrics.json
。对于经过调优的模型,您还可以在 Google Cloud 控制台中的 Vertex AI Model Registry 页面查看评估结果。
10. 清理
为避免系统因本 Codelab 中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:
- 在 Google Cloud 控制台中,前往管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关停以删除项目。
- 或者,您也可以前往 Model Registry,前往“模型部署和测试”标签页,然后取消部署端点并删除已部署的经过调优的模型。