Press "Enter" to skip to content

利用qLoRA对任务微调模型进行微调,避免灾难性遗忘:以LLaMA2(-chat)为例的案例研究

学习如何在保持任务特定特性的同时将知识融入到目标微调模型中

亚马逊网络服务上的StableDiffusionXL的照片

这是关于什么,为什么它很重要?

Anthropic的Claude或Meta的LLaMA2等大型语言模型(LLMs)在各种自然语言任务上展示了令人印象深刻的能力。然而,它们的知识和任务特定技能相对较通用 – 如果您想执行更专业、领域特定的任务,需要找到将模型与知识融合并教授它们任务特定行为的方法。LLM驱动的应用程序需要在目标领域中正常工作,提供准确的答案而不是产生幻觉,并确保安全性、隐私和适当的内容。

这些挑战通常被称为“三个H”,即有用性、诚实性和无害性。在设计企业级质量的FM驱动应用程序时,克服这些挑战被证明是特别重要的。有几种方法可以将领域知识灌输到基础模型中:

作者的插图
  • 源知识:您可以通过提示工程、基于示例或上下文注入生成等方式动态提供知识。这种选项以相对简单的方式呈现,如零-shot或少-shot提示。然而,集成外部知识源的更复杂方法也在不断发展。通过动态提示组合和从各种外部“工具”(检索增强生成、数据库检索器、数据湖检索器、通过REST-ful API的实时系统等)获取信息,从而将知识注入模型中的源知识正变得越来越受欢迎。
  • 参数化知识:您可以直接通过微调来更新模型参数。通过将预训练权重调整为较小(与预训练相比)、领域特定的数据集,从而向领域特定的知识库或任务调整权重。

正如Heiko Hotz在他的博文中解释的那样,选择正确的方法(或两种方法的组合)会带来一些权衡。在本博客中,我们将重点介绍参数化方法,并演示如何在亚马逊SageMaker上使用PEFT(参数高效微调)对LLaMA2模型进行微调。

我们的目标是将LLaMA2调整到特定领域,获取最新的知识,克服“知识截断”问题,即模型缺乏对最新信息的意识,这些信息不属于它们的训练数据的一部分。与特定任务的微调相比,这对于许多从业人员来说是一个更可行的任务,因为他们可以简单地使用包含领域特定信息的文本语料库作为训练数据集,而不是手工制作或收集特定任务的数据集,如对话或指令数据集。

由于对于许多相关的LLM驱动的用例,特定任务的模型是有益的,我们还将展示所提议的设置同样适用于已经经过特定任务微调的模型,如LLaMA2-chat,而不会失去它们的任务特定特性(例如指令跟随、对话行为等)。

通过学习这个知识注入的端到端工作流程,我们为调整基础模型以满足您的特定需求提供了实用指南。

模型

LLaMA2模型于2023年7月发布,并附带一篇研究论文。在论文中,Touvron等人表示,LLaMA2是“一系列预训练和微调的大型语言模型(LLMs),规模从70亿到700亿个参数不等。我们的微调LLMs,称为Llama 2-Chat,在对话用例中进行了优化。我们的模型在大多数我们测试的基准测试中都优于开源聊天模型,并且根据我们的有用性和安全性人工评估结果,可能是封闭源模型的合适替代品。”

如上所述,LLaMA2模型有三种规模:7B、13B和70B。它们可用作纯完成模型,并且还针对对话用例进行了优化。经过大约2万亿个标记的预训练,它们支持最长为4096个标记的上下文长度。对于对话用例的微调使用了超过100,000个示例,并通过超过1,000,000个训练样本进行了人类偏好的优化。

在AWS内部,可以通过SageMaker JumpStart的一键式部署或通过AWSxHuggingFace LLM DLC从HuggingFace模型中心获取LLaMA2模型。

微调

微调利用迁移学习将专业知识高效注入到像LLaMA2这样的基础模型中。该过程通过持续在领域特定数据上进行预训练更新模型的权重,同时保持整体网络架构不变。与需要大规模数据集和计算的完全预训练不同,微调具有高样本和计算效率。参数高效微调(PEFT)技术,例如(q)LoRA方法,可以以最小的开销将专业知识轻量级注入到像LLaMA2这样的通用语言模型中。

在谈到微调时,有两种不同的方法:

  1. 通过在领域特定语料库上使用LLaMA2的仅解码器架构进行微调,采用其本机的自回归因果语言建模(CLM)方法,我们可以将专业知识或特定语言或词汇(例如医学研究术语/语音)注入LLM中,同时保留其通用的语言能力。
  2. 另一方面,通过使用任务特定的语料库,可以将模型微调为特定任务,例如指令跟随或对话行为。

这些模型采用自监督训练方法,优化语言建模(LM)特定的损失函数。像LLaMA2这样的仅解码器模型采用了因果语言建模(CLM)方法,具有单向上下文。简单来说,这意味着它们根据以前的语义上下文,以自回归的方式预测后续令牌。

