我们的邮箱地址:

stopped@126.com

致电我们:

13659630032

案例中心

  • Home
  • 使用 Llama2 和 Amazon SageMaker 进行 LoRA 微调模型的模型管理 机器学

使用 Llama2 和 Amazon SageMaker 进行 LoRA 微调模型的模型管理 机器学

2026-01-27 13:02:07 26

LoRA微调模型的管理:使用Llama2与Amazon SageMaker

重点摘要

在大数据和人工智能时代,企业不断探索利用这些技术以获取竞争优势。尤其是在生成式AI领域,基础模型FM具备强大的创新性和创造力。在微调现有基础模型时,Lowrank AdaptationLoRA成为了一种受欢迎的技术。本文将探讨在Amazon SageMaker中管理LoRA微调模型的最佳实践,包括使用QLoRA方法微调Llama2模型的具体步骤。

在大数据和人工智能的时代,企业不断寻求利用这些技术来获得竞争优势。当前生成式AI是人工智能中最热门的领域之一,原因不言而喻。生成式AI提供强大的解决方案,推动了创造力和创新的边界。在这些前沿解决方案的核心是基础模型FM,这是一种经过海量数据预训练的高端机器学习模型。这些基础模型在理解和生成类似人类文本方面展现出卓越的能力,使其成为各种应用的宝贵工具,从内容创作到客户支持自动化等均可广泛使用。

然而,这些模型并非没有挑战。由于其体积庞大,需要大量的数据和计算资源进行训练。此外,优化训练过程和调整参数也是一项复杂且迭代的工作,需要专业知识和细致的实验。这对许多希望建立自己基础模型的组织来说,构成了障碍。为了克服这一挑战,许多客户开始考虑微调现有基础模型。这是一种流行的技术,通过调整模型参数的一小部分以服务特定应用,同时保留模型中已有的知识。这使得组织能够利用这些模型的强大功能,同时减少为特定领域或任务定制的资源需求。

微调基础模型的主要方法有两种:传统微调和参数高效微调。传统微调是指更新预训练模型的所有参数以满足特定下游任务。与此相对的是,参数高效微调包含多种技术,允许在不更新所有原始模型参数的情况下对模型进行定制。其中一种技术称为低秩适配LoRA。它通过向预训练模型添加小的、任务特定的模块来实现训练,同时保持其余参数固定。

LoRA近期受到了广泛关注,原因有很多。它提供了更快的训练速度,减少了内存需求,并且可以将预训练模型重用于多个下游任务。更重要的是,基础模型和适配器可以分别存储,并随时组合,使得存储、分发和共享微调版本变得更加容易。然而,这也引入了一个新挑战:如何妥善管理这些新型微调模型?是将基础模型与适配器结合,还是将它们分开?在这篇文章中,我们将探讨在Amazon SageMaker上管理LoRA微调模型的最佳实践,以应对这一新兴问题。

安易加速器破解版永久免费

在SageMaker模型注册表中使用FMs

在本文中,我们将展示一个完整的示例,使用QLoRA方法微调Llama2大语言模型LLM。QLoRA结合了参数高效微调的优势以及4位/8位量化,进一步减少了微调基础模型所需的资源。我们将使用预训练的70亿参数Llama2模型,并在databricksdolly15k数据集上进行微调。像Llama2这样的LLM具备数十亿个参数,并在海量的文本数据集上进行了预训练。微调可以将LLM适配于下游任务,使用较小的数据集。然而,微调大型模型的计算成本相对较高,因此我们决定在微调过程中使用QLoRA方法进行权重量化,以降低计算费用。

在我们的示例中,有两个笔记本(llmfinetunecombinedwithregistryipynb与llmfinetuneseparatewithregistryipynb)。每个笔记本通过不同的方式处理LoRA微调模型,如下图所示:

首先,我们使用SageMaker Studio Notebooks下载包含70亿参数的预训练Llama2模型。像Llama2这样的LLM在特定领域数据的微调过程中展现了业界领先的自然语言处理NLP性能。接下来,我们使用QLoRA方法在databricksdolly15k数据集上对Llama2进行微调。QLoRA通过量化模型权重降低微调的计算成本。在微调过程中,我们将SageMaker Experiments Plus与Transformers API集成,自动记录梯度、损失等指标。然后,我们使用两种方法在SageMaker模型注册表中对微调后的Llama2模型进行版本控制:存储完整模型分别存储适配器和基础模型最后,我们使用Deep Java Library (DJL) Serving在SageMaker实时端点上托管微调后的Llama2模型。

