发表时间: 2025-07 · ACL 2025 Findings
原文: https://aclanthology.org/2025.findings-acl.997
Chaoyi Jiang, Lei Gao, Hossein Entezari Zarch, Murali Annavaram / University of Southern California
一句话结论 本文提出了 KVPR,一种通过在 GPU 上部分重计算 KV Cache 并与 CPU-GPU 异步传输相重叠的 I/O 感知大语言模型推理方法,在解码阶段将延迟降低了最高 35.8%,吞吐量提升了最高 46.2%。
要解决什么问题 大语言模型在自回归解码阶段需要缓存键值对(KV Cache)以避免重复计算,但随着批处理大小、序列长度和模型规模的增加,KV Cache 的显存占用会迅速超出 GPU 的物理容量。现有的高性价比方案是将 KV Cache 卸载到廉价且容量大的 CPU 内存中,但这会将系统瓶颈转移到 CPU 与 GPU 之间的 PCIe 总线带宽上。由于 PCIe 的传输延迟通常比 GPU 重新计算这些特征的延迟高出一个数量级(例如在 PCIe 4.0 下,传输延迟可能是计算延迟的数十倍),传统的异步流水线方法无法将漫长的 I/O 传输时间与短暂的 GPU 计算时间完全重叠,导致 GPU 存在大量空闲等待时间。另一方面,部分现有路线尝试让 CPU 直接分担注意力计算来掩盖传输开销,但这在单 CPU 挂载多 GPU 的分布式部署中会严重透支 CPU 算力,使其成为新的系统卡点。
怎么做的 核心思路是“部分重计算与异步传输重叠”。与其通过缓慢的 PCIe 总线把完整的 KV Cache 从 CPU 传到 GPU,不如只传一小部分体积更小的历史激活值(Activations)到 GPU,让 GPU 利用这些激活值重新计算出对应的局部 KV Cache;与此同时,CPU 通过 PCIe 并发传输剩余的那部分 KV Cache。因为激活值的体积远小于生成的 KV Cache,且 GPU 算力极强,这种做法能人为增加 GPU 的计算耗时并减少 PCIe 的传输数据量,从而让两者的耗时完美对齐,消除 GPU 的空闲等待。该方法由三个关键部件构成:分析器(Profiler)、调度器(Scheduler)和运行时(Runtime)。分析器负责收集当前系统的硬件特征,如 PCIe 传输带宽 $v_{com}$ 和 GPU 处理速度 $v_{gpu}$。调度器负责计算最优的切分点 $l$(即前 $l$ 个 Token 走重计算,后 $s'-l$ 个 Token 走直接传输)。假设当前序列长度为 $s'$,批大小为 $b$,隐藏层维度为 $h$,重计算前 $l$ 个 Token 的 KV Cache 所需的时间为:
处理单层的总耗时由激活值传输时间,加上“重计算时间”与“剩余 KV Cache 传输时间”两者的最大值构成:
效果如何 实验在配备单张 NVIDIA A100(40GB 显存)和 AMD EPYC 64 核 CPU 的服务器上搭建,两者通过带宽为 32 GB/s 的 PCIe 4.0 x16 连接。测试模型主要为 OPT-6.7B、OPT-13B 和 OPT-30B。实验分为两个主要场景并对比了不同路线的基线方法:在以降低延迟为目标的场景下(模型权重保留在显存,仅卸载 KV Cache),对比了 DeepSpeed Inference 和 Hugging Face Accelerate;在以最大化吞吐量为目标的场景下(权重和 KV Cache 均卸载到 CPU,采用列式调度),对比了 FlexGen;此外还对比了代表“CPU 辅助计算”路线的 FastDecode。量化结果显示,在延迟导向测试中(OPT-6.7B,输入 128 且生成 128 个 Token),KVPR 比 Hugging Face Accelerate 的延迟降低了 35.8%。在吞吐量导向测试中,KVPR 相比 FlexGen 在 OPT-13B 上实现了最高 46.2% 的吞吐量提升,并在解码阶段将 GPU 利用率从 85% 压榨到了 99%。在多 GPU 共享单 CPU 的并发测试中,KVPR 避免了 FastDecode 因透支 CPU 算力而导致的性能崩塌,展现出更好的扩展性。该方法的代价是增加了 GPU 的纯计算开销(在运行耗时占比中从 2.3% 增加到 13.3%)。作者承认的局限性包括:当前仅支持单卡或数据并行架构,尚未扩展到张量并行或模型并行等高级分布式系统以支持更大模型;此外,系统分析器目前仅在推理开始前进行静态采样,无法在多租户等硬件资源动态波动的环境中进行自适应调整。
大型语言模型(LLM)的推理计算量巨大。为了降低自回归解码的成本,通常使用键值(KV)缓存来存储中间激活值,从而显著降低生成Token的计算开销。然而,KV缓存所需的内存增长迅速,经常超出GPU内存的容量。一种具有成本效益的替代方案是将KV缓存卸载到CPU内存中,这虽然缓解了GPU内存压力,但将系统瓶颈转移到了CPU和GPU之间有限的PCIe连接带宽上。现有方法(如计算与I/O重叠、CPU-GPU异构执行)试图解决这些问题,但受到过量数据移动和对CPU能力依赖的阻碍。随着KV缓存规模的增长或GPU计算能力的提升,完全隐藏PCIe通信延迟变得极具挑战性。
为了解决这一问题,本文提出了KVPR,一种高效的I/O感知LLM推理方法。其核心创新点在于:
实验结果表明,与最先进的方法相比,KVPR在解码期间的延迟降低了最高 $35.8\%$,吞吐量提高了最高 $46.2\%$。
为了评估通信开销的影响,作者设置了一个使用NVIDIA A100 GPU的LLM推理服务系统(如图1所示)。表1展示了基于该系统的PCIe传输时间和GPU计算延迟对比。结果表明,PCIe延迟超过KV缓存重计算延迟一个数量级以上。因此,在KV缓存存储于CPU DRAM的系统中,漫长的传输时间会导致GPU空闲,严重影响推理效率。
表1:基于图1系统的不同KV缓存大小的PCIe延迟和计算延迟(Batch Size=32, Sequence Length=1024, FP16)
| Model | Hidden Dim | KV Cache (MB) | PCIe Latency (ms) | Comp. Latency (ms) |
|---|---|---|---|---|
| OPT-6.7B | 4,096 | 512 | 15.6 | 0.3509 |
| OPT-13B | 5,120 | 640 | 19.5 | 0.4388 |
| OPT-30B | 7,168 | 896 | 27.3 | 0.6143 |
LLM推理过程
仅解码器(Decoder-only)LLM的推理过程采用自回归方法顺序生成Token。它包含两个阶段:预填充(Prefilling)阶段和解码(Decoding)阶段。
在预填充阶段,第 $i$ 个解码器层的输入表示为 $X^i \in \mathbb{R}^{b \times s \times h}$,其中 $i \in \{1, \dots, n\}$, $b$ 是批量大小(batch size), $s$ 是提示词长度(prompt length), $h$ 是输入嵌入维度。多头注意力(MHA)块通过对 $X^i$ 进行线性投影来计算一组查询($Q$)、键($K$)和值($V$):
其中 $W_Q^i, W_K^i, W_V^i \in \mathbb{R}^{h \times h}$ 是投影矩阵。生成的 $K^i$ 和 $V^i$ 被存储在KV缓存中。
MHA中的自注意力分数计算如下:
在解码阶段,第 $i$ 个解码器层接收单个Token $x^i \in \mathbb{R}^{b \times 1 \times h}$。KV缓存通过将新计算的键值对与现有键值对拼接来进行更新:
LLM推理调度
针对大容量KV缓存存储在CPU DRAM并在需要时提取到GPU内存的系统,存在不同的调度策略:
设计概述
为了缓解PCIe压力并提高GPU计算利用率,KVPR在将部分KV缓存传输到GPU的同时,在GPU上重计算剩余的部分KV缓存。KVPR包含三个主要模块:分析器(Profiler)、调度器(Scheduler)和运行时(Runtime)。用户配置包括性能目标(延迟或吞吐量)、数据参数(提示词长度、生成长度、批量大小)和模型信息。分析器模块收集系统统计信息(如PCIe带宽和GPU处理速度)。调度器模块利用这些信息,通过求解线性规划问题计算出最佳的KV缓存重计算分割点,旨在最大化计算与通信的重叠。运行时模块利用该执行策略处理用户输入,管理内存分配和数据传输流。
调度器模块(Scheduler Module)
这些激活值的内存使用量为:
运行时模块(Runtime Module)
延迟导向实验:在单Batch(大小为64)不同序列长度下评估解码延迟。结果(图7)显示,KVPR在OPT-6.7B和OPT-13B上始终优于DeepSpeed Inference和Hugging Face Accelerate。在较长生成长度下延迟降低尤为明显。例如,对于OPT-6.7B,当提示词长度为128且生成128个Token时,与Hugging Face Accelerate相比,延迟降低了约 $35.8\%$。
吞吐量导向实验:将有效批量大小设置为 $32 \times 8$(每层连续计算8个大小为32的Batch)。图6第一行显示,KVPR在所有序列长度和不同模型下始终优于FlexGen,在OPT-6.7B、OPT-13B和OPT-30B上分别实现了高达 $15.1\%$、$46.2\%$ 和 $29.0\%$ 的吞吐量加速。图6第二行显示了固定序列长度(提示词1024,生成32)下不同批量大小(1到48)的对比,随着KV缓存变大,KVPR由于减少了PCIe上的KV缓存传输,展现出更大的性能优势。
GPU利用率:图8分析了KVPR和FlexGen的时间资源利用率。在解码阶段,与FlexGen相比,KVPR通过将GPU计算与CPU-GPU数据传输重叠,将GPU利用率从 $85\%$ 提高到平均 $99\%$,同时保持了相同的峰值内存使用量。
KV缓存压缩兼容性:应用分组4-bit量化压缩KV缓存。图9表明,应用压缩减少了传输到GPU的数据量,进一步提高了解码吞吐量,证明了KVPR与KV缓存压缩技术的兼容性。
消融实验(隐藏KV缓存部分重计算):在极小KV缓存(确保MHA权重晚于KV缓存到达GPU)的场景下,通过将MHA权重传输与KV缓存重计算重叠的细粒度流水线,KVPR确保了性能不会差于FlexGen。
本文提出了KVPR,这是一种旨在加速KV缓存加载的高效CPU-GPU I/O感知LLM推理方法。KVPR通过利用KV缓存部分重计算,最小化了CPU和GPU之间的数据传输。通过将这种重计算与数据传输重叠,KVPR显著减少了GPU空闲时间并提高了整体推理性能。未来的工作可以将该方法扩展到容忍从远程网络存储加载KV缓存,或扩展到大型多GPU基础设施,以进一步增强其在多样化部署场景中的适用性和性能。
局限性:目前该方法仅限于单GPU和数据并行的多GPU推理,尚未扩展到模型或张量并行等高级分布式系统。此外,当前实现仅在推理开始时进行系统分析,假设硬件条件是静态的,未来加入动态分析和运行时自适应优化将增强其在异构或多租户环境中的鲁棒性。
调度方法(Scheduling Methods):
图11详细说明了在解码阶段生成2个Token时的两种调度方法。图11(a)展示了逐行调度,在移动到下一个Batch之前跨所有层处理每个Batch。图11(b)展示了逐列调度,每层被复用以处理一组Batch,然后再移动到下一层。
带有重叠的KV缓存部分重计算(KV Cache Partial Recomputation with Overlapping):
基于FlexGen【索引编号1,Sheng 等人 2023】的计算与通信重叠技术,KVPR对其进行了调整以支持KV缓存部分重计算。算法1展示了最内层循环中任务的并发执行,包括:加载下一层的权重、加载用于下一Batch KV缓存重计算的激活值、加载下一Batch的剩余KV缓存和激活值、计算当前Batch、以及存储上一Batch的KV缓存和激活值。
Algorithm 1 KV Cache Partial Recomputation with Overlapping
for i = 1 to generation_length do
for j = 1 to num_layers do
for k = 1 to num_GPU_batches do
// Load the weight of the next layer
load_weight(i, j + 1, k)
// Load the activation for KV cache recomputation of the next batch
load_activation_recompute(i, j, k + 1)
// Load the KV cache and activation of the next batch
load_cache(i, j, k + 1)
load_activation(i, j, k + 1)
// Compute this batch
compute(i, j, k)
// Store the KV cache and activation of the previous batch
store_activation(i, j, k − 1)
store_cache(i, j, k − 1)
最优KV缓存划分点(Optimal KV Cache Split Points):
图12展示了通过求解线性规划问题获得的最优KV缓存划分点 $l$(针对提示词长度128,生成长度32的设置)。基于系统分析统计和KV缓存大小,当生成长度为1时,最优划分点 $l$ 为182;当生成长度达到32时,$l$ 增加到128。
低端GPU系统性能(System Performance with a Low-end GPU):
在配备AMD EPYC 32核CPU和NVIDIA Quadro RTX 5000 GPU(16 GB HBM,PCIe 4.0 x8,16 GB/s带宽)的低端系统上进行了评估。尽管GPU速度和带宽降低,在吞吐量导向的工作负载中,KVPR对OPT-6.7B的吞吐量仍比FlexGen高出最高 $15\%$。
LLaMa模型的额外实验结果(Additional Experimental Results on LLaMa Models):
在LLaMa2-7B和LLaMa2-13B模型上进行了实验。处理大小为64的单个Batch时,在不同的提示词和生成长度下,KVPR的吞吐量始终高于DeepSpeed Inference和Hugging Face Accelerate基线(如图13所示)。
分布式系统中与CPU辅助方法的比较(Comparing with CPU-assisted Approaches in Distributed System Setup):
在一个配备8个NVIDIA A100 GPU和单CPU的节点上,比较了CPU辅助卸载方法FastDecode【索引编号3,He 和 Zhai 2024】与KVPR的性能。FastDecode依赖CPU进行注意力计算,当管理多个并发推理进程时,CPU成为瓶颈导致性能下降。相反,KVPR完全消除了对CPU的依赖,优化了PCIe上的数据传输。图14表明,随着进程数量的增加,FastDecode的吞吐量显著下降,而KVPR表现出更好的可扩展性,在单CPU多GPU系统中保持了稳定的性能。