24年6月来自无问芯穹、清华大学和上海交大的论文“A Survey on Efficient Inference for Large Language Models”。

大语言模型 (LLM) 因其在各种任务中的出色表现而受到广泛关注。然而,LLM 推理对计算和内存的大量要求对在资源受限的情况下的部署带来了挑战。如何提高 LLM 推理效率?本文对现有的高效 LLM 推理进行了全面调查。首先分析 LLM 推理效率低下的主要原因,即模型规模大、二次复杂度的注意操作和自回归解码方法。采用一个全面的分类法,即数据级、模型级和系统级的优化。此外,对关键子领域内代表性方法做比较实验,提供定量见解。最后,提供了一些总结并讨论未来的研究方向。

最流行的 LLM,即仅解码器的 LLM,通常采用自回归方法来生成输出句子。具体而言,自回归方法逐个生成tokens。在每个生成步骤中,LLM 将整个token序列(包括输入tokens和之前生成的tokens)作为输入,并生成下一个token。随着序列长度的增加,生成过程的时间成本迅速增长。为了应对这一挑战,引入了一种关键技术,即KV缓存,以加快生成过程。KV 缓存技术,顾名思义,涉及在多头自注意 (MHSA) 块中存储和重用先前的(K) 和 (V) 对。由于该技术对生成延迟进行了显着优化,因此已在 LLM 推理引擎和系统中得到广泛采用。基于上述方法和技术,LLM 的推理过程可分为两个阶段:

预填充阶段:LLM 计算并存储初始输入 token 的 KV 缓存,并生成第一个输出 token,如图 (a) 所示。
解码阶段:LLM 使用 KV 缓存逐个生成输出 token,然后使用新生成 token 的 (K) - (V) 对,进行更新,如图 (b) 所示。

添加图片注释,不超过 140 字(可选)

如图所示,先说明一些关键的效率指标。对于延迟,将第一个 token 延迟表示为预填充阶段生成第一个输出 token 的延迟,而将每个输出 token 延迟表示为解码阶段生成一个输出 token 的平均延迟。此外,用生成延迟来表示生成整个输出 token 序列的延迟。对于内存,用模型大小来表示存储模型权重的内存,用 KV 缓存大小来表示存储 KV 缓存的内存。此外,峰值内存,表示生成过程中的最大内存使用量,它约等于模型权重和 KV 缓存的内存总和。除了延迟和内存之外,吞吐量也是 LLM 服务系统中广泛使用的指标。​​用 token 吞吐量来表示每秒生成的 token 数量,使用请求吞吐量来表示每秒完成的请求数量。
在这里插入图片描述
在资源受限的场景下部署 LLM 同时保持其强大的功能,对从业者和研究人员都是一个重大挑战。例如,考虑部署一个包含 700 亿个参数的 LLaMA-2-70B 模型。以 FP16 格式存储其权重需要 140 GB 的 VRAM,推理需要至少 6 个 RTX 3090Ti GPU(每个 24 GB VRAM)或 2 个 NVIDIA A100 GPU(每个 80 GB VRAM)。至于延迟,在 2 个 NVIDIA A100 GPU 上生成一个 token 大约需要 100 毫秒。因此,生成一个包含数百个 token 的序列需要 10 秒以上。除了存储和延迟之外,还需要考虑吞吐量、能耗和功耗等效率指标。在LLM推理过程中,计算成本、内存访问成本和内存使用率这三个重要因素会对这些指标产生较大影响。

LLM推理过程效率低下的三个根本原因,重点关注上述三个关键因素:
• 模型大小:主流LLM通常包含数十亿甚至数万亿个参数。例如,LLaMA-70B模型包含700亿个参数,而GPT-3模型则扩展到1750亿个参数。这种相当大的模型大小显著增加了LLM推理过程中的计算成本、内存访问成本和内存使用率。
• 注意算子:在预填充阶段,自注意算子在输入长度上表现出二次计算复杂度。因此,随着输入长度的增加,注意算子的计算成本、内存访问成本和内存使用量迅速增加。
• 解码方法:自回归解码方法逐个生成 token。在每个解码步骤中,所有模型权重都从片外 HBM 加载到 GPU 芯片,导致内存访问成本很高。此外,KV 缓存的大小会随输入长度的增长而增加,这可能导致内存碎片化和不规则的内存访问模式。