在接下来的部分中,我们将深入探讨每个步骤,以展示SageMaker在不同LLM工作流中的灵活性,以及这些功能如何帮助优化模型的操作。

前提条件

为开始体验代码,必须完成以下前提条件:

创建一个SageMaker Studio域:使用Amazon SageMaker Studio,特别是Studio Notebooks,启动Llama2微调任务,并在SageMaker模型注册表中注册和查看模型。SageMaker Experiments也用于查看和比较Llama2微调作业日志训练损失/测试损失等。创建一个Amazon S3桶:需要访问一个S3桶以存储训练文档和模型权重。有关说明,请查阅创建桶。本文示例代码将使用SageMaker默认的S3桶,但您可以自定义为任何相关的S3桶。设置模型集合IAM权限:根据模型注册表集合开发者指南,更新SageMaker执行角色的资源组权限,以实施使用模型集合的模型注册表分组。同意Llama2的条款与条件:您需要接受使用Llama2基础模型的最终用户许可协议和可接受使用政策。

示例代码可在GitHub仓库中找到。这些笔记本文件经过测试,使用的是PyTorch 200 Python 310优化的GPU内核和mlg4dnxlarge实例类型。

Experiments Plus回调集成

Amazon SageMaker Experiments使您能够从任何集成开发环境IDE中组织、跟踪、比较和评估机器学习ML实验和模型版本,包括本地Jupyter笔记本,通过SageMaker Python SDK或boto3。这为记录模型指标、参数、文件、文档提供了灵活性,可以绘制不同指标的图表、捕捉各种元数据以及支持模型重现性。数据科学家可以快速通过可视化图表和表格比较模型的性能和超参数。他们还可以使用SageMaker Experiments下载已创建的图表,并与相关利益方共享模型评估结果。

训练LLM是一个缓慢、昂贵且迭代的过程。用户在大规模跟踪LLM实验非常重要,以防止模型调优体验不一致。HuggingFace Transformer APIs允许用户通过回调在训练任务期间跟踪指标。回调是“只读”代码块,可以自定义PyTorch Trainer中的训练循环行为,检查训练循环状态以便进行进度报告,或通过自定义逻辑记录在TensorBoard或SageMaker Experiments Plus中这些逻辑包含在本文代码库中。

您可以导入本文代码库中包含的SageMaker Experiments回调代码,如下代码块所示:

python

导入Experiments回调的自定义实现

from smexperimentscallback import SageMakerExperimentsCallback

创建带有SageMaker Experiments回调的Trainer实例