如上所述,PEFT技术通过仅更新模型参数的子集,以最小的开销将专业知识轻量级注入LLM中。低秩适应(LoRA)或量化低秩适应(QLoRA)等方法将预训练模型权重冻结,并将可训练的秩分解矩阵注入到Transformer架构的每一层中,大大减少了用于下游任务的可训练参数的数量。如果您想深入了解LoRA,请查看Mariano Kamp的博客文章。

场景

7月26日,AWS在纽约AWS峰会上宣布了与生成式人工智能领域相关的各种功能。为了分享更多细节,发布了几篇公告博文:

· 用于Amazon Bedrock的代理

· AWS实体解析匹配

· 在生成式AI应用程序中的向量存储的作用

· 用于Amazon OpenSearch Serverless的向量引擎

· 由Amazon CodeWhisperer提供支持的AWS Glue Studio笔记本

· Amazon EC2 P5

考虑到LLaMA2的知识截止日期,纯粹的模型将无法提供有关这些公告的任何信息。我们希望通过利用微调将这些知识注入到基础模型(FM)中,并提升其知识以实现这一目标。

由于我们不打算将模型微调为特定任务,而只是想摄取领域特定的知识,因此我们可以采用经典的基于CLM的方法(前一节中的选项1)。Philipp Schmid在他非常全面的博客中描述了如何使用QLoRA对LLaMA2模型进行微调,但重点是专注于特定任务(指令)微调。我们将以他在博客文章中分享的代码示例为起点,并相应调整代码。

为了负责任地使用资源,我们将对LLaMA2–13b和LLaMA2–13b-chat模型进行微调。对于7b和70b版本,将根据调整后的训练集群配置进行微调(请参阅Philipp的博客)。在进行微调本身之后,我们将部署基础模型和微调模型,并进行高级性能比较。

随后,我们将逐步介绍微调模型的各个步骤。如果您想访问完整的代码存储库,可以在此处找到。

数据加载

对于数据加载,我们使用LangChain的WebBaseLoader来加载由其URL标识的网站数组。

许可协议和HuggingFace登录

接受LLaMA2模型的许可协议

在进行数据准备和训练之前,我们需要接受LLaMA2模型的许可协议。这包括在Meta网站上使用与您的HuggingFace账户相匹配的电子邮件地址进行注册。

然后,我们从运行时与HuggingFace hub进行身份验证。

数据准备

首先,我们对原始网站进行一些预处理。在实际应用中,可以更加注重这个阶段。为了演示目的,我们只需删除所有较大的空格连接,以便获得连贯流畅的文本语料库。然后,我们将文档列表加载到HuggingFace数据集中。

在下一步中,我们对文本语料库进行分词,以使其适合LLM。为此,我们使用从HuggingFace hub加载的LLaMA2分词器。根据模型的上下文窗口(2048个标记),可以使用加载的分词器对创建的批次进行分词。

然后,我们将数据集保存在S3上,以供训练任务使用。

训练

现在,我们可以触发Amazon SageMaker训练任务,执行基于预处理数据的CLM-tied QLoRA微调脚本。

超参数和训练脚本是从Philipp的博文中修改的。唯一的例外是执行的训练轮数,我们选择了相对较高的20轮。这是为了考虑到我们的训练数据集相当小(约32k个标记)。在实际应用中,建议使用更大的数据集进行微调。训练脚本本身可以在这里找到。

还请注意:由于接受的模型许可协议与您的HuggingFace账户绑定,我们需要指定一个HuggingFace访问令牌。

训练作业配置,例如训练集群配置,也是从Philipp的博文中进行了调整。

然后,我们可以执行训练作业,该作业将执行微调并将我们的模型工件保存到S3中。

部署

LLaMA2-13b和LLaMA2-13b-chat这两个基础模型可以通过SageMaker JumpStart方便地部署。这篇博文提供了详细的说明。

可以使用AWSxHuggingFace LLM DLC部署这两个微调模型。为此,我们将HuggingFaceModel类的model_data参数指向模型工件的s3路径。然后,我们可以将托管容器中设置的环境变量HF_MODEL_ID指向DLC中的默认模型路径(“/opt/ml/model”)。

测试

在部署了这四个模型之后,我们希望测试它们在一个示例问题上的性能。亚马逊EC2 P5实例的公告博文中提到:“P5实例配备了8个NVIDIA H100 Tensor Core GPU,拥有640GB高带宽GPU内存,第三代AMD EPYC处理器,2TB系统内存和30TB本地NVMe存储。P5实例还提供3200 Gbps的总带宽网络,并支持GPUDirect RDMA,通过绕过CPU进行节点间通信,实现低延迟和高效的扩展性能。”