仔细回顾和总结工作的类别,将其分为三个层次,即数据级优化、模型级优化和系统级优化,如图所示:

添加图片注释,不超过 140 字(可选)

数据层优化

在数据层面,前期研究主要可以分为输入压缩和输出组织两大类,输入压缩技术直接缩短模型输入,降低推理成本;而输出组织技术通过组织输出内容的结构,实现批量(并行)推理,提高硬件利用率,降低生成延迟。

在这个领域内,相关研究分为四类,如图所示:提示修剪、提示摘要、基于软提示的压缩和检索增强生成(RAG)。

传统的 LLM 生成过程是完全连续的,这会导致大量时间消耗。输出组织技术旨在通过组织输出内容的结构来(部分)并行化生成。

思维骨架 (SoT) [47] 是该方向的先驱。SoT 背后的核心思想是利用 LLM 的涌现能力来规划输出内容的结构。具体来说,SoT 包含两个主要阶段。在第一阶段(即骨架阶段),SoT 指示 LLM 使用预定义的“骨架提示”生成答案的简洁骨架。例如,给出一个问题“中国菜的典型类型有哪些?”,此阶段的输出将是一串菜肴(例如面条、火锅、米饭),没有详细的描述。然后,在第二阶段(即点扩展阶段),SoT 使用“点扩展提示”指示 LLM 同时扩展骨架中的每个点,然后连接这些扩展以形成最终答案。当应用于开源模型时,可以通过批次推理执行点扩展,从而优化硬件利用率并使用相同的计算资源减少总体生成延迟。为了减轻额外提示(即骨架提示和点扩展提示)带来的附加计算开销,SoT 讨论了在点扩展阶段跨多个点共享公共提示前缀 KV 缓存的可能性。此外,SoT 使用路由器模型来决定是否将 SoT 应用于特定问题,旨在将其使用限制在合适的情况下。结果,SoT 在 12 个最近发布的 LLM 上实现了高达 2.39 倍的加速,并通过提高答案的多样性和相关性来提高许多问题的答案质量。

如图是SoT的推理过程两个阶段演示:

添加图片注释,不超过 140 字(可选)

LLM 处理更长输入和生成更长输出的需求日益增长,这凸显了数据级优化技术的重要性。在这些技术中,输入压缩方法主要针对通过减少注意算子产生的计算和内存成本来增强预填充阶段。此外,对于基于 API 的 LLM,这些方法可以降低与输入token相关的 API 成本。相比之下,输出组织方法专注于通过减轻与自回归解码方法相关的大量内存访问成本来优化解码阶段。

LLM 高效推理的模型级优化,主要集中在优化模型结构或数据表示上。模型结构优化涉及直接设计高效的模型结构、修改原始模型和调整推理时间架构。在数据表示优化方面,通常采用模型量化技术。

模型层优化

根据模型级优化技术所需的额外训练开销进行分类:第一类涉及设计更高效的模型结构(称为高效结构设计)。使用这种方法开发的模型通常需要从头开始训练。第二类侧重于压缩预训练模型(称为模型压缩)。此类别中的压缩模型通常只需要最少的微调即可恢复其性能。

高效结构

为了应对这些效率挑战,一些研究集中于开发更高效的模型结构。如图所示,将这些研究分为三类:高效 FFN 设计、高效注意设计和 Transformer 替代方案。

添加图片注释,不超过 140 字(可选)

