生成式人工智能/大语言模型

借助 NVIDIA NIM 无缝部署大量 LoRA Adapters

最新的先进基础大型语言模型 (LLM) 拥有数十亿个参数,并已在数万亿个输入文本标记上进行了预训练。它们通常在各种用例上都取得了惊人的成果,而无需进行任何定制。尽管如此,研究表明,通过使用高质量、特定领域的数据集调整 LLM 可以实现下游任务的最佳准确率。

在许多情况下,较小的自定义模型可以美甚至优于较大的通用 LLM,同时显著降低部署成本。但是,针对特定下游任务定制模型可能会在创建和部署期间带来重大挑战。

完整的 full fine-tuning 对于大型语言模型(LLM,即更新模型的所有参数),由于在整个模型中学习所需的计算基础设施数量,可能很困难。在部署时,基础设施成本也会增加,因为用户需要在内存中托管多个大型模型,或者随着整个模型的交换而承受更高的延迟。Low-rank adaptation(LoRA)是一种缓解这两个问题的技术。

本文简要概述了 LoRA,并解释了部署 LoRA 微调模型的两种方法。我们还将讨论对 LoRA adapter 集群启用异构 LoRA 部署的方法,从而实现混合批量推理请求。

Low-rank 适应

在过去几年中,LoRA 已经成为一种热门技术,与完全 fine-tuning 相比,它可以调整非常少量的附加参数。这些附加参数称为 LoRA adapter,表示对网络 dense 层中变化的 low-rank decomposition。LoRA 的运行基于以下观察:大型语言模型(LLMs)已经过参数化,而在 fine-tuning 期间新学习的信息具有较低的“ intrinsic rank”。换言之,模型参数中的有效更改仅限于整个非常高维参数空间的 lower-dimensional subspace。使用 LoRA,可以将可训练参数的数量减少 10,000 倍。

Figure 1 illustrates the parameters introduced in the form of trainable low-rank matrices A and B. The pretrained weights are frozen while A and B are trained during LoRA customization to represent the newly added information.
图 1、AB表示新添加的信息。图片来源:LoRA:大型语言模型的低级别适应

图 1 描述了 LoRA 背后的核心理念:

  • 预训练模型的权重 (W) 在自定义过程中被冻结
  • 无需更新 W,两个较小的可训练矩阵 A B 会被注入,用于学习特定于任务的信息。矩阵乘法B*A形成一个矩阵,其维度与 W 因此可以将其添加到 W (= W + BA).

A B 矩阵是 8、16 等较小的值。累加而言,它们的可训练参数远远少于 W 从而提高自定义的计算和内存效率。此 rank (r) 参数通常可在训练时自定义。

在秩序大小和计算效率之间存在权衡。更大的秩值可以提高模型的表达能力,因此模型可以捕获与下游任务相关的更多模式。非常高的秩值(例如 64)接近完全监督式 fine-tuning 的学习信息能力。也就是说,更新模型中的所有参数。缺点是,在内存和计算需求方面,更大的秩的训练和推理成本更高。在实践中,使用小至 8 的秩值进行 LoRA fine-tuning 已经非常有效,并且是各种下游任务的良好起点。

部署经过 LoRA 调优的模型

可以通过以下方式部署 LoRA 微调。

选项 1:合并 LoRA Adapter

额外的 LoRA 权重可以与预训练模型合并,以创建一个在结构上与其前代模型相同的 purpose-built 变体。这可以避免在单独管理 adapter 时产生任何额外的 inference latency。权重合并是一种更简单的方法,但缺乏灵活性。这种方法的缺点是,整个模型变得“定制化” 并且只能完成一项任务,即它要微调的任务。这使得难以将不同任务的输入分批在一起,以提高部署效率。只有当您计划为每个部署提供单个任务时,才推荐使用此方法。

选项 2:动态加载 LoRA Adapter

LoRA Adapter (AB 在图 1 中) 与基础模型 (W) 保持分离。在推理时,运行时会动态加载与传入请求相对应的Adapter权重,以提供服务。这使得它可以灵活地同时服务和批处理来自各种任务的输入,以充分利用可用计算,而无需维护单独的自定义模型。

