使用 Amazon SageMaker Autopilot 微调大型语言模型 机器学习博客

使用 Amazon SageMaker Autopilot 微调大型语言模型

关键要点

通过 Amazon SageMaker Autopilot,我们可以轻松地对预训练的基础模型进行微调,以更好地满足特定任务的需求。本文展示了如何使用 AutoMLV2 SDK 通过训练 Meta Llama2-7B 模型来处理问答任务,并讨论了在医疗、教育和金融服务等不同领域扩展该微调方法的可能性。


微调基础模型(FMs)是一个涉及将预训练的基础模型暴露于特定任务数据并调整其参数的过程。这一过程使模型能在特定领域中更深入地理解数据,并产生更准确和相关的输出。

在本文中,我们将介绍如何使用 训练作业配合

SDK 对 Meta Llama2-7B模型进行微调,以完成问答任务。具体来说,我们将该模型应用于多项选择的科学考试问题,涵盖物理、化学和生物学等领域。这种微调方法可以扩展到其他任务,例如摘要或文本生成,适用于医疗、教育或金融等领域。

AutoMLV2 支持通过 提供的通用基础模型的基于指令的微调。我们使用

来自动化不同的步骤,包括数据准备、微调和模型创建。我们利用开源库 来评估模型,并根据其性能将其注册到 。

解决方案概述

以下架构图展示了使用 AutoMLV2 微调大型语言模型(LLMs)的自动化和可扩展过程的各个步骤。AutoMLV2 SDK通过提供高层次的函数和抽象,使创建和管理 AutoML 作业的过程更为简便,这对于可能不熟悉 AutoML概念的开发人员来说非常直接。CreateAutoMLJobV2 API 提供了一个低层接口,允许对作业进行更多的控制和定制。使用该 SDK的好处包括更快的原型设计、更好的可用性以及预构建的函数,而 API 更适合高级自定义。

删除)

为了实现此解决方案,我们在 中使用 SageMaker Pipelines 来协调不同的步骤。该解决方案由两个管道构成:训练管道和推理管道。

创建训练管道的步骤如下:

  1. 加载和准备数据集。
  2. 创建 SageMaker Autopilot CreateAutoMLJobV2 训练作业。
  3. 检查训练作业状态。
  4. 部署最佳候选模型。

推理管道的配置步骤如下:

  1. 预处理评估数据。
  2. 使用 fmeval 库评估模型。
  3. 如果满足性能要求,则注册模型。

要部署解决方案,请参考 ,其中提供了使用 SageMaker Autopilot 和 SageMakerPipelines 微调 Meta Llama2-7B 的逐步说明。

先决条件

在进行本操作之前,请完成以下先决条件步骤:

  1. 设置一个 。
  2. 创建一个 SageMaker Studio 环境。
  3. 创建两个 (IAM)角色:LambdaExecutionRoleSageMakerExecutionRole,并根据 SageMaker notebook 中的要求分配权限。为提高安全性,应进一步缩小托管策略的范围。有关详细说明,请参见 。
  4. 在 SageMaker Studio 控制台中上传 中的代码。
  5. 打开 SageMaker notebook ipynb 并运行代码单元。

训练管道

下图展示了一个简化的训练管道,自动化了对预训练 LLM 的微调以及将模型部署到实时推理端点的过程。

