在亚马逊Bedrock上导入经过微调的Meta Llama 3模型,以生成SQL查询 机器学习博客
  • 17

在 Amazon Bedrock 上导入微调的 Meta Llama 3 模型以生成 SQL 查询

关键要点

Amazon Bedrock 是一个全托管服务,可以通过单一 API 访问多个领先 AI 公司的高性能基础模型(FMs)。最近,AWS 宣布预览了 Amazon Bedrock 自定义模型导入功能,可以将其他环境如 SageMaker创建的模型导入。本文展示了如何在 SageMaker 上微调 Meta Llama 3 以生成 SQL 查询,并将该模型导入 Amazon Bedrock。

Amazon Bedrock 是一个完全托管的服务,提供来自多个顶尖 AI 公司的高性能基础模型(FMs),如 AI21 Labs、Anthropic、Cohere、Meta、Mistral AI 和 Stability AI。该平台还提供构建生成式 AI 应用所需的广泛功能,同时确保安全性、隐私和负责任的 AI 实践。

虽然一些基础模型是公开可用的,但以安全和可扩展的方式部署定制的基础模型以支持生成式 AI 应用并不简单。大型模型的托管涉及实例类型和部署参数选择的复杂性。为了解决这些挑战,AWS 最近宣布了 Amazon Bedrock 自定义模型导入的预览版,此功能使您可以将其他环境中创建的定制模型导入到 Amazon Bedrock 中。通过简单的 API,模型的部署和调用过程得以简化。目前,自定义模型导入支持对多种模型架构如 Meta Llama 2 和 Llama 3、Flan、Mistral及其精度FP32、FP16 和 BF16进行导入,从而按需服务模型并提供预配置的吞吐量。

定制基础模型可以为特定领域或任务量身打造其能力,释放显著价值。本文是关于模型定制的一系列文章中的第一篇,旨在显示如何将微调模型导入到 Amazon Bedrock,从而简化构建可扩展和安全的生成式 AI 应用的过程。通过展示微调模型的部署过程,我们希望为数据科学家、机器学习工程师和应用开发者提供帮助,以充分发挥基础模型的潜力,同时满足独特的应用需求。

在本文中,我们演示了如何在 SageMaker 上微调 Meta Llama 3 8B,使其专注于 SQL 查询的生成文本到 SQL。Meta Llama 3 8B 是一个相对较小的模型,在性能和资源效率之间取得了平衡。AWS 客户已经探索了微调 Meta Llama 3 8B 以生成 SQL 查询,特别是在使用非标准 SQL 方言时,并请求将他们定制的模型导入 Amazon Bedrock,从而利用其托管基础设施与安全性。

解决方案概述

我们将演示使用 SageMaker 微调基础模型并通过 Amazon Bedrock 导入和评估微调模型以生成 SQL 查询的步骤。完整的工作流程如下图所示,涵盖以下步骤:

步骤描述1用户调用 SageMaker 训练任务,使用 QLoRA 微调模型并将权重存储在用户账户的 Amazon S3 存储桶中。2微调任务完成后,用户使用 Amazon Bedrock 控制台运行模型导入作业,该步骤将自动运行步骤 35。3Amazon Bedrock 服务在 AWS 运营的部署账户中启动导入作业。4模型工件从用户的账户复制到 AWS 管理的 S3 存储桶中。5导入作业完成后,微调模型将可以被调用。

所有数据均保留在选定的 AWS 区域内,模型工件通过 VPC 端点导入到 AWS 运营的部署账户,并且您可以使用自己的 Amazon 密钥管理服务 (AWS KMS) 密钥对模型数据进行加密。微调和评估的脚本可在 GitHub 仓库 中找到。

您的模型工件的副本存储在 AWS 运营的部署账户中,此副本将在自定义模型被删除之前一直保留。在用户账户中删除工件不会删除 AWS 运营账户中的模型或工件。如果将不同版本的模型导入 Amazon Bedrock,每个版本将作为独立项目管理,并具有自己的工件集。您可以对模型和导入作业进行标记,以跟踪不同的项目和版本。

Meta Llama 3 8B 是一个在 Hugging Face 上进行访问限制的模型,这意味着用户在下载和定制模型之前必须获得访问权限。您需要登录到您的 Hugging Face 帐户,阅读 Meta Llama 3 可接受使用政策,并提交联系信息以获得访问权限。该过程可能需要几个小时。

我们使用 Hugging Face 上可用的 sqlcreatecontext 数据集进行微调。该数据集包含 78577 个元组,包含上下文表模式、问题以自然语言表达的查询和答案SQL 查询。在进一步进行之前,请查阅有关该数据集的 许可信息。

魔戒加速器官网

我们使用 Amazon SageMaker Studio 创建远程微调作业,该作业将作为 SageMaker 训练任务 运行。SageMaker Studio 是一个端到端机器学习ML开发的统一网页界面。如果您需要帮助配置 SageMaker Studio 域和 JupyterLab 环境,请参阅 启动 Amazon SageMaker Studio。该训练作业将使用 QLoRA 和 PyTorch 的 FullyShardedDataParallel API (FSDP) 微调 Meta Llama 3 模型。QLoRA 将预训练语言模型量化为 4 位,并附加较小的低秩适配器LoRA,这些适配器将与我们的训练数据一起微调。PyTorch FSDP 是一种并行技术,可在多个 GPU 之间分割模型以实现高效训练。有关完整代码示例,请参见以下 笔记本。

数据准备

在数据准备阶段,我们使用以下提示模板插入特定指令以解释上下文并满足请求,同时将修改后的训练数据集存储为 JSON 文件,并上传到 Amazon S3:

pythonsystemmessage = 您是一个强大的文本到 SQL 模型。您的工作是回答有关数据库的问题。