在高效FFN设计中,许多研究集中于将混合专家 (MoE) 技术 [98] 集成到 LLM 中,以提高其性能,同时保持计算成本。MoE 的核心思想是动态地为不同的输入tokens分配不同的计算预算。在基于 MoE 的 Transformer 中,多个并行的前馈网络 (FFN)(即专家)与可训练的路由模块一起使用。在推理过程中,模型会选择性地激活由路由模块控制的每个token对应特定专家。

注意操作是 Transformer 架构中的关键组件。然而,其与输入长度相关的二次复杂度会导致大量的计算成本、内存访问成本和内存使用量,尤其是在处理长上下文时。为了解决这个问题,研究人员正在探索更有效的方法来近似原始注意操作的功能。这些研究大致可以分为两个主要分支:多查询注意(MQA)和低复杂度注意(包括基于核的注意和低秩注意)。

除了将有效的技术应用于注意操作之外,最近的研究还创新性地设计了高效而有效的序列建模架构。如表所示比较了一些代表性非 Transformer 模型的效率。这些架构在训练和推理过程中都表现出相对于序列长度的亚二次计算复杂度,从而使 LLM 能够显著增加其上下文长度。

添加图片注释,不超过 140 字(可选)

在这个研究领域,两个突出的研究方向引起了广泛关注。一个研究方向集中在状态空间模型 (SSM),该模型基于 HiPPO 理论将序列建模表述为递归变换 [64]。此外,其他研究主要集中于采用长卷积或设计类似注意的公式来对序列进行建模。

模型压缩

模型压缩包含一系列技术,旨在通过修改预训练模型的数据表示(例如量化)或改变其架构(例如稀疏化、结构优化和动态推理)来提高预训练模型的推理效率,如图所示。

添加图片注释,不超过 140 字(可选)

量化是一种广泛使用的技术,通过将模型的权重和激活从高位宽表示转换为低位宽表示,可以降低 LLM 的计算和内存成本。

预填充阶段的延迟主要受高精度 CUDA Cores 执行的计算限制。为了应对这一挑战,现有方法量化权重和激活,用低精度 Tensor Cores 加速计算。如图 (b) 所示,激活量化在每个 GEMM 操作之前在线执行,从而允许使用低精度 Tensor Cores(例如 INT8)进行计算。这种量化方法称为权重-激活量化。

相反,在解码阶段,LLM 在每个生成步骤中仅处理一个 token,使用一般矩阵向量乘法 (GEMV) 作为核心操作。解码阶段的延迟主要受大权重张量的加载影响。为了应对这一挑战,现有方法专注于仅量化权重以加速内存访问。这种方法称为仅权重量化,涉及离线量化权重,然后将低精度权重反量化为 FP16 格式进行计算,如图 (a) 所示。

添加图片注释,不超过 140 字(可选)

训练后量化 (PTQ) 涉及量化预训练模型而无需重新训练,这可能是一个昂贵的过程。

许多研究都致力于开发有效的量化算法来压缩 LLM。下表提供按四个维度分类的PTQ代表性算法。

添加图片注释,不超过 140 字(可选)

关于量化张量的类型,某些研究 [190]、[191]、[192]、[195] 专注于仅权重量化,而许多其他研究 [202]、[203]、[205] 则侧重于量化权重和激活。值得注意的是,在 LLM 中,KV 缓存是影响内存和内存访问的独特组件。因此,一些研究 [201]、[210]、[213] 提出了 KV 缓存量化。
关于数据格式,大多数算法采用统一格式,以便于硬件直接实现。关于量化参数(例如尺度、零点)的确定,大多数研究依赖于从权重或激活数值得出的统计数据。尽管如此,一些研究工作 [192]、[208] 主张基于重建损失寻找最佳参数。此外,某些研究 [190]、[192]、[203] 建议在量化过程之前或期间更新未量化的权重(称为量化值更新),以提高性能。

