作者/机构: Ranajoy Sadhukhan1∗, Jian Chen1∗, Zhuoming Chen1, Vashisth Tiwari1, Ruihang Lai1, Jinyuan Shi2, Ian En-Hsu Yen2, Avner May3, Tianqi Chen1, Beidi Chen1
1卡内基梅隆大学 2Moffett AI 3Together AI
本文旨在解决在长上下文应用(如交互式聊天机器人、文档分析和智能体工作流)中,同时实现大型语言模型(LLM)服务的低延迟和高吞吐量这一挑战。
核心问题:
传统的推理优化技术面临一个固有的权衡:
1. 投机解码(Speculative Decoding, SD):通过使用一个较小的草稿模型预测多个 token,再由目标模型验证,可以无损地降低延迟。然而,现有观点认为,当批量大小(batch size)增加时,验证成本会急剧上升,导致 SD 效率低下,因此不适用于高吞吐量场景。
2. 批处理(Batching)技术:如 vLLM 等通过增大批量大小来提高吞吐量,但这通常以牺牲每个 token 的延迟为代价。
3. 模型压缩技术:如量化、剪枝等可以同时改善延迟和吞吐量,但通常会牺牲模型输出的质量。
基于这些挑战,本文提出了一个核心问题:我们能否在不牺牲准确性的前提下,同时提高长序列推理的吞吐量和延迟?
研究目标与创新点:
本文对上述问题给出了肯定的回答,并指出对于中长序列的大批量推理场景,投机解码(SD)可以被有效地用来同时改善吞吐量和延迟。这一结论基于以下几个关键洞察:
KV Cache 成为大批量长上下文场景下的主要瓶颈:在长上下文和大批量推理中,KV Cache 的内存占用会超过模型参数,并随批量大小线性增长。尽管计算量也随之增加,但现代 GPU 极高的峰值 FLOPS 与内存带宽比导致 KV Cache 的加载时间增长远快于计算时间,使 LLM 推理变得更加受内存带宽限制(memory-bound)。
SD 的有效性取决于一个“临界序列长度”:现有研究认为 SD 在大批量下效率低,但这只适用于短序列。当序列长度超过一个“临界长度”后,即使在非常大的批量下,KV Cache 的加载成本也会成为主导因素。此时,验证步骤的计算开销相对于 KV 加载成本变得不那么重要,使得 SD 再次变得高效。
压缩 KV Cache 是更有效的投机策略:为了在大批量处理中最小化昂贵的验证步骤,高 token 接受率至关重要。研究发现,相比压缩模型权重(使用更小的草稿模型),压缩草稿模型的 KV Cache 能在相似的内存约束下实现显著更高的接受率。如图 1c 所示,仅压缩模型权重难以达到 90% 的接受率,而 KV 压缩则可以轻松超过这一水平。
本文贡献总结:
基于以上洞察,本文提出了 MagicDec 框架,证明了与普遍认知相反,通过利用 KV 压缩,投机解码(SD)即使在大批量场景下也能实现显著的加速。
本节介绍了对投机解码和 LLM 推理性能的理论分析。首先回顾投机解码加速的数学公式,并确定影响它的关键因素。其次,分析长上下文场景中的 LLM 推理,重点说明了使投机解码能够在大批量下实现加速的瓶颈转移。最后,论证了在长上下文、大批量的场景下,基于压缩 KV 的草稿模型是实现高加速比的必要条件。
本节分析了随着序列长度和批量大小的增加,推理瓶颈如何转移,以及这种转移如何影响第3.1节中讨论的因素。
短序列场景下的挑战。对于短序列长度,投机解码对批量推理效率产生负面影响【23, Optimizing speculative decoding for serving large language models using goodput, 2024, arXiv】【33, The synergy of speculative decoding and batching in serving large language models, 2023, arXiv】。随着批量大小的增长,由于算术强度提高,线性层变得受计算限制(compute-bound)。这减少了投机解码可用于并行验证的计算资源,从而实质上增加了验证与解码的成本比。
中长序列场景下的转变。相比之下,对于中等到长序列,我们观察到推理过程向内存限制(memory-bound)状态转变,因为随着批量大小的增加,加载 KV Cache 的内存成本成为主导因素。这种从计算限制到内存限制的转变,使得验证成本与目标解码成本相当。由于验证和解码共享相同的 KV 预算,它们的 KV Cache 加载成本是相同的。现代 GPU 的峰值 FLOPS 与内存带宽之比很高,这导致随着批量大小的增加,KV 加载时间的增幅超过了计算时间的增幅(见图 1a)。因此,尽管受计算限制的线性层增加了验证成本,但 KV 瓶颈缓解了这一影响。
临界序列长度的概念。基于这种瓶颈转移,我们确定了一个临界序列长度 $S_{inflection}$,超过这个长度,投机解码即使在大批量下也能实现加速。此外,其加速比往往会随着批量大小的增加而增加。这个阈值取决于模型架构、硬件配置和草稿策略等因素。
当 $S < S_{inflection}$ 时:
在这个范围内,随着批量大小的增加,解码变得更加受计算限制。大批量会饱和可用计算资源,使得验证相对更昂贵,如图 2b 所示。对于长度为1000的 token 序列,$T_V(\gamma)/T_T$ 的成本比显著增加。如果草稿 token 的接受率低,目标模型会花费大量时间验证错误的推测,从而降低了 SD 的效率。我们在此范围内的理论估计与【23, Optimizing speculative decoding for serving large language models using goodput, 2024a, arXiv】一致。对于上下文长度低于临界序列长度的情况,投机解码的预期加速比会随着批量大小的增加而降低。
当 $S \ge S_{inflection}$ 时:
在这个范围内,投机解码可以为大批量提供加速,并且当我们使用一些智能的草稿策略时,这种加速比甚至会随着批量大小的增加而增加。这是验证与解码成本比($T_V(\gamma)/T_T$)和草稿与目标成本比($T_D/T_T$)随批量增加而共同演变的结果,如图 2b 和 2a 所示。
长序列下的成本分析。对于长序列,KV Cache 加载成为主要瓶颈,而不是计算【34, Triforce: Lossless acceleration of long sequence generation with hierarchical speculative decoding, 2024, arXiv】【5, Deepspeed inference: Enabling efficient inference of transformer models at unprecedented scale, 2022, arXiv】,目标模型转向内存限制状态,如图 3c 所示。由于 KV 内存瓶颈随批量大小扩展,这种转变即使在大批量下也能维持。由于验证和解码阶段共享相同的 KV 加载成本,成本比 $T_V(\gamma)/T_T$ 保持接近1。
草稿模型成本比的作用。然而,成本比 $T_V(\gamma)/T_T$ 仍然随批量大小单调增加,这无法解释我们如何能为更大的批量实现更高的加速比。草稿与目标成本比($T_D/T_T$)在这里扮演了重要角色。如果草稿模型的 KV Cache 大小增长慢于目标模型,那么对于更大的批量,$T_D/T_T$ 的成本比将会降低。这是因为目标模型的推理将更多地由 KV Cache 瓶颈主导,而不是草稿模型。
理论加速比的趋势。如图 2c 所示,在 LLaMA-3.1-8B 的情况下,投机解码的理论加速比预计会随着批量大小的增加而提高(对于较长的序列长度)。当 $S < 4000$ 时,加速比随批量大小减小;但当 $S \ge 4000$ 时,加速比随批量大小增加。
临界长度的影响因素。如图 3c 所示,临界序列长度 $S_{inflection}$ 取决于模型的 FLOPS 与内存比率以及 GPU 的 FLOPS 与内存带宽比率。对于具有更高 FLOPS 与内存带宽比率的设备,我们期望 $S_{inflection}$ 更低。模型也会影响这个临界序列长度。例如,像 LLaMA-3.1-8B 这样的 GQA 模型由于使用了分组查询注意力(GQA),往往具有更高的 $S_{inflection}$,因为它需要更长的序列长度才能达到相同的 KV 内存占用。
本节解释了为什么在长上下文、大批量场景下,KV 压缩比轻量级草稿模型更受青睐。主要有两个原因:
KV Cache 内存占用超过参数内存。与参数内存不同,KV Cache 的大小随批量大小线性增长。如果我们使用 LLaMA-3.1-8B 作为 LLaMA-3.1-70B 的草稿模型,LLaMA-2-7B 作为 LLaMA-2-70B 的草稿模型,草稿模型可能会占用目标模型内存的 38% 到 140%(如图 4a 和 4b 所示),因为它们的 $dim_{kv}/dim_{model}$ 比率更高。因此,在这种情况下,小型草稿模型是不够的,基于压缩 KV 的草稿策略非常有益【34, Triforce: Lossless acceleration of long sequence generation with hierarchical speculative decoding, 2024a, arXiv】。这可以从图 3a 中看出,该图说明了对于批量大小为256的 LLaMA-3.1-8B,使用固定 KV 大小的草稿进行自投机时,$T_D/T_T$ 如何随着序列长度的增加而趋近于0。
KV 压缩比模型压缩能实现更高的 token 接受率。在服务大批量请求时,高的草稿 token 接受率对于限制昂贵的验证步骤次数至关重要。有趣的是,我们发现 KV Cache 压缩是提高草稿 token 接受率的一种更具成本效益的方式,尤其是在大批量长上下文场景中。图 1c 展示了这一现象:如果一个目标 LLM 使用其自身 KV Cache 的稀疏化版本进行自我推测,那么它能达到的接受率要高于使用完整 KV Cache 的小型草稿模型。
总结。总之,一个带有压缩 KV Cache 的草稿模型在长上下文场景中实现了更高加速比的两个重要因素:低草稿成本和高接受率。图 7b 和 7c 通过实验证明了这种草稿策略相比使用小型草稿模型的标准 SD 在实现更高加速比方面的有效性。
本节介绍了 MagicDec 为确定正确草稿策略而执行的权衡分析。在第3.3节中,我们已经阐述了在这种情况下采用基于压缩 KV 的草稿策略的原因。然而,要有效利用 KV 压缩,我们需要考虑三个不同因素:(a)草稿模型大小,(b)草稿 KV Cache 大小或草稿 KV 预算,以及(c)KV 压缩算法。所有这三个因素都必须被考虑,以在草稿成本和接受率之间达到完美的平衡。
Top-K 注意力的局限性。最后,MagicDec 必须在不同类型的 KV 选择算法中进行选择,以调节搜索成本 $T_{select}$。尽管 top-k 注意力可以用小得多的 KV Cache 预算实现非常高的接受率,但由于其高昂的 KV 选择成本,它不是一个实用的草稿选项。
KV 选择算法的分类与权衡。top-k 注意力有许多潜在的替代方案,但确定最优方案并非易事。主要有两种 KV 选择算法:(a)动态 KV 选择算法,如【36, Quest: Query-aware sparsity for efficient long-context llm inference, 2024, arXiv】、【46, PQCache: Product Quantization-based KVCache for Long Context LLM Inference, 2024, arXiv】;(b)静态 KV 选择算法,如【42, Efficient streaming language models with attention sinks, 2024, arXiv】、【43, PyramidInfer: Pyramid KV Cache Compression for High-Throughput LLM Inference, 2024, arXiv】、【21, SnapKV: LLM Knows What You Are Looking for Before Generation, 2024, arXiv】。第一类算法为每个输入查询动态搜索 KV Cache,试图找到 k 个最近邻。虽然这些方法可以实现更高的接受率,但它们会产生大量的搜索成本。相反,静态 KV 选择方法在生成过程中预先收集一个稀疏的 KV Cache 用于注意力近似。这种方法消除了搜索开销,但通常导致接受率较低。
静态与动态算法的实证比较。我们使用我们的理论框架和 LLaMA-3.1-8B 模型在各种 Ruler 任务【17, Ruler: What’s the real context size of your long-context language models?, 2024, arXiv】上的自投机解码实证接受率,来评估最先进的 KV 选择策略。我们的分析包括静态(例如 StreamingLLM【42, Efficient streaming language models with attention sinks, 2024, arXiv】、SnapKV【21, SnapKV: LLM Knows What You Are Looking for Before Generation, 2024, arXiv】)和动态(例如 PQCache【46, PQCache: Product Quantization-based KVCache for Long Context LLM Inference, 2024, arXiv】、TopK)的 KV 选择算法,探索不同的 KV 预算和推测长度,以估计最优的理论加速比。
任务相关的性能差异。图 5 展示了两种代表性的 KV 稀疏化算法 SnapKV 和 PQCache 之间的权衡,以及它们在三个不同的 Ruler 任务上的各自理论加速比:带密钥的大海捞针3(niah-multikeys-3)、常用词提取(cwe)和问答1(qa-1)。SnapKV 是一种静态算法,其草稿与目标成本比低于 PQCache,因为 PQCache 会产生一个与批量大小相关的 KV 选择成本 $T_{select}$。
接受率与搜索成本的博弈。当静态和动态方法的接受率相似时,静态方法往往占主导地位,如在 cwe 和 qa-1 任务中所见。然而,对于 niah-multikeys-3 任务,PQCache 因其更高的接受率而显著受益。当接受率接近1时,PQCache 可以利用更长的推测长度,这显著降低了方程4中的目标函数。然而,随着批量大小的增加,KV 搜索成本再次占据主导,静态算法开始优于动态算法。
数据集
niah-multikeys-3、cwe 和 qa-1。模型架构
硬件配置
软件配置
结论总结
优化 LLM 推理的吞吐量和延迟极具挑战性,尤其是在长上下文、大批量场景下。本文的分析揭示,与现有误解相反,投机解码在这种场景下是有益的,并且其效用会随着批量大小的增加而增强。在寻找有效的草稿策略时,我们发现,在相同的内存预算下,KV 压缩比模型压缩更容易实现更高的接受率,这一优势在大批量和长上下文长度的场景下更为显著。基于这些洞见,我们探索了不同的 KV 压缩算法作为草稿策略,并提出了一个感知瓶颈的通用框架,以根据任务、批量大小和序列长度选择合适的草稿策略。
局限性与未来工作
* 局限性:MagicDec 仅关注长上下文 LLM 服务的解码性能,而预填充(prefill)阶段在这些场景中也同样充满挑战。此外,MagicDec 在高端 GPU 上往往能取得更好的加速效果,因为它们具有更高的 FLOPS 与内存带宽比和更大的 HBM 容量。
* 未来工作:
* 可以将 MagicDec 与专注于提升预填充性能的工作(如【2, Mnemosyne: Parallelization strategies for efficiently serving multi-million context length llm inference requests without approximations, 2024, arXiv】、【48, DistServe: Disaggregating Prefill and Decoding for Goodput-Optimized Large Language Model Serving, 2024, arXiv】)相结合,以同时改善预填充和解码性能。
* 可以探索在卸载(offloading)和分布式设置中采用投机解码,以减少通信开销,从而更好地利用普通设备的资源。
系统设计。我们的投机解码系统设计如图 8 所示,展示了使用静态 KV 压缩方法的过程。静态压缩的 KV 在预填充(prefill)阶段生成,并用于草稿生成。我们将该投机解码系统实现在了最先进的推理框架 MLC-LLM【37, MLC-LLM, 2023, GitHub】和一个自研的推理后端上。主要结果来自我们的自研后端。我们的后端与 MLC-LLM 的比较见附录 A.3。
自研后端优化。自研推理后端基于 GPT-Fast【29, Gpt-fast, 2023, GitHub】构建,并使用 Flashinfer【12, Flashinfer, GitHub】加速注意力计算。我们使用 torch.compile 来编译模型,并利用基于 Triton 的矩阵乘法来加速 MLP 层。我们使用 Pytorch CUDA graphs 来减少 CPU 内核启动开销。这些优化有助于最小化开销并提高加速比。我们还为嵌入层实现了张量并行,以进一步加速草稿生成。