创建 AutoML 作业,使用 API 微调文本生成模型 - 亚马逊 SageMaker AI

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建 AutoML 作业,使用 API 微调文本生成模型

大型语言模型 (LLM) 擅长多种生成式任务,包括文本生成、摘要、完成工作、问题回答等。它们之所以有如此出色的表现,可以归结于它们庞大的规模以及针对不同数据集和各种任务进行的广泛训练。但是,在医疗保健和金融服务等特定领域中,这些模型可能需要进行自定义微调,以适应独特的数据和使用场景。通过根据特定领域进行量身定制的训练,可以改进 LLM 的性能,为目标应用提供准确性更高的输出。

Autopilot 提供了对一系列预训练生成式文本模型进行微调的功能。特别是,Autopilot 支持对由 JumpStart 支持的通用大型语言模型(LLM)进行基于指令的微调

注意

支持 Autopilot 中微调的文本生成模型目前只能在 SageMaker Canvas 支持的区域中访问。有关 SageMaker Canvas 支持区域的完整列表,请参阅 SageMaker Canvas 文档。

微调预训练模型需要包含清晰指令的特定数据集,用于指导模型如何针对任务生成输出或行为。模型从数据集中学习,调整其参数以遵从提供的指令。基于指令的微调包括使用标记的示例,将其格式化为提示-回答对,并以指令的形式措辞。有关微调的更多信息,请参阅微调基础模型

以下指南概述的过程中使用 SageMaker API 参考,创建 Amazon SageMaker Autopilot 作业作为试点实验,用于对文本生成 LLM 进行微调。

注意

文本和映像分类、时间序列预测和大型语言模型微调等任务都可以通过 AutoML REST API 的第 2 版独家实现。如果您选择的语言是 Python,则可以直接参考 Amazon SageMaker Python SDK 的 适用于 Python (Boto3) 的 AWS SDKAutoMLV2 对象

喜欢用户界面便利性的用户可以使用 Amazon SageMaker Canvas 访问预训练模型和生成式人工智能基础模型,或创建针对特定文本、映像分类、预测需求或生成式人工智能的定制模型。

要以编程方式创建用于微调 LLM 的 Autopilot 实验,您可以使用任何 Amazon SageMaker Autopilot 或 AWS CLI 支持的语言调用 CreateAutoMLJobV2 API。

有关此 API 操作如何转换为所选语言中函数的信息,请参阅 CreateAutoMLJobV2 中的另请参阅部分并选择 SDK。例如,对于 Python 用户,请参阅 适用于 Python (Boto3) 的 AWS SDK 中 create_auto_ml_job_v2 的完整请求语法。

注意

Autopilot 可以微调大型语言模型,无需对多个候选项进行训练和评估。取而代之的是,Autopilot 使用您的数据集直接微调目标模型,以增强默认的目标指标,即交叉熵损失。在 Autopilot 中微调语言模型不需要设置 AutoMLJobObjective 字段。

对 LLM 进行微调后,您可以在进行 DescribeAutoMLJobV2 API 调用时,通过 BestCandidate 访问各种 ROUGE 分数来评估其性能。该模型还提供了有关其训练和验证损失以及困惑度的信息。有关评估微调模型生成的文本质量的指标完整列表,请参阅在 Autopilot 中微调大型语言模型的指标

先决条件