量化-觉察训练 (QAT) 将量化的影响纳入模型训练程序中。集成复制量化效果的层,这样这种方法有助于权重适应量化引起的误差,从而提高任务性能。然而,训练 LLM 通常需要大量的训练数据和大量的计算资源,这对 QAT 的实施构成了潜在的瓶颈。因此,当前的研究工作重点是减少训练数据要求或减轻与 QAT 实施相关计算负担的策略。

为了降低计算成本,许多方法采用参数高效调优 (PEFT) 策略来加速 QAT。QLoRA [187] 将 LLM 的权重量化为 4 位,随后对每个 4 位权重矩阵采用 BF16 中的 LoRA [218] 来微调量化模型。QLoRA 允许在仅具有 30 GB 内存的单个 GPU 上对 65B 参数 LLM 进行高效微调。QA-LoRA [188] 建议将逐组量化纳入 QLoRA。QLoRA 中的量化参数数量明显少于 LoRA 参数数量,导致量化和低秩自适应之间的不平衡。增加专用于量化的参数量,逐组操作可以解决这个问题。此外,QA-LoRA 可以将 LoRA 项合并到相应的量化权重矩阵中。 LoftQ [189] 发现,在 QLoRA 中用零初始化 LoRA 矩阵对于下游任务而言效率低下。作为替代方案,LoftQ 建议使用原始 FP16 权重和量化权重之差的奇异值分解 (SVD) 来初始化 LoRA 矩阵。LoftQ 迭代应用量化和 SVD 来更精确地近似原始权重。Norm Tweaking [186] 建议在量化后训练 LayerNorm 层,并使用知识蒸馏将量化模型的输出分布与 FP16 模型的输出分布相匹配,实现与 LLM-QAT 类似的效果,同时避免高昂的训练成本。

基于Tensor-LLM和LMDeploy,比较预填充延迟、解码延迟和端到端延迟的加速性能,如表所示,其中OOM是内存不足。

添加图片注释,不超过 140 字(可选)

从结果中,可以得出几个关键的观察结果:(1)仅权重量化可以显著加速解码阶段,从而改善端到端延迟。(2)关于预填充阶段,仅权重量化实际上可能会增加延迟。(3)随着批次大小和输入长度的增加,仅权重量化实现的加速程度逐渐减小。(4)由于较大的模型大小会产生大量的内存访问开销,因此仅权重量化为较大的模型提供了更大的好处。

稀疏化是一种压缩技术,可增加数据结构(例如模型参数或激活)中零值元素的比例。此方法旨在通过在计算过程中有效地忽略零元素来降低计算复杂度和内存使用量。在 LLM 的背景下,稀疏化通常应用于权重参数和注意激活。它导致了权重修剪策略和稀疏注意机制的发展。包括权重修剪和稀疏(动态/静态)注意。

结构优化的目的是改进模型架构或结构,以增强模型效率和性能之间的平衡。在这个研究领域,有两种突出的技术脱颖而出:神经架构搜索 (NAS) 和低秩分解 (LRF)。

知识蒸馏 (KD) 是一种成熟的模型压缩技术,其中将大模型(称为教师模型)中的知识转移到较小的模型(称为学生模型)。在 LLM 的背景下,KD 涉及使用原始 LLM 作为教师模型来蒸馏较小的 LM。许多研究都致力于有效地将 LLM 的各种能力转移到较小的模型上。在这个领域,方法可以分为两大类:白盒子 KD 和黑盒子 KD(如图所示)。

添加图片注释,不超过 140 字(可选)

动态推理涉及根据输入数据在推理过程中自适应地选择模型子结构。早期退出(early exit)技术,使 LLM 能够根据特定样本或tokens在不同的模型层停止推理。值得注意的是,虽然 MoE 技术也会在推理过程中调整模型结构,但它们通常需要昂贵的预训练成本。相比之下,早期退出技术只需要训练一个小模块来确定何时结束推理。如图所示:LLM 早期退出技术的研究分为两大类,样本级早期退出(上)和token级早期退出(下)。

