使用 Amazon SageMaker Pipelines 和 MLflow 进行大规模 LLM 实
- 34
扩大 LLM 实验:使用 Amazon SageMaker Pipelines 和 MLflow
作者:Jagdeep Singh Soni、Kirit Thadaka、Piyush Kadam 和 Sokratis Kartakis日期:2024 年 7 月 24 日分类:高级 (300), Amazon SageMaker, Amazon SageMaker Studio, 生成式 AI, 技术操作指南, 思想领导力原文链接
重点内容
大规模语言模型LLM在自然语言处理任务中取得了显著成功,但在特定领域或任务中的泛化能力可能有限。本文探讨通过微调来定制 LLM,介绍成功实验的关键考虑因素,以及如何利用 Amazon SageMaker 与 MLflow 简化这一过程。使用 SageMaker Pipelines 可以高效管理实验、模型版本控制和部署。在不同的自然语言处理NLP任务中,大规模语言模型LLM取得了显著的成功,但它们在特定领域或任务上的泛化能力可能不佳。因此,需要对 LLM 进行定制,以适应您的独特用例,从而提高其在特定数据集或任务上的表现。可以通过提示工程、检索增强生成RAG或微调等方法来定制模型。对定制后的 LLM 进行评价,以确保改进了模型在特定任务或数据集上的表现,是非常必要的。
在本文中,我们将深入探讨使用微调来定制 LLM,探索成功实验的关键考虑因素,以及 Amazon SageMaker 与 MLflow 如何简化这一过程。
LLM 选择与微调之旅
在使用 LLM 时,客户的需求往往各不相同。有些客户可能希望评估和选择最适合其用例的预训练基础模型FM,而其他人可能需要微调现有模型以适应特定任务或领域。以下是两种客户的旅程:
选择与评估基础模型:您可以评估不同预训练 FM 在特定数据集和指标上的表现,然后根据评估结果选择最佳模型。这可以通过 Amazon SageMaker JumpStart 和 Amazon SageMaker Clarify 等服务完成,可以按规模进行,如在 Operationalize LLM Evaluation at Scale using Amazon SageMaker Clarify and MLOps services 中所述。以下图表展示了一个示例架构。tk加速器免费下载针对特定任务或领域的 LLM 微调:在这个用户旅程中,您需要对 LLM 进行微调,以适应特定任务或领域数据。这需要多次实验,每次实验可能涉及不同的数据集、超参数、提示和微调技术如全量微调或参数高效微调 PEFT组合。每次迭代可以视为一次实验内的运行。微调 LLM 对于数据科学家和机器学习ML工程师来说可能是一个复杂的工作流。为了简化这一过程,您可以使用 Amazon SageMaker 搭配 MLflow 和 SageMaker Pipelines 来进行大规模微调和评估。在本文中,我们将详细描述解决方案的步骤,并提供对应的 GitHub 代码。
解决方案概览
运行数百个实验、比较结果并跟踪 ML 生命周期可能变得非常复杂。这时,MLflow 可以帮助您简化 ML 生命周期,从数据准备到模型部署。通过将 MLflow 集成到您的 LLM 工作流中,您可以高效管理实验跟踪、模型版本控制和部署,实现可重现性。利用 MLflow,您可以跟踪和比较多个 LLM 实验的表现,识别表现最佳的模型,并自信地将其部署到生产环境中。
您可以使用 SageMaker Pipelines 创建工作流,以便能够使用简洁的 Python 代码在每一步中准备数据、微调模型和评估模型表现。
您现在可以使用 SageMaker 管理的 MLflow 在大规模上运行 LLM 微调和评估实验。具体来说:
MLflow 可以管理微调实验的跟踪、不同运行的评估结果比较、模型版本控制、部署及配置如数据和超参数。SageMaker Pipelines 可以根据实验配置来协调多个实验。以下图显示了解决方案的概述。
前置条件
在开始之前,请确保具备以下前置条件:
Hugging Face 登录令牌:您需要一个 Hugging Face 登录令牌以访问本文中使用的模型和数据集。有关生成令牌的说明,请参见 用户访问令牌。SageMaker 访问权限与所需的 IAM 权限:您需要具备访问 SageMaker 的能力以及必要的 AWS 身份和访问管理IAM权限,才能创建和管理资源。确保您具备创建笔记本、部署模型和执行本文中列出其他任务所需的权限。有关快速入门的信息,请参见 快速设置 Amazon SageMaker。请按照 此处 的说明确保您已正确配置用于 MLflow 的 IAM 角色。设置 MLflow 跟踪服务器
MLflow 在 Amazon SageMaker Studio 中直接集成。要创建一个用于跟踪实验和运行的 MLflow 跟踪服务器,请完成以下步骤:
在 SageMaker Studio 控制台中,选择导航面板中的 MLflow 下的 应用程序。在 名称 中输入合适的服务器名称。在 Artifact storage location (S3 URI) 中输入 Amazon Simple Storage Service (Amazon S3) 存储桶的位置。选择 创建。跟踪服务器可能需要最多 20 分钟才能初始化并变得可用。运行时,您可以记录它的 ARN,以便在 llmfinetuningexperimentsmlflowipynb 笔记本中使用。ARN 将具有以下格式:
arnawssagemakerltregiongtltaccountidgtmlflowtrackingserver/lttrackingservernamegt
有关后续步骤,请参考本文中提供的详细描述,以及 llmfinetuningexperimentsmlflowipynb 笔记本中概述的逐步说明。您可以在 Amazon SageMaker Studio Classic 或 SageMaker JupyterLab 中启动该笔记本。
SageMaker Pipelines 的规模实验概述
我们使用 SageMaker Pipelines 来协调 LLM 微调与评估实验。使用 SageMaker Pipelines,您可以:
同时运行多次 LLM 实验迭代,从而减少总体处理时间和成本随着工作负载需求的变化,轻松扩展或缩减规模通过 MLflow 集成监控并可视化每次实验运行的表现调用下游工作流以便于进一步分析、部署或模型选择MLflow 与 SageMaker Pipelines 的集成需要跟踪服务器的 ARN。您还需要将 mlflow 和 sagemakermlflow Python 包作为管道设置中的依赖项添加。然后,您可以在任何管道步骤中使用 MLflow,代码示例如下:
pythonmlflowarn= # 获取步骤 1 的跟踪 ARNexperimentname= # 您选择的实验名称mlflowsettrackinguri(mlflowarn)mlflowsetexperiment(experimentname)
with mlflowstartrun(runname=runname) as run # 相应步骤的代码
使用 MLflow 日志记录数据集
借助 MLflow,您可以与超参数及模型评估等其他关键指标一起记录数据集信息。这使得跟踪和可重现不同运行的实验成为可能,从而使您能够更明智地判断哪些模型在特定任务或领域的表现最佳。通过使用 MLflow 记录数据集,您可以存储元数据,如数据集描述、版本号和数据统计信息,与 MLflow 运行一起保存。
在预处理步骤中,您可以记录训练数据和评估数据。在这个示例中,我们从 Hugging Face 数据集中下载数据。我们使用 HuggingFaceH4/norobots 进行微调和评估。首先,您需要设置 MLflow 跟踪 ARN 和实验名称以记录数据。在处理数据并选择所需的行数后,您可以使用 MLflow 的 loginput API 记录数据。请参见以下代码:
pythonmlflowsettrackinguri(mlflowarn)mlflowsetexperiment(experimentname)
dataset = loaddataset(datasetname split=train)
数据处理实现
使用 MLflow 记录数据
dftrain = pdDataFrame(dataset)trainingdata = mlflowdatafrompandas(dftrain source=traininginputpath)mlflowloginput(trainingdata context=training) dfevaluate = pdDataFrame(evaldataset)evaluationdata = mlflowdatafrompandas(dfevaluate source=evalinputpath)mlflowloginput(evaluationdata context=evaluation)
使用 LoRA 和 MLflow 对 Llama 模型进行微调
为了简化使用低秩适配LoRA微调 LLM 的过程,您可以使用 MLflow 跟踪超参数并保存最终模型。您可以针对训练实验不同的 LoRA 参数进行实验,并将这些参数与其他关键指标如训练损失和评估指标一起记录。这使您能够跟踪微调过程,识别出给定数据集和任务的最有效 LoRA 参数。
在本示例中,我们使用 Hugging Face 的 PEFT 库对 Llama 3 模型进行微调。借助该库,我们可以执行 LoRA 微调,能提供更快的训练并减少内存需求,同时也能在较少训练数据的情况下效果很好。
我们使用 SageMaker SDK 中的 HuggingFace 类在 SageMaker Pipelines 中创建训练步骤。训练的实际实现定义在 llama3finetuningpy 中。与上一步相同,我们需要设置 MLflow 跟踪 URI 并使用相同的 runid:
pythonmlflowsettrackinguri(argsmlflowarn)mlflowsetexperiment(argsexperimentname)
with mlflowstartrun(runid=argsrunid) as run # 实现代码