我们提出以下问题:“亚马逊EC2 P5实例是什么?它们配备了哪种类型的GPU?”聊天模型以max_new_tokens = 200,top_p = 0.9,temperature = 0.01的推理配置回答如下:

  • LLaMA2-13b-chat:“亚马逊弹性计算云(EC2)P5实例是一种提供高性能计算资源的实例,适用于需要强大计算能力的应用程序。这些实例配备了NVIDIA Tesla V100 GPU,专为机器学习、科学模拟和其他高性能计算工作负载而设计。\n\nP5实例中的NVIDIA Tesla V100 GPU基于Volta架构,具有多种特性,使其非常适合处理各种要求严格的工作负载,包括:\n\n* 5120个用于高性能计算的CUDA核心\n* 640个用于加速深度学习和其他基于矩阵的工作负载的张量核心\n* 16GB的GDDR6内存,用于快速数据传输和处理\n* 支持NVIDIA的GPU加速库和框架,例如CU…”
  • LLaMA2-13b-chat-nyc-finetuned:“亚马逊EC2 P5实例是通用实例,为需要大量图形处理和复杂机器学习(ML)模型的应用程序提供极高的性能。它们由NVIDIA H100 Tensor Core GPU和第三代AMD EPYC处理器驱动。H100 GPU提供640GB高带宽GPU内存,使您能够在实时处理大规模数据集的情况下运行最具挑战性的应用程序。P5实例还提供2000GB高速CPU内存,允许您在内存中处理大量数据,而无需访问磁盘存储。这减少了处理时间并提高了响应时间。您可以将这些实例用于计算机视觉、视频编码、基因组分析和语言模型训练等应用。”

我们可以清楚地看到,虽然基础模型产生了关于GPU类型(V100)的幻觉,但经过微调的模型为我们提供了正确的答案(H100)。我们还可以看到,通过qLoRA,我们可以保持基础模型的聊天微调特性,从而减轻灾难性遗忘。这意味着我们可以向LLM注入知识,而无需在之后进行完全的指令/聊天微调,只需使用相应的任务微调模型作为基础模型。之所以这样做有效,是因为LoRA的性质,即神经网络的每一层的大部分部分保持不变,而层次被扩展。

对于纯粹的完成版本模型,我们需要重新构思问题,因为这些模型无法理解指令或以对话方式行为。相反,它们只是通过自回归的下一个令牌预测来完成令牌序列。

我们提出以下问题:“Amazon EC2 P5 实例配备的是哪种类型的 GPU” 完成模型的回答如下,推理配置为 max_new_tokens = 200,top_p = 0.9,temperature = 0.01:

  • LLaMA2–13b:“NVIDIA Tesla V100。\nNVIDIA Tesla V100 是一款专为高性能计算设计的 GPU。它基于 NVIDIA Volta 架构,并配备了32GB的HBM2内存。V100 可以提供高达100 teraflops的性能,并设计用于数据中心和超级计算机。\nNVIDIA Tesla V100 是一款功能强大的 GPU,专为高性能计算而设计。它基于 NVIDIA Volta 架构,并配备了32GB的HBM2内存。V100 可以提供高达100 teraflops的性能,并设计用于数据中心和超级计算机。\nNVIDIA Tesla V1…”
  • LLaMA2–13b-nyc-finetuned:“用于计算密集型工作负载的 NVIDIA A100,例如生成性 AI、高性能计算(HPC)和数据分析。P5 实例非常适合训练和运行具有数万亿参数的模型的推理,并对庞大数据集进行数据分析。与 P4 实例相比,它们提供了8倍的 GPU 内存和64倍的浮点运算(FLOPs)计算性能。\n您可以在 Amazon Elastic Container Service (ECS) 中使用 P5 实例,使用最常见的容器工具和框架,例如 Docker、PyTorch、TensorFlow、Jupyter Notebook、R Studio 和 Venv,或者您可以通过 Amazon Elastic MapReduce (EMR) 或 Amazon DeepSense 使用 P5 实例,并使用由 Amazon 或其他公司提供的 ML 和 AI 框架和工具。为了在 P5 实例上更容易构建生成性 AI 应用,…”

尽管使用这么少的数据对聊天微调模型进行微调已经消除了模型在基础LLaMA2模型中的幻觉,但在我们的设置中似乎不起作用。这可能是由于微调数据集的有限大小。此外,更复杂的提示工程和优化推理配置参数设置可能会有所帮助。

结论

总而言之,本博文深入探讨了将领域特定知识注入大型语言模型(LLMs)如LLaMA2的关键过程,强调在为企业级质量设计基于LLM的应用程序时解决有益性、诚实性和无害性方面的挑战的重要性。主要关注的是参数化微调方法,它可以有效地将专业知识注入基础模型,而不会影响其一般的语言能力。

本博文强调了使用参数高效微调技术(如qLoRA方法)对LLaMA2进行微调的步骤,并展示了如何在Amazon SageMaker上进行此过程。通过采用这种方法,从业者可以将LLaMA2适应特定领域,确保模型即使在其原始训练数据之外,也能跟随最新的知识。

这篇文章还强调了这种方法的多功能性,展示了它可以应用于已经经过任务特定微调的LLaMA2-chat等模型。这为向LLMs注入知识而无需进行广泛的指令或基于聊天的微调提供了机会,保持了它们的任务特定性质。

Leave a Reply

Your email address will not be published. Required fields are marked *