添加图片注释,不超过 140 字(可选)

在高效结构设计领域,寻找 Transformer 的替代架构是一个新兴的研究领域。Mamba [75]、RWKV [62] 及其各自的变体 [103]、[106] 等示例已在各种任务中表现出色,近年来引起了越来越多的关注。尽管如此,研究这些非 Transformer 模型与 Transformer 模型相比是否存在某些缺点仍然很重要。同时,探索非 Transformer 架构与注意操作的集成 [76]、[105]、[227] 代表了未来研究的另一条有希望的途径。

在模型压缩领域,量化是大语言模型 (LLM) 部署中采用的主要方法,这主要归因于两个关键因素。首先,量化提供了一种压缩 LLM 的便捷方法。例如,采用训练后量化 (PTQ) 方法可以在几分钟内将具有 70 亿个参数的 LLM 参数量减少为压缩形式。其次,量化可以大幅降低内存消耗和推理速度,同时只会带来很小的性能损失。这种妥协通常被认为对于许多实际应用来说是可以接受的。然而,值得注意的是,量化可能仍然会损害 LLM 的某些涌现能力,如自标定或多步推理。此外,在处理长上下文等特定场景下,量化可能会导致性能显著下降 [212]。因此,需要谨慎选择合适的量化方法来减轻这些特殊情况下性能下降的风险。

系统层优化

LLM 推理的系统级优化主要涉及增强模型前向传递。考虑到 LLM 的计算图,存在多个算子,其中注意算子和线性算子占据了大部分运行时间。

推理引擎

推理引擎的优化致力于加速模型前向过程。LLM 推理中的主要算子和计算图都经过了高度优化。此外,还提出了推测解码技术来加速推理速度,而不会降低性能。如图所示:包括图和算子(注意和线性)优化,以及推测解码。

添加图片注释,不超过 140 字(可选)

推测解码 [258]、[259] 是一种创新的自回归 LLM 解码技术,旨在提高解码效率而不损害输出的保真度。这种方法的核心思想是采用一个较小的模型(称为草稿模型)来有效地预测几个后续tokens,然后使用目标 LLM 并行验证这些预测。这种方法旨在使 LLM 能够在单次推理通常所需的时间范围内生成多个tokens。如图展示了传统自回归解码方法与推测解码方法的比较。

在这里插入图片描述
下表对各种推测解码方法进行了比较,突出了几个关键观察结果:(1)Eagle 表现出色,在多个 LLM 中实现了显著的 3.47∼3.72 倍端到端加速。为了解其成功的原因,对 Eagle 进行更深入的分析可以发现两个关键因素。首先,Eagle 采用自回归方法解码草稿tokens,直接利用以前生成的token信息。其次,Eagle 集成原始 LLM 和草稿模型以前tokens的丰富特征,​​以提高下一个草稿token生成的准确性。(2)tokens 树验证器,被证明是一种提高推测解码方法性能的有效技术。(3)这些方法实现的端到端加速通常低于接受率。这种差异是由于在实际应用中不能忽视与草稿模型相关的生成成本。

添加图片注释,不超过 140 字(可选)

服务系统

服务系统的优化致力于提高处理异步请求的效率。优化内存管理以容纳更多请求,并集成高效的批次处理和调度策略以提高系统吞吐量。此外,还有针对分布式系统的优化,利用分布式计算资源。如图所示:

添加图片注释,不超过 140 字(可选)

KV 缓存的存储在 LLM 服务中占据内存使用的主要部分,尤其是当上下文长度较长时。由于生成长度不确定,提前分配 KV 缓存存储空间具有挑战性。早期的实现 [275] 通常根据每个请求的预设最大长度提前分配存储空间。然而,在请求生成提前终止的情况下,这种方法会导致存储资源的严重浪费。目前优化的服务系统普遍采用分页方式来管理 KV 缓存,从而减少冗余 KV 缓存内存的浪费。

