产品展示

  • 首页 产品展示 将微调过的问答模型导入 Amazon Bedrock 作为自定义模型 机器学习博客

将微调过的问答模型导入 Amazon Bedrock 作为自定义模型 机器学习博客

2026-01-27 14:07:00
23

在Amazon Bedrock中导入经过微调的问题回答模型作为自定义模型

作者:Jay Pillai、Evandro Franco、Felipe Lopez、Paras Mehra、Ragha Prasad、Rupinder Grewal 和 Sandeep Singh,发表日期:2024年9月30日,链接: Amazon Bedrock 博客

关键要点

在这篇文章中,我们介绍了如何将经过微调的问题回答模型导入到Amazon Bedrock中。重要步骤包括:

使用Amazon SageMaker微调模型。将微调后的模型导入Amazon Bedrock。测试导入的模型。使用FMEval库评估导入的模型。

内容概要

Amazon Bedrock 是一项完全托管的服务,提供来自领先AI公司的高性能基础模型FMs,如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI和Amazon,用户可以通过单一API访问这些模型。同时,它还提供了一系列构建生成式AI应用的能力,确保安全、隐私和负责任的AI。

生成式AI常见的用例包括聊天机器人、虚拟助手、对话搜索和代理助手等,这些用例通常利用FMs提供响应。检索增强生成RAG是在这些用例中通过提供上下文来优化FMs输出的一种技术。建议对FM进行微调,以进一步优化其输出,使其更符合品牌和行业的声音或词汇。

现在处于预览阶段的Amazon Bedrock自定义模型导入功能,允许您将其他环境例如 Amazon SageMaker、Amazon Elastic Compute Cloud (Amazon EC2) 实例以及本地创建的自定义FMs导入到Amazon Bedrock中。本文是一个系列中的一部分,展示了将经过微调的FMs导入Amazon Bedrock的各种架构模式。

飞机代理加速器

本文提供了一个逐步的方法,通过使用SageMaker微调Mistral模型并将其导入到Amazon Bedrock中。我们使用OpenOrca数据集来微调Mistral模型,并利用SageMaker FMEval库评估已导入到Amazon Bedrock中的微调模型。

核心功能

自定义模型导入功能的主要特点如下:

特性说明导入微调模型允许您将微调的模型导入,并利用Amazon Bedrock的全托管无服务器能力。支持的模型架构目前支持Llama 2、Llama 3、Flan和Mistral模型架构,精度可选FP32、FP16和BF16,未来将支持更进一步的量化。模型导入通过API或控制台导入模型,模型权重需存放于Amazon S3。集成SageMaker可轻松集成可以通过引用SageMaker模型的Amazon资源名称ARN来利用已创建的模型。自动扩展Amazon Bedrock将自动根据流量模式扩展模型,并在未使用时将模型缩减到0,从而降低成本。

接下来,让我们深入探讨这一用例,看看如何轻松地使用此功能。

解决方案概述

截至本文撰写时,Amazon Bedrock中的自定义模型导入功能支持的模型架构和模式如图所示。

在本文中,我们将通过以下高级步骤逐步引导:

使用SageMaker微调模型。将微调后的模型导入Amazon Bedrock。测试导入的模型。使用FMEval库评估导入的模型。

以下图示展示了解决方案的架构:

该过程包括以下步骤:

我们使用SageMaker训练任务,通过SageMaker JupyterLab笔记本微调模型。该训练任务从Amazon Simple Storage Service (Amazon S3)读取数据集,并将模型写回Amazon S3,然后将其导入到Amazon Bedrock中。为了导入经过微调的模型,您可以使用Amazon Bedrock控制台、Boto3库或API。导入作业协调模型导入过程,并将模型从客户账户中提供。导入作业将所有模型工件从用户的账户复制到AWS管理的S3桶中。导入作业完成后,微调后的模型将在您的AWS账户中提供调用。我们在SageMaker笔记本中使用SageMaker FMEval库来评估导入的模型。

复制的模型工件将保留在Amazon Bedrock账户中,直到自定义导入的模型从Amazon Bedrock中删除。在AWS账户的S3桶中删除模型工件并不会删除Amazon Bedrock管理账户中的模型或相关工件。您可以使用Amazon Bedrock控制台、Boto3库或API,从Amazon Bedrock中删除导入的模型及其所有复制的工件。