使用 Autopilot 在 SageMaker AI 中创建微调实验之前,请务必采取以下步骤:

  • (可选)选择要微调的预训练模型。

    有关可在 Amazon SageMaker Autopilot 中进行微调的预训练模型列表,请参阅支持进行微调的大型语言模型。模型选择并非强制性;如果未指定模型,Autopilot 会自动默认为模型 Falcon7BInstruct

  • 创建指令数据集。请参阅 数据集文件类型和输入数据格式,了解基于指令的数据集的格式要求。

  • 将您的数据集置于 Amazon S3 存储桶中。

  • 向您用于运行实验的 SageMaker AI 执行角色,授予对包含输入数据的 Amazon S3 存储桶的完全访问权限。

    • 有关检索 SageMaker AI 执行角色的信息,请参阅获取执行角色

    • 有关向 SageMaker AI 执行角色授予权限以便访问 Amazon S3 中一个或多个特定存储桶的信息,请参阅创建执行角色中的“向 SageMaker AI 执行角色添加其他 Amazon S3 权限”

  • 此外,您还应为您的执行角色提供必要的权限,以便访问 JumpStart 使用的默认存储 Amazon S3 存储桶。在 JumpStart 中存储和检索预训练模型构件时,需要使用该访问权限。要授予对此 Amazon S3 存储桶的访问权限,您必须针对执行角色创建新的内联自定义策略。

    下面是一个策略示例,在配置 us-west-2 中的 AutoML 微调作业时,您可以在 JSON 编辑器中使用该策略:

    JumpStart 的存储桶名称遵循预先确定的规律,该规律取决于 AWS 区域。您必须相应地调整存储桶的名称。

    { "Sid": "Statement1", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::jumpstart-cache-prod-us-west-2", "arn:aws:s3:::jumpstart-cache-prod-us-west-2/*" ] }

完成此操作后,您可以在 Autopilot API 请求中使用此执行角色的 ARN。

必需参数

调用 CreateAutoMLJobV2 创建用于 LLM 微调的 Autopilot 实验时,必须提供以下值:

  • AutoMLJobName,用于指定您作业的名称。名称应为 string 类型,最小长度为 1 个字符,最大长度为 32 个字符。

  • AutoMLJobInputDataConfig 中至少有一个 training 类型的 AutoMLJobChannel。此通道指定微调数据集所在 Amazon S3 存储桶的名称。您可以选择定义 validation 通道。如果未提供验证通道,并且在 AutoMLDataSplitConfig 中配置了 ValidationFraction,则使用此分数将训练数据集随机划分为训练集和验证集。此外,您可以为数据集指定内容的类型(CSV 或 Parquet 文件)。

  • 类型为 TextGenerationJobConfigAutoMLProblemTypeConfig 用于配置训练作业的设置。

    具体而言,您可以在 BaseModelName 字段中指定要微调的基础模型的名称。有关可在 Amazon SageMaker Autopilot 中进行微调的预训练模型列表,请参阅支持进行微调的大型语言模型

  • OutputDataConfig,指定用于存储 AutoML 作业构件的 Amazon S3 输出路径。

  • RoleArn,指定用于访问您的数据的角色的 ARN。

以下示例提供了完整请求格式,用于对 CreateAutoMLJobV2 发出 API 调用以微调 (Falcon7BInstruct) 模型。

{ "AutoMLJobName": "<job_name>", "AutoMLJobInputDataConfig": [ { "ChannelType": "training", "CompressionType": "None", "ContentType": "text/csv", "DataSource": { "S3DataSource": { "S3DataType": "S3Prefix", "S3Uri": "s3://<bucket_name>/<input_data>.csv" } } } ], "OutputDataConfig": { "S3OutputPath": "s3://<bucket_name>/output", "KmsKeyId": "arn:aws:kms:<region>:<account_id>:key/<key_value>" }, "RoleArn":"arn:aws:iam::<account_id>:role/<sagemaker_execution_role_name>", "AutoMLProblemTypeConfig": { "TextGenerationJobConfig": { "BaseModelName": "Falcon7BInstruct" } } }

所有其他参数都是可选的。

可选参数

以下各节提供了一些可以传递给微调 AutoML 作业的可选参数的详细信息。

您可以提供自己的验证数据集和自定义的数据拆分比率,也可以让 Autopilot 自动拆分数据集。

每个 AutoMLJobChannel 对象(参见必需参数 AutoMLJobInputDataConfig)都有一个 ChannelType,可以将其设置为 trainingvalidation 值,指定在构建机器学习模型时如何使用数据。

数据来源至少需要一个,最多可以有两个:一个用于训练数据,一个用于验证数据。如何将数据拆分为训练和验证数据集,取决于您有一个还是两个数据来源。

  • 如果您只有一个数据来源,则默认情况下 ChannelType 设置为 training,并且必须具有此值。

    • 如果未设置 AutoMLDataSplitConfig 中的 ValidationFraction 值,则默认情况下,将使用来自此来源中数据的 0.2 (20%) 进行验证。

    • 如果 ValidationFraction 设置为介于 0 和 1 之间的值,则根据指定的值拆分数据集,该值指定用于验证的数据集的比例。

  • 如果您有两个数据来源,则其中一个 AutoMLJobChannel 对象的 ChannelType 必须设置为默认值 training。另一个数据来源的 ChannelType 必须设置为 validation。这两个数据来源必须具有相同的格式(CSV 或 Parquet)和相同的架构。在这种情况下,您不可为 ValidationFraction 设置值,因为每个来源的所有数据都用于训练或验证。设置此值会导致错误。

利用 Autopilot,您可以自动将微调模型部署到端点。要为经过微调的模型启用自动部署,请在 AutoML 作业请求中包括 ModelDeployConfig。这样便可以将经过微调的模型部署到 SageMaker AI 端点。以下是可供自定义的配置。

对于需要在微调前接受最终用户许可协议的模型,您可以在配置 AutoMLProblemTypeConfig 时将 ModelAccessConfigAcceptEula 属性设置为 TextGenerationJobConfig 中的 True,从而接受 EULA。

在配置 AutoMLProblemTypeConfig 时,您可以在 TextGenerationJobConfigTextGenerationHyperParameters 属性中设置超参数值,从而优化文本生成模型的学习过程。

Autopilot 允许在所有模型中设置四个通用超参数。

  • epochCount:其值应是一个字符串,包含 110 范围内的整数值。

  • batchSize:其值应是一个字符串,包含 164 范围内的整数值。

  • learningRate:其值应是一个字符串,包含 01 范围内的浮点数值。

  • learningRateWarmupSteps:其值应是一个字符串,包含 0250 范围内的整数值。

有关每个超参数的更多详情,请参阅 优化文本生成模型学习过程的超参数

下面的 JSON 示例显示了传递给 TextGenerationJobConfig 的 TextGenerationHyperParameters 字段,其中配置了所有四个超参数。

"AutoMLProblemTypeConfig": { "TextGenerationJobConfig": { "BaseModelName": "Falcon7B", "TextGenerationHyperParameters": {"epochCount":"5", "learningRate":"0.000001", "batchSize": "32", "learningRateWarmupSteps": "10"} } }