批处理中的请求长度可能不同,当较短的请求完成而较长的请求仍在运行时,会导致利用率低。由于服务场景中请求的异步性质,存在缓解这种低利用率时期的机会。连续批处理技术利用这一机会,即一旦一些旧请求完成,就对新请求进行批处理。

在 LLM 服务中,每个请求的作业长度表现出可变性,因此执行请求的顺序会显著影响服务系统的吞吐量。当长请求被赋予优先级时,就会发生队头阻塞 [269]。具体而言,响应长请求时内存使用量会迅速增加,导致在系统耗尽其内存容量时阻碍后续请求。

为了实现高吞吐量,LLM 服务通常部署在分布式平台上。最近的研究还致力于通过利用分布式特性来优化此类推理服务的性能。值得注意的是,观察到预填充是计算密集型的,而解码是内存密集型的,split-wise [261],TetriInfer [262] 和 DistServe [263] 展示分解请求的预填充和解码步骤的效率。这样,两个不同的阶段根据其特性独立处理。SpotServe [264] 旨在通过可抢占的 GPU 实例在云端提供 LLM 服务。SpotServe 有效地处理了包括动态并行控制和实例迁移在内的挑战,并且还利用 LLM 的自回归特性实现了token级状态恢复。此外,Infinite-LLM [265] 将 vLLM [51] 中的分页 KV 缓存方法扩展到分布式云环境。

硬件加速器设计

先前的研究工作 [276]、[277]、[278] 专注于优化 Transformer 架构,特别是增强注意算子,通常采用稀疏方法来促进 FPGA 部署。FACT [279] 加速器通过线性算子的混合精度量化和算法硬件协同设计实现了与 NVIDIA V100 GPU 相比更高的能效,但这些方法并不适合生成式 LLM。

近期的研究(如 ALLO [280])突出了 FPGA 在管理内存密集型解码阶段方面的优势,并强调了模型压缩技术对于 LLM 高效 FPGA 部署的重要性。相反,DFX [281] 专注于解码阶段优化,但缺乏模型压缩方法,限制了其对更大模型和更长输入(高达 1.5B 模型和 256 个 token)的可扩展性。ALLO 以这些见解为基础,进一步提供了可组合和可重用的高级综合 (HLS) 核库。ALLO 的实现在预填充阶段比 DFX 具有更出色的生成速度,在解码过程中实现了比 NVIDIA A100 GPU 更高的能效和速度。

LLM框架的性能比较

下表是开源的推理引擎和服务系统的比较。推理吞吐量用 Llama2-7B(批次大小 = 1、输入长度 = 1k、输出长度 = 128)测量。服务性能是在 ShareGPT [283] 数据集上测得的最大吞吐量。两者均基于单个 NVIDIA A100 80GB GPU 得出。在提到的框架中,DeepSpeed [248]、vLLM [51]、LightLLM [267] 和 TensorRT-LLM [216] 集成了服务功能来服务来自多个用户的异步请求。在表中列出了每个框架的优化。除 HuggingFace 之外的所有框架都实现了算子级或图级优化以提高性能,其中一些还支持推测解码技术。请注意,当测量所有框架的推理性能时,推测解码技术处于关闭状态。推理吞吐量结果表明,FlashDecoding++ 和 TensorRT-LLM 的表现优于其他框架,优化涵盖了主要算子和计算图。从服务方面来看,所有框架都使用细粒度和不连续的 KV 缓存,并应用连续批处理技术来提高系统利用率。与 vLLM 和 LightLLM 不同,DeepSpeed 在调度时优先考虑解码请求,这意味着如果批处理中有足够的现有解码请求,则不会合并新请求。

添加图片注释,不超过 140 字(可选)

Logo

NVIDIA官方入驻,分享最新的官方资源以及活动/会议信息,精选收录AI相关技术内容,欢迎大家加入社区并参与讨论。

更多推荐