使用来自 Transformers 的 Trainer 类时,您可以指定要报告的训练参数位置。在我们的案例中,我们希望将所有训练参数记录到 MLflow:
pythontrainer = transformersTrainer( model=model traindataset=lmtraindataset evaldataset=lmtestdataset args=transformersTrainingArguments( perdevicetrainbatchsize=perdevicetrainbatchsize perdeviceevalbatchsize=perdeviceevalbatchsize gradientaccumulationsteps=gradientaccumulationsteps gradientcheckpointing=gradientcheckpointing loggingsteps=2 numtrainepochs=numtrainepochs learningrate=learningrate bf16=True savestrategy=no outputdir=outputs reportto=mlflow runname=llama3peft ) datacollator=transformersDataCollatorForLanguageModeling(tokenizer mlm=False))
当训练完成后,您可以保存完整模型,因此您需要将适配器权重合并到基础模型中:
pythonmodel = PeftModelfrompretrained(basemodel newmodel)model = modelmergeandunload()savedir = /opt/ml/model/modelsavepretrained(savedir safeserialization=True maxshardsize=2GB)
重新加载分词器以进行保存
tokenizer = AutoTokenizerfrompretrained(argsmodelid trustremotecode=True)tokenizerpadtoken = tokenizereostokentokenizerpaddingside = righttokenizersavepretrained(savedir)
合并后的模型可以与模型签名一起记录到 MLflow,该签名定义了模型输入和输出的预期格式,包括推理所需的任何附加参数:
pythonparams = { topp 09 temperature 09 maxnewtokens 200}
signature = infersignature(inputs generatedtext params=params)
mlflowtransformerslogmodel( transformersmodel={model model tokenizer tokenizer} signature=signature artifactpath=model modelconfig=params)
评估模型
模型评估是选择最佳训练参数以微调 LLM 针对特定数据集的关键步骤。在此示例中,我们使用 MLflow 提供的内置评估功能及其 mlflowevaluate() API。对于问答模型,我们使用默认评估器记录确切匹配度、令牌计数、有毒性,FleschKincaid 年级水平,以及 ARI 年级水平。
MLflow 可以加载在微调步骤中记录的模型。基础模型将从 Hugging Face 下载,适配器权重将从记录的模型中下载。请参见以下代码:
pythonloggedmodel = fruns/{preprocessstepret[runid]}/modelloadedmodel = mlflowpyfuncloadmodel(modeluri=loggedmodel)results = mlflowevaluate( model=loadedmodel data=df targets=answer modeltype=questionanswering evaluatorconfig={colmapping {inputs question}})
这些评估结果以与记录数据处理和微调步骤相同的运行记录到 MLflow 中。
创建管道
在准备好所有步骤的代码后,您可以创建管道:
pythonfrom sagemaker import getexecutionrole
pipeline = Pipeline(name=pipelinename steps=[evaluatefinetunedllama7binstructionmlflow] parameters=[loraconfig])
您可以通过 SageMaker Studio UI 运行管道,或使用笔记本中的代码片段:
pythonexecution1 = pipelinestart()
比较实验结果
启动管道后,您可以在 MLflow 中跟踪实验。每个运行将记录预处理、微调和评估步骤的详细信息。预处理步骤将记录训练和评估数据,而微调步骤将记录所有训练参数和 LoRA 参数。您可以选择这些实验并比较结果,以找到最佳训练参数和最佳微调模型。
您可以从 SageMaker Studio 打开 MLflow UI。
然后,您可以选择实验以过滤该实验的运行。您可以选择多个运行进行比较。
在比较时,您可以分析评估得分与训练参数之间的关系。
![比较训练参数和结果](https//d2908q01vomqb2cloudfrontnet/f1f836cb4ea6efb2a0b1b99f41ad8b103eff