![训练管道图](https://d2908q01vomqb2.cloudfront.net/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59/2024/11/12/ML-17255-Training- 删除)

准备数据

本项目使用了 数据集,该数据集包含物理、化学、生物和其他学科的科学考试问题。SageMaker Autopilot 支持格式为 CSV 文件(默认)或 Parquet文件的基于指令的微调数据集。

在准备 CSV 文件时,确保包含精确的两列:

  • 输入列必须为字符串格式,包含提示语。
  • 输出列为字符串格式,指示真实答案。

在本项目中,我们首先删除无关列。接着,我们将问题和支持列结合起来,创建一个全面的提示,然后放入输入列。SageMaker Autopilot根据使用的模型类型对数据集的最大行数和上下文长度设定了限制。我们从数据集中选择了 10,000 行数据。

最后,我们将数据分为训练集和验证集:


# 加载并拆分数据集。根据自己的数据集进行更改

dataset = load_dataset("allenai/sciq", split="train")  
dataset = dataset.train_test_split(test_size=0.1, shuffle=True)  
dataset_training_df = pd.DataFrame(dataset['train'])  
dataset_validation_df = pd.DataFrame(dataset['test'])  
dataset_training_df = dataset_training_df.sample(n=10000, random_state=42,
ignore_index=True)

# 准备训练数据集以适应 Autopilot 作业。

fields = ['question', 'correct_answer', 'support'] dataset_train_ist_df =
dataset_training_df[fields].copy()  
dataset_fine_tune_ist = Dataset.from_pandas(dataset_train_ist_df)
dataset_fine_tune_ist_cpy = dataset_train_ist_df.copy()
dataset_fine_tune_ist_cpy["input"] = ("以下是一个描述任务的指令,配有一个提供进一步背景的输入。"
"写出适当地完成请求的回应。\n\n### 指令:\n" + dataset_fine_tune_ist_cpy["question"] +
"\n\n### 输入:\n" + dataset_fine_tune_ist_cpy["support"])
dataset_fine_tune_ist_cpy["output"] =
dataset_fine_tune_ist_cpy["correct_answer"] autopilot_fields = ['input',
'output'] dataset_fine_tune =
Dataset.from_pandas(dataset_fine_tune_ist_cpy[autopilot_fields])
dataset_fine_tune.to_csv(train_dataset_s3_path, index=False) ```

### 创建 CreateAutoMLJobV2 训练作业

AutoMLV2 简化了训练、优化和部署机器学习(ML)模型的过程,自动化了 ML开发生命周期中的任务。它为创建高精度的模型提供了一种简单的方法,适用于特定问题类型,例如分类、回归、预测等。在此部分,我们通过使用 LLM微调作业的示例来介绍使用 AutoMLV2 训练模型的步骤。 在本项目中,我们使用 Meta Llama2-7B 模型。您可以选择  来替换该模型。

#### 定义文本生成配置

AutoMLV2 自动化了从数据预处理到模型训练和部署的整个 ML 过程。然而,为了使 AutoMLV2能够有效工作,提供正确的问题配置至关重要。该配置作为指引,帮助 SageMaker Autopilot理解您的问题性质并选择最合适的算法或方法。通过指定问题类型(如分类、回归、预测或微调)等详细信息,您为 AutoMLV2提供了必要的信息,使其能依据您的特定需求量身定制解决方案。

对于微调作业,配置内容包括确定要使用的模型及其访问配置,以及优化模型学习过程的超参数。以下是相关代码示例:

`python text_generation_config = AutoMLTextGenerationConfig( base_model_name=
"Llama2-7B", accept_eula= True, text_generation_hyper_params={"epochCount":
"3", "learningRate": "0.00001", "batchSize": "1", "learningRateWarmupSteps":
"1"}, )`

以下是 `text_generation_config` 中使用的每个参数的定义:

  * **base_model_name** – 要微调的基础模型名称。SageMaker Autopilot 支持微调多种 LLM。如果未提供值,默认模型将为 Falcon7BInstruct。
  * **accept_eula** – 控制对 ML 模型访问的配置文件。值设为 True 以接受模型最终用户许可协议(EULA)。这一设置对于某些模型(如 Meta Llama2-7B)是必需的,它要求在使用之前接受许可条款。
  * **epochCount** – 模型遍历整个训练数据集的次数。其值应为一个字符串,包含 1 到 10 的整数。一个 epoch 意味着 Meta Llama2-7B 模型已经接触到 10,000 个样本并有机会进行学习。您可以将其设置为 3,意味着模型将进行三次完整的遍历,或在模型未在三次遍历中收敛的情况下增加次数。
  * **learningRate** – 模型参数在训练过程中更新的步长。其值应为一个字符串,包含 0 到 1 之间的浮点值。对于像 Meta Llama2-7B 这样的 LLM,设置学习率为 0.00001 或 0.00002 是一个良好的标准。
  * **batchSize** – 在每次训练迭代中使用的数据样本数量。其值应为一个字符串,包含 1 到 64 之间的整数值。起始时设置为 1 以避免内存溢出错误。
  * **learningRateWarmupSteps** – 学习率在达到其目标或最大值之前逐渐增加的训练步骤数量。其值应为一个字符串,包含 0 到 250 之间的整数值。起始时设置为 1。

配置设置可以根据您的特定需求和选择的基础模型进行调整。

#### 启动 AutoMLV2 作业

接下来,通过提供问题配置详细信息、具有必要权限的 AWS 角色、用于作业识别的基本名称以及保存模型工件的输出路径来设置 AutoMLV2作业。要在管道步骤中启动训练过程,我们调用了 create_auto_ml_job_v2 方法。在以下代码片段中,create_auto_ml_job_v2方法被调用以创建具有特定输入的 AutoML 作业对象。`AutoMLJobInputDataConfig` 参数接受一个列表,其中包括
`AutoMLDataChannel`,该通道指定数据的类型(在此案例中为 ‘S3Prefix’)和训练数据集的位置(由
`train_dataset_s3_path.default_value` 提供),`channel_type` 设置为
‘training’,表示该数据集用于训练模型。

`python sagemaker_client.create_auto_ml_job_v2(
AutoMLJobName=event(AmazonSQS)队列中发送一个令牌,此操作触发 
函数来检查训练作业状态。如果作业完成,Lambda 函数会将成功消息返回给回调步骤,流程将继续进行下一步。

### 使用 AutoMLV2 进行实时推理部署模型

AutoMLV2 简化了模型的部署过程,自动化了从模型训练到部署的整个过程。它承担了选择最佳表现模型并为生产使用做好准备的重任。

此外,AutoMLV2 也简化了部署过程。它可以直接从最佳候选模型创建 SageMaker 模型,并通过几行代码将其部署到 SageMaker 端点。

在此部分,我们将查看将最佳表现模型部署到实时 SageMaker 端点的代码。

此管道步骤使用 ,此步骤运行无服务器的 Lambda 函数。我们使用 Lambda步骤,因为创建和部署 SageMaker 模型的 API 调用是轻量级的。

AutoMLV2 训练流程完成后的第一步是选择最佳候选,以确保选择最精确和高效的解决方案进行部署。我们使用方法
describe_auto_ml_job_v2 来检索特定 AutoMLV2 作业的详细信息。该方法提供有关 AutoMLV2作业当前状态、配置和输出的见解,使您能够监控进度并访问相关信息。以下是相关代码:

`python autopilot_job = sagemaker_client.describe_auto_ml_job_v2(
AutoMLJobName= event['autopilot_job_name']) best_candidate =
autopilot_job['BestCandidate']`

在 SageMaker Autopilot中,最佳候选模型是基于最小化交叉熵损失这一默认度量进行选择的,该度量衡量在微调过程中预测和实际单词分布之间的差异。此外,模型质量还通过 ROUGE分数(ROUGE-1、ROUGE-2、ROUGE-L 和 ROUGE-L-
Sum)评估,这些分数衡量机器生成的文本与人类撰写的参考文本之间的相似度,以及困惑度,后者衡量模型在序列中预测下一个词的能力。具有最低交叉熵和困惑度的模型,同时拥有强大的
ROUGE 分数,被认为是最佳候选。

确定最佳候选模型后,您可以创建一个 SageMaker 模型对象,封装训练模型工件和必要的依赖项。为此,我们使用 AutoML 作业对象的
`create_model` 方法:

`python best_candidate_name = best_candidate['CandidateName'] response =
sagemaker_client.create_model(ModelName=best_candidate_name,
PrimaryContainer={'Image':
autopilot_job["BestCandidate"]["InferenceContainers"][0].pop("Image"),
'ModelDataUrl':
autopilot_job["BestCandidate"]["InferenceContainers"][0].pop("ModelDataUrl"),
'ImageConfig': {'RepositoryAccessMode': 'Platform',}, 'Environment':
{"HUGGINGFACE_HUB_CACHE": "/tmp", "TRANSFORMERS_CACHE": "/tmp", "HF_MODEL_ID":
"/opt/ml/model"}}, ExecutionRoleArn=event["AutopilotExecutionRoleArn"])`

接下来,我们创建 SageMaker 端点配置并使用最佳候选模型为实时推理部署 SageMaker 端点。我们使用 ml.g5.12xlarge实例类型来部署模型。您可能需要增加配额以使用此实例。

`python endpoint_name = f"ep-{model_name}-automl" endpoint_config_name =
f"{model_name}-endpoint-config" endpoint_configuration =
sagemaker_client.create_endpoint_config( EndpointConfigName =
endpoint_config_name, ProductionVariants=[{'VariantName': "Variant-1",
'ModelName': model_name, 'InstanceType': "ml.g5.12xlarge",
'InitialInstanceCount': 1,}],) response =
sagemaker_client.create_endpoint(EndpointName=endpoint_name,
EndpointConfigName=endpoint_config_name) endpoint_arn =
response["EndpointArn"]`

## 推理管道

推理管道用于批量推理。它展示了一种部署和评估基础模型并在 SageMaker 模型注册表中注册其方法。以下图显示了

Leave a Reply

Required fields are marked *