此外,所有数据包括模型仍然保留在所选的AWS区域内。模型工件是通过虚拟私有云VPC端点导入到AWS操作的部署账户中,您还可以使用AWS Key Management Service (AWS KMS) 客户管理密钥对模型数据进行加密。

在以下部分中,我们将深入探讨这些步骤,以部署、测试和评估模型。

前置条件

在本篇文章中,我们使用Mistral7Bv03,因为与之前版本相比,它使用了更广泛的词汇。该模型易于微调,并且Mistral AI提供了示例微调模型。我们选择Mistral作为本用例,是因为该模型支持32000个令牌的上下文能力,且能流利使用英语、法语、意大利语、德语、西班牙语和多种编程语言。借助专家混合MoE功能,它能够在客户支持用例中获得更高的准确性。

Mistral7Bv03是Hugging Face模型库中的受限模型。您需要查看条款和条件并提交详细信息以申请访问。

我们将使用Amazon SageMaker Studio来预处理数据,并使用SageMaker训练任务微调Mistral模型。要设置SageMaker Studio,请参考启动Amazon SageMaker Studio。请参阅SageMaker JupyterLab文档以设置并启动JupyterLab笔记本。您将在SageMaker JupyterLab笔记本中提交SageMaker训练任务,以微调Mistral模型,示例代码可在GitHub仓库中找到。

使用QLoRA微调模型

为了微调Mistral模型,我们应用了QLoRA和参数高效微调 (PEFT) 优化技术。在提供的笔记本中,您使用全面分片数据并行 (FSDP) PyTorch API来执行分布式模型调整。您使用监督微调 (SFT) 来微调Mistral模型。

准备数据集

微调过程的第一步是准备和格式化数据集。在将数据集转换为Mistral默认指令格式后,您将其作为JSONL文件上传到S3桶中,如下代码所示:

将微调过的问答模型导入 Amazon Bedrock 作为自定义模型 机器学习博客

python

从数据集中心加载数据集

dataset = loaddataset(OpenOrca/OpenOrca)flandataset = datasetfilter(lambda example indice flan in example[id] withindices=True)flandataset = flandataset[train]traintestsplit(testsize=001 trainsize=0035)

columnstoremove = list(dataset[train]features)flandataset = flandatasetmap(createconversation removecolumns=columnstoremove batched=False)

保存数据集到s3

flandataset[train]tojson(f{traininginputpath}/traindatasetjson orient=records forceascii=False)flandataset[test]tojson(f{traininginputpath}/testdatasetjson orient=records forceascii=False)

您根据训练脚本(runfsdpqlorapy)中的指示,在SageMaker训练任务中将数据集转换为Mistral默认指令格式:

python

数据集

traindataset = loaddataset( json datafiles=ospathjoin(scriptargsdatasetpath traindatasetjson) split=train)testdataset = loaddataset( json datafiles=ospathjoin(scriptargsdatasetpath testdatasetjson) split=train)

模型 amp 编码器

编码器

tokenizer = AutoTokenizerfrompretrained(scriptargsmodelid usefast=True)tokenizerpadtoken = tokenizereostokentokenizerchattemplate = MISTRALCHATTEMPLATE

模板数据集

def templatedataset(examples) return {text tokenizerapplychattemplate(examples[messages] tokenize=False)}

traindataset = traindatasetmap(templatedataset removecolumns=[messages])testdataset = testdatasetmap(templatedataset removecolumns=[messages])

使用QLoRA优化微调

您通过将QLoRA的精度输入到训练脚本中,作为SageMaker训练作业参数来优化微调。QLoRA是一种高效的微调方法,可以在单个48GB GPU上微调一个65亿参数的模型并且仍然保持完整的16位微调任务性能。在此笔记本中,您通过以下代码使用bitsandbytes库设置量化配置:

python

模型

torchdtype = torchbfloat16 if trainingargsbf16 else torchfloat32quantstoragedtype = torchbfloat16

if scriptargsuseqlora print(f使用QLoRA {torchdtype}) quantizationconfig = BitsAndBytesConfig( loadin4bit=True bnb4bitusedoublequant=True bnb4bitquanttype=nf4 bnb4bitcomputedtype=torchdtype bnb4bitquantstorage=quantstoragedtype )else quantizationconfig = None