trainer = Trainer( model=model args=trainingargs traindataset=traindataset evaldataset=validationdataset datacollator=defaultdatacollator callbacks=[SageMakerExperimentsCallback] # 添加我们的Experiments Plus回调函数)

该回调将在训练运行过程中自动记录以下信息到SageMaker Experiments中:

训练参数和超参数模型训练和验证损失步长、周期、最终模型输入输出文档训练数据集、验证数据集、模型输出位置、训练调试器等

下面的图表展示了使用这些信息可以绘制的图表示例。

这使您可以通过SageMaker Experiments的分析功能轻松比较多个运行。您可以选择要比较的实验运行,它们将自动填充比较图表。

将微调模型注册到模型注册表集合

模型注册表集合是SageMaker模型注册表的一项功能,允许您对相关注册模型进行分组,并将其组织成层次结构,以提高大规模模型的可发现性。我们将使用模型注册表集合来跟踪基础模型及其微调变体。

完整模型复制方法

第一种方法是将基础模型和LoRA适配器合并,并保存完整的微调模型。以下代码展示了模型合并的过程,并使用modelsavepretrained()保存合并后的模型。

pythonif argsmergeweights

trainermodelsavepretrained(tempdir safeserialization=False)# 清理内存del modeldel trainertorchcudaemptycache()from peft import AutoPeftModelForCausalLM# 以fp16格式加载PEFT模型model = AutoPeftModelForCausalLMfrompretrained(    tempdir    lowcpumemusage=True    torchdtype=torchfloat16)  # 合并LoRA和基础模型并保存model = modelmergeandunload()        modelsavepretrained(    argssmmodeldir safeserialization=True maxshardsize=2GB)

在微调后将LoRA适配器与基础模型合并成一个单模型文档具有优缺点。合并后的模型是自包含的,可以独立管理和部署,而无需基础模型。该模型可以作为一个独立实体进行跟踪,版本名反映基础模型和微调数据。我们可以采用以下命名法:basemodelname 微调datasetname进行模型分组。可选地,模型集合可以关联原始模型和微调模型,不过由于合并后的模型是独立的,这也不是必需的。以下代码片段显示了如何注册微调模型。

python

模型包组变量

ftpackagegroupname = f{modelidreplace(/ )}{datasetname}ftpackagegroupdesc = QLoRA for model Mikael110/llama27b{datasetname}fp16modelpackagegroupinputdict = { ModelPackageGroupName ftpackagegroupname ModelPackageGroupDescription ftpackagegroupdesc Tags fttags}createmodelpackagegroupresponse = smclientcreatemodelpackagegroup(modelpackagegroupinputdict)

您可以使用训练估算器将模型注册到模型注册表中。

使用 Llama2 和 Amazon SageMaker 进行 LoRA 微调模型的模型管理 机器学

pythoninferenceimageuri = sagemakerimageurisretrieve( djldeepspeed region=region version=0230)print(f即将使用的图像是 gt {inferenceimageuri})

modelpackage = huggingfaceestimatorregister( contenttypes=[application/json] responsetypes=[application/json] inferenceinstances=[ mlp216xlarge ] imageuri = inferenceimageuri customermetadataproperties = {trainingimageuri huggingfaceestimatortrainingimageuri()} #存储训练图像的URL modelpackagegroupname=ftmodelpkggroupname approvalstatus=Approved)

modelpackagearn = modelpackagemodelpackagearnprint(模型包ARN modelpackagearn)

从模型注册表中,您可以检索模型包并直接部署该模型。

pythonendpointname = f{namefrombase(modelgroupforbase)}endpoint

modelpackagedeploy( initialinstancecount=1 instancetype=mlg512xlarge endpointname=endpointname)

但这种方法也有缺点。模型的合并导致存储效率低下和冗余,因为基础模型在每个微调版本中都会重复。随着模型大小和微调模型数量的增加,这将导致存储需求呈指数增长。例如,Llama2的70B模型约为13 GB,而微调后的模型为136 GB。在每次微调后,模型的96需要重复。此外,分发和共享超大模型文件也变得更加困难,随着模型大小和微调工作的增加,文件传输和管理的成本也随之上升。

单独适配器和基础方法

第二种方法侧重于将基础权重和适配器权重分开,作为单独的模型组件保存,并在运行时按顺序加载它们。

pythonelse # 保存微调后的LoRA模型及其令牌以供推理使用 trainermodelsavepretrained( argssmmodeldir safeserialization=True ) tokenizersavepretrained( argssmmodeldir )

保存基础和适配器权重与完整模型复制方法有相似的优缺点。其中一个优点是可以节省存储空间。微调模型中占比最大的基础权重只需保存一次,并可以与其他为不同任务微调的适配器权重共享。例如,Llama27B的基础权重约为13 GB,而每个微调任务只需存储约06 GB的适配器权重,实现了95的空间节省。另一个优点是基础权重可以单独管理,而不依赖于适配器权重,使用基础权重仅模型注册表的情况下,非常适合在没有互联网网关的VPC模式下运行的SageMaker域,因为基础权重可以在不经过互联网的情况下访问。

为基础权重创建模型包组

python

创建模型包组

basepackagegroupname = modelidreplace(/ )basepackagegroupdesc = 来源 https//huggingfaceco/Mikael110/llama27bguanacofp16modelpackagegroupinputdict = { ModelPackageGroupName basepackagegroupname ModelPackageGroupDescription basepackagegroupdesc Tags basetags}createmodelpackagegroupresponse = smclientcreatemodelpackagegroup(modelpackagegroupinputdict)

创建模型包组Arn arnawssagemakeruswest2376678947624modelpackagegroup/Mikael110llama27bguanacofp16

注册基础模型权重

pythonfrom sagemakerhuggingface import HuggingFaceModel

创建Hugging Face模型类

huggingfacemodel = HuggingFaceModel( transformersversion=428 pytorchversion=20 pyversion=py310 modeldata=modeldatauri # 这是指向您的基础权重的S3路径,格式为targz role=role)

response = huggingfacemodelregister( contenttypes=[application/json] responsetypes=[application/json] inferenceinstances=[ mlp216xlarge ] transforminstances=[ mlp216xlarge ] modelpackagegroupname=basemodelpkggroupname approvalstatus=Approved)

为QLoRA权重创建模型包组

以下代码展示了如何将QLoRA

发表评论