def createconversation(record) sample = {messages [ {role system content systemmessage f可以使用以下表模式作为上下文 {record[context]}} {role user content f返回 SQL 查询以回答以下问题 {record[question]}} {role assistant content f{record[answer]}} ]} return sample

微调 Meta Llama 3 8B 模型

有关微调脚本的完整描述,请参见 notebook 中定义的 runfsdpqlorapy 文件。以下代码段描述了 QLoRA 作业的配置:

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

在亚马逊Bedrock上导入经过微调的Meta Llama 3模型,以生成SQL查询 机器学习博客

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

训练器类基于 Hugging Face 的监督微调训练器SFT Trainer,这是一个用几行代码创建和训练 SFT 模型的 API:

pythontrainer = SFTTrainer( model=model args=trainingargs traindataset=traindataset datasettextfield=text evaldataset=testdataset peftconfig=peftconfig maxseqlength=scriptargsmaxseqlength tokenizer=tokenizer packing=True datasetkwargs={ addspecialtokens False # 我们使用模板具有特殊标记 appendconcattoken False # 不需要添加额外的分隔符 })

训练适配器后,会将其与原始模型合并,然后再保存权重。当前,自定义模型导入不支持 LoRA 适配器。

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

在此用例中,我们使用 mlg512xlarge 实例,该实例配备四个 NVIDIA A10 加速器。关键配置如下所示:

pythonhuggingfaceestimator = HuggingFace( entrypoint = runfsdpqlorapy # 训练脚本 sourcedir = scripts/trl/ # 包含所有训练所需文件的目录 instancetype = mlg512xlarge # 训练作业中使用的实例类型 instancecount = 1 # 用于训练的实例数量 maxrun = 2246060 # 最大运行时间秒 basejobname = jobname # 训练作业名称 role = role # 训练作业中使用的 IAM 角色 volumesize = 300 # EBS 卷的大小(GB) transformersversion = 4360 # 训练作业中使用的 transformers 版本 pytorchversion = 210 # 训练作业中使用的 pytorch 版本 pyversion = py310 # 训练作业中使用的 python 版本 hyperparameters = hyperparameters # 传递给训练作业的超参数 disableoutputcompression = True # 不压缩输出以节省训练时间和成本 distribution={torchdistributed {enabled True}} environment = { HUGGINGFACEHUBCACHE /tmp/cache # env 变量以缓存模型 HFTOKEN HfFoldergettoken() # 检索 HuggingFace Token ACCELERATEUSEFSDP1 FSDPCPURAMEFFICIENTLOADING1 })

在我们的测试中,训练作业在单个 mlg512xlarge 实例上完成了两个时期,耗时大约 25 小时,训练成本约为 18 美元。训练完成后,模型权重将以 Hugging Face safetensors 格式、tokenizer 和配置文件上传到训练脚本中定义的 S3 存储桶。此路径应保存以用作下节导入作业的基本目录。

pythons3filespath = huggingfaceestimatormodeldata[S3DataSource][S3Uri]

配置文件 configjson 将告知 Amazon Bedrock 如何从 safetensors 文件加载权重。一些需要注意的参数包括 modeltype,必须是 Amazon Bedrock 当前支持的 类型之一,maxpositionembeddings 设置模型可以处理的输入序列的最大长度,模型维度hiddensize、intermediatesize、numhiddenlayers 和 numattentionheads,以及描述位置编码信息的旋转位置嵌入 (RoPE) 参数。以下是配置示例:

json{ nameorpath metallama/MetaLlama38B architectures [ LlamaForCausalLM ] attentionbias false attentiondropout 00 bostokenid 128000 eostokenid 128001 hiddenact silu hiddensize 4096 initializerrange 002 intermediatesize 14336 maxpositionembeddings 8192 modeltype llama numattentionheads 32 numhiddenlayers 32 numkeyvalueheads 8 pretrainingtp 1 rmsnormeps 1e05 ropescaling null ropetheta 5000000 tiewordembeddings false torchdtype float16 transformersversion 4402 usecache true vocabsize 128256}

将微调模型导入 Amazon Bedrock

要将微调的 Meta Llama 3 模型导入 Amazon Bedrock,请完成以下步骤:

在 Amazon Bedrock 控制台上,选择导航面板中的 导入模型。

选择 导入模型。

对于 模型名称,输入 llama38btexttosql。对于 模型导入设置,输入前面步骤中的 Amazon S3 位置。选择 导入模型。

模型导入作业应需时 1518 分钟完成。

完成后,选择 模型 查看您的模型。复制模型的 Amazon 资源名称 (ARN),以便在接下来的部分中使用 AWS SDK 调用该模型。

评估微调模型生成的 SQL 查询

在本节中,我们提供两个示例来评估微调模型生成的 SQL 查询:一个是使用 Amazon Bedrock 文本游乐场,一个是使用大型语言模型 (LLM) 作为评审。

使用 Amazon Bedrock 文本游乐场

您可以使用 Amazon Bedrock 文本游乐场测试该模型。为获得最佳结果,请使用与预处理训练数据相同的提示模板:

pythonltsgt[INST] ltltSYSgtgt您是一个强大的文本到 SQL 模型。您的工作是回答有关数据库的问题。您可以使用以下表模式作为上下文:CREATE TABLE tablename11 (tournament VARCHAR)ltlt/SYSgtgt[INST]人类 返回 SQL 查询以回答以下问题 1987 年有 A 的锦标赛是哪个[/INST]助理

以下动画展示了结果。

使用 LLM 作为评审

在相同的示例笔记本中,我们使用 Amazon Bedrock 的 InvokeModel API 按需调用我们导入的模型,为测试数据集中的记录生成 SQL 查询。我们使用与微调阶段训练数据相同的提示模板。导入