某些用例需要多个 LoRA,甚至需要在同一基础模型上使用数百甚至数千个 LoRA.对于这些用例,选择动态 LoRA Adapter 是更好的路径。示例包括:

  • 为客户提供个性化模型的企业,用于提供推荐服务,或根据其特定角色或偏好进行调整。
  • A/B 测试,用于比较同一用例中的各种 LoRA 微调。
  • 为基于相同基础模型的多个下游用例提供服务的企业。例如,IT 服务团队部署多个 LoRA 设置,用于 错误总结、ticket routing 和分类、在特定文献语料库中实现聊天机器人和知识检索、根本原因分析等多种应用场景。

NVIDIA NIM 提供经过优化的推理微服务,支持 LoRA Adapter的动态加载,并允许发送混合批量请求。以下部分将更深入地了解我们的方法。

借助 NVIDIA NIM 实现异构、多 LoRA 部署

借助 NIM,每个推理微服务都与单个基础模型相关联。此模型可以以与之关联的低级Adapter的形式进行任意数量的“自定义”。

  1. 网卡,使用NVIDIA NeMo 框架Hugging Face PEFT将库放入Adapter存储中,并赋予其唯一名称。
  2. 向 NIM 发出请求时,客户端可以通过添加 LoRA 模型名称来指定他们想要的特定自定义。
  3. 当 NIM 收到定制模型的请求时,它会将关联的Adapter从Adapter存储中拉到多层缓存中。一些Adapter驻留在 GPU 显存中,一些驻留在主机显存中,具体取决于它们的使用时间。
  4. 在执行期间,NIM 将运行专门的 GPU 内核,让数据同时流经基础模型和多个不同的低级Adapter。这使其能够同时响应多个不同的自定义模型的请求。
This image illustrates an architecture diagram for a mixed batch input neural network model. The key components are: Mixed Batch Input, GPU Memory, Adapter Store, Adapter Cache, and Output Batch.
图 2.NVIDIA NIM 动态 LoRA 架构,支持在同一基础模型上发送混合批量输入

处理混合批量请求

一个批量中的请求可能会使用不同的 LoRA Adapter来支持不同的任务。因此,传统的 General Matrix Multiplication(GEMM)无法同时计算所有请求。按顺序逐一计算这些请求会导致大量额外开销。为了解决这个问题,我们使用了NVIDIA CUTLASS 以实现批量 General Matrix Multiplication,将批量异构请求处理融合到单个内核中。这提高了 GPU 利用率和性能。

此外,我们发现,对于每个Adapter的第一个矩阵组件,批量 GEMM 的 GPU 利用率不够高,因为第一个矩阵具有非常大的输入维度和较小的输出维度。每个Adapter都有两个矩阵组件,A(形状d-by-r) 和B(形状r-by-d),如图 1 所示。由于d通常比 LoRA 排名r大很多,我们应用了splitK 方法将 GEMM 分割为多个流多处理器 (SM) 上的多个图块,从而提高 GPU 利用率,并使用额外的归约核来减少 splitK-batched-GEMM 之后的部分结果。

性能基准测试的最佳实践