您使用基于QLoRA论文和Sebastian Raschka实验的LoRA配置,如以下代码所示。从Raschka实验中考虑的两个关键点是QLoRA以39的运行时间增加的代价实现了33的内存节省,并且确保LoRA应用于所有层,以最大化模型性能。

python

PEFT

基于QLoRA论文及Sebastian Raschka实验的LoRA配置

peftconfig = LoraConfig( loraalpha=8 loradropout=005 r=16 bias=none targetmodules=alllinear tasktype=CAUSALLM)

您使用SFTTrainer来微调Mistral模型:

python

训练

trainer = SFTTrainer( model=model args=trainingargs traindataset=traindataset datasettextfield=text evaldataset=testdataset peftconfig=peftconfig maxseqlength=scriptargsmaxseqlength tokenizer=tokenizer packing=True datasetkwargs={ addspecialtokens False # 我们使用特殊令牌进行模板化 appendconcattoken False # 无需添加额外的分隔符令牌 })

截至目前,只有合并适配器才能通过Amazon Bedrock的自定义模型导入功能进行支持。接下来我们看看如何将适配器与基础模型合并。

合并适配器

适配器是添加到预训练网络层之间的新模块。在微调过程中,通过将梯度反向传播通过一个被冻结的、4位量化的预训练语言模型,再将其输入到低秩适配器中,从而创建这些新模块。要将Mistral模型导入到Amazon Bedrock中,适配器需要与基础模型合并并以Safetensors格式保存。使用以下代码合并模型适配器并将其以Safetensors格式保存:

python

加载低精度的PEFT模型

model = AutoPeftModelForCausalLMfrompretrained( trainingargsoutputdir lowcpumemusage=True torchdtype=torchfloat16)

合并LoRA和基础模型并保存

model = modelmergeandunload()modelsavepretrained( sagemakersavedir safeserialization=True maxshardsize=2GB)

要将Mistral模型导入到Amazon Bedrock中,模型需要存在于S3桶中,且以可访问的未压缩目录存放,由用于导入作业的Amazon Bedrock服务角色使用。

将微调后的模型导入Amazon Bedrock

现在您已经完成了模型的微调,可以将模型导入到Amazon Bedrock中。在本节中,我们将演示如何使用Amazon Bedrock控制台或SDK导入模型。

使用Amazon Bedrock控制台导入模型

要通过Amazon Bedrock控制台导入模型,请参见使用自定义模型导入导入模型。请使用导入模型页面,如下截图所示,以从S3桶中导入模型。

成功导入微调模型后,您可以在Amazon Bedrock控制台中看到模型的列表。

使用SDK导入模型

AWS Boto3库支持将自定义模型导入到Amazon Bedrock中。您可以使用以下代码在笔记本中导入微调模型到Amazon Bedrock。此方法为异步方法。

pythonimport boto3import datetimebrclient = boto3client(bedrock regionname=ltawsregionnamegt)ptmodelnm = ltbedrockcustommodelnamegtptimpjbnm = f{ptmodelnm}{datetimedatetimenow()strftime(YmdMHS)}rolearn = ltltbedrockrolewithcustommodelimportpolicygtgtptmodelsrc = {s3DataSource {s3Uri f{ptpubmedmodels3path}}}resp = brclientcreatemodelimportjob(jobName=ptimpjbnm importedModelName=ptmodelnm roleArn=rolearn modelDataSource=ptmodelsrc)

测试导入的模型

现在您

在Amazon Personalize中推出解决方案的自动培训 机器学习博客

自动化训练:增强 Amazon Personalize 解决方案的灵活性关键要点Amazon Personalize 推出自动化训练功能,帮助模型保持推荐的准确性和相关性。定期更新解决方案以适应用户行为和偏好的变化,提高了模型的 predictive accuracy。用户可以轻松配置自动训练,提高...



监控从 Amazon SageMaker JumpStart 部署的 LLM 的嵌入漂移 机器学习博

监测从 Amazon SageMaker JumpStart 部署的 LLMs 嵌入漂移作者 Abdullahi Olaoye Randy DeFauw Shelbee Eigenbrode发布日期 2024年2月2日来源 AWS 机器学习博客 关键要点在本文中,我们将探讨如何监测生成 AI 工作负...