评估此类多 LoRA 部署的延迟和吞吐量性能并非易事。在本节中,我们将讨论在对 LLM LoRA 推理框架的性能进行基准测试时通常值得考虑的几个主要因素。

  • 基础模型:小型和大型模型均可用作 LoRA 微调和推理的基础模型,例如Llama 3 8BLlama 3 70B。较小的模型擅长处理许多任务,尤其是传统的非生成自然语言处理任务(例如文本分类),而较大的模型擅长处理复杂的推理任务。LoRA 的优势之一是,即使是大型的 70B 模型也可以在单个 NVIDIA DGX H100 或使用 FP16 的 NVIDIA A100 节点,甚至是单个 NVIDIA H100NVIDIA A100 4 位量化的 GPU。
  • Adapter: 在实践中,从最终用户的角度来看,最好具有灵活性,实验和选择最佳准确性的大小。另一方面,系统操作员可能想要统一执行特定的固定大小,以启用更好的批处理和改善统一 LoRA 的性能。 LoRA 排名的流行选择是 8、16、32 和 64。
  • 测试参数:基准测试中需要考虑的其他几个测试参数包括:
    • 输出长度控制:我们使用 ignore_eos 参数通知推理框架继续生成文本,直到它达到 max_token_length 限制。这可以确保满足输出序列长度(OSL)规范。此参数越来越多地得到大型语言模型(LLM)推理框架的支持,并显著简化了基准测试设置。值得注意的是,ignore_eos 不需要在“真实”任务上进行训练以便进行性能分析。
  • 工具:基准测试工具 应支持调用 LoRA 模型。GenAI-Perf 是一款专门为 LoRA 支持而设计的语言模型基准测试工具。Adapter可以随机统一调用,也可以循环调用,或者按照分布进行调用,以反映真实使用模式。例如,20% 的Adapter可能占请求的 80%。
  • 指标:在 LLM 域中,主要指标是延迟。TTFT (第一个令牌的时间)、ITL (令牌间延迟) 和吞吐量,TPS (每秒系统令牌总数)。

其他补充指标包括每秒请求总数和端到端请求延迟。

与使用基础模型(或合并的 LoRA 模型)提供服务相比,添加动态 LoRAs(单个 LoRA、相同 rank 的多个 LoRAs 或不同 rank 的多个 LoRAs)都会导致延迟和吞吐量成本不断增加。在理想情况下,这种成本应该是合理的,以换取动态 LoRAs 提供的更高的准确性和灵活性。

在接下来的几周和几个月里,我们将分享更多关于 NIM 在为 LoRA 服务时的性能特征的内容。

接下来要做的是

在研究中,LoRA 有一些令人兴奋的新增强功能,旨在提高微调模型的效率或准确性。我们的未来方向包括将这些功能融入 NIM。

Tied-LoRA

Tied-LoRA 是 NVIDIA Research 的一项新技术,可以提高 LoRA 的参数效率。在 LoRA 中,添加了特定于任务的低秩矩阵,这些矩阵近似于每层的权重更新。在 Tied-LoRA 中,这些低秩矩阵在各个层之间共享(“tied”),从而进一步减少可训练的参数数量。此外,此技术允许有选择地训练或冻结 LoRA 的不同组件(低秩矩阵和 scaling vectors),使用户能够尝试性能和参数效率之间的权衡。

计划在未来的版本中使用 NVIDIA NIM 支持此方法。

DoRA

DoRA 作为 NVIDIA Research 开发的另一种技术,它弥合了完全 fine-tuned 模型和 LoRA 调优之间的性能差距。它通过将预训练权重分解为两个组件来实现这一点:magnitude 和 direction。对于 fine-tuning,DoRA 专门使用 LoRA 进行 directional 更新,从而高效地最大限度地减少可训练参数的数量。这种方法增强了 LoRA 的学习能力和训练稳定性,而不会产生额外的 inference 开销。在各种下游任务中,DoRA 在 LLaMA、LLaVA 和 VL-BART 等 fine-tuned 模型中的性能始终优于 LoRA,包括 commonsense reasoning、visual instruction tuning 以及 image 和 video-text understanding。

结束语

NVIDIA NIM使您能够无缝部署和扩展多个 LoRA Adapter。NIM 现已正式推出,首先支持 Meta Llama 3 8BLlama 3 70B,以及 LoRA Adapter在NVIDIA NeMoHugging Face模型格式中。我们致力于在未来版本中增加对其他最先进的社区模型的支持。

要开始在 NIM 中使用 multi-LoRA,请查看关于 LoRA 调整 Llama 3 模型使用 NVIDIA NeMo,部署经过调优的网卡,并发送混合推理请求的 Jupyter Notebook 教程。有关 NIM 的更多信息,请参阅文档

Tags