Accurate KV Cache Quantization with Outlier Tokens Tracing

发表时间: 2025-07 · ACL 2025

原文: https://aclanthology.org/2025.acl-long.631

作者/机构:Yi Su, Yuechi Zhou, Quantong Qiu, Juntao Li, Qingrong Xia, Ping Li, Xinyu Duan, Zhefeng Wang, Min Zhang (苏州大学计算机科学与技术学院,苏州大学数据智能与高级计算重点实验室,华为云)

速读

一句话结论
本文提出了一种名为 OTT 的 KV Cache 量化方法,通过在推理时动态追踪并保留极少数异常 Token 的全精度,在 2-bit 量化下大幅提升了模型精度,同时实现了 6.4 倍的显存缩减和 2.3 倍的吞吐量提升。

要解决什么问题
大语言模型在自回归推理时,KV Cache 会随着序列长度和批次大小的增加占用海量显存,成为限制吞吐量的核心瓶颈。为了压缩显存,现有的主流方案是进行非对称量化(例如 KIVI 方法),即对 Key 按通道(channel-wise)量化,对 Value 按 Token 量化。这种方案基于一个假设:Key 在某些特定通道上的数值极大,但同一个通道内的数值分布相对均匀。然而,作者在深入分析后发现了一个致命卡点:有极少数的“异常 Token”打破了这一假设。在那些整体数值很大的 Key 通道中,这些异常 Token 的 Key 数值却非常小。在进行线性量化时,量化步长由通道内的最大值和最小值决定。这些极小值的出现会强行拉大极值差,导致量化步长急剧膨胀,进而让该通道内所有正常 Token 的量化误差被严重放大,最终导致模型在低比特(如 2-bit)量化时精度大幅掉点。

怎么做的
为了绕开上述卡点,作者提出了 OTT(Outlier Tokens Tracing)方法。其核心思路非常直接:既然极少数数值异常小的 Token 会毁掉整个通道的量化精度,那就把它们揪出来,不参与量化,直接以全精度保存。具体而言,OTT 的关键设计包含量化和解码两个阶段的部件。在量化阶段,方法定义了一个固定容量(例如只存 3 个)的异常池(outlier pool)。系统每生成 $G$ 个 Token(即一个分组)执行一次量化。此时,系统会计算当前分组内所有 Token 的 Key 向量的绝对值之和(即 $L_1$ 范数)作为异常分数:

$$S_i = \| \mathbf{K}_i \|$$


分数 $S_i$ 越小,说明该 Token 越偏离大通道的均匀分布。当前分组的 Token 会与异常池中原有的 Token 一起按 $S_i$ 从小到大排序,竞争留在异常池中的名额。一旦某个 Token 被判定为异常 Token,它在量化计算中就会被替换为所有 Token 的均值,从而彻底消除它对量化步长 $q$ 的负面影响:

$$q = (X_{max} - X_{min}) / (2^b - 1)$$
在解码阶段,系统会同时维护三种 KV Cache:被量化的 KV Cache、全精度的 KV Cache(包含尚未填满的当前分组和最近生成的滑动窗口 Token),以及异常池中的全精度 KV Cache。计算注意力时,Query 会分别与这三类 Key 矩阵相乘,拼接得到完整的注意力分数,再分别乘以对应的 Value 并求和。由于异常池极小且量化频率低,这种动态追踪带来的额外计算开销微乎其微。

效果如何
实验覆盖了 LLaMA-2(7B、13B、70B)、LLaMA-3-8B-Instruct 和 Mistral-7B-Instruct 等模型。对比的基线方法主要包括:全精度 FP16(作为性能上限)、KIVI(代表当前最强的免微调非对称量化路线)、GEAR(代表结合低秩与稀疏矩阵的误差补偿路线)、ZipCache(代表通道分离量化路线)以及 StreamingLLM 等 Token 驱逐路线。在常规上下文任务(GSM8K、BBH、HumanEval)和长上下文任务(LongBench、RULER)中,OTT 在 2-bit 量化设置下全面超越了 KIVI。例如在 LLaMA-3-8B-Instruct 的 BBH (3-CoT) 任务上,OTT 的准确率比 KIVI 高出 12.93%,且在绝大多数任务上几乎逼近 FP16 的无损表现。在硬件效率上,OTT 实现了高达 6.4 倍的峰值显存缩减,并在大批次推理时带来了 2.3 倍的吞吐量提升。作者也坦诚了该方法的局限性:由于保留了最近生成的全精度 Token 窗口,当输入序列极短且批次极大时,OTT 的实际压缩率会打折扣;在极端的超长文本生成任务中,2-bit 量化带来的微小误差累积仍可能导致轻微的精度损失。此外,消融实验发现模型的浅层(前两层)根本不存在这种异常 Token,因此在工程实现时需要将浅层的异常池大小直接设为 0。

主要贡献

大型语言模型(LLMs)展现出了令人印象深刻的能力,但其在部署过程中需要消耗大量的计算资源。尽管在推理过程中使用 KV Cache 可以显著减少重复计算,但它也引入了额外的内存开销。KV Cache 量化提供了一个极具前景的解决方案,能够在内存使用和准确性之间取得良好的平衡。先前的研究表明,Keys 是按通道(channel)分布的,而 Values 是按词元(token)分布的。因此,常见的做法是对 Keys 应用逐通道量化(channel-wise quantization),对 Values 应用逐词元量化(token-wise quantization)。然而,本文的进一步调查发现,一小部分异常的 tokens 表现出偏离这一规律的独特特征,这会大幅影响量化的准确性。

为了解决这一问题,本文提出了一种简单而有效的方法,在解码过程中准确追踪并识别这些 tokens,将它们作为异常 tokens 从量化过程中排除,从而显著提高了整体准确性。大量实验表明,该方法在 2-bit 量化下实现了显著的准确性提升,并能够将内存使用量减少 $6.4$ 倍,同时将吞吐量提高 $2.3$ 倍。

背景知识与关键观察

KV Cache 的实现机制。基于 Transformer 的 LLMs 通常利用 KV cache 来防止注意力分数的冗余计算并加速自回归解码。带有 KV cache 的 LLMs 生成过程分为预填充(prefill)阶段和解码(decoding)阶段。给定提示 $X = \{x_0, x_1, ..., x_{n-1}\}$ 及其经过嵌入后的张量 $\mathbf{X} \in \mathbb{R}^{b \times n \times d}$,其中 $b$ 是批处理大小,$n$ 是提示长度,$d$ 代表隐藏层维度,注意力块的计算过程如下(省略多头注意力机制中的头数):
i) 在预填充阶段,通过每一层的 Key 和 Value 权重矩阵 $\mathbf{W}_k, \mathbf{W}_v \in \mathbb{R}^{d \times d}$ 对 $\mathbf{X}$ 进行变换,计算并缓存 Keys $K_{<n}$ 和 Values $V_{<n}$,公式如下:<br />

$$K_{<n} = \mathbf{X}\mathbf{W}_k, \quad V_{<n} = \mathbf{X}\mathbf{W}_v$$ <p>
ii) 在解码阶段,只需要计算新 token $x_n$ 的 Keys 和 Values,然后将它们与缓存的 Keys 和 Values 结合,以计算新的注意力分数和输出。对于当前输入张量 $\mathbf{X}_n \in \mathbb{R}^{b \times 1 \times d}$,按如下方式更新 KV cache:
$$K = K_{<n} \| K_n, \quad V = V_{<n} \| V_n$$</div> 其中 $K_n = \mathbf{X}_n\mathbf{W}_k$ 且 $V_n = \mathbf{X}_n\mathbf{W}_v$。接着计算新的注意力输出 ATT:
$$\mathbf{Q}_n = \mathbf{X}_n\mathbf{W}_q, \quad \mathrm{ATT} = \sigma \left( \frac{\mathbf{Q}_n\mathbf{K}^\top}{\sqrt{d_k}} \right)\mathbf{V}$$
其中 $\mathbf{W}_q$ 是查询权重矩阵,$\sqrt{d_k}$ 是归一化因子,$\sigma$ 是 softmax 函数。

压缩的必要性。虽然 KV cache 将计算复杂度从 $O(n^2)$ 降低到 $O(n)$,但它引入了巨大的 GPU 内存开销,特别是在长序列和长批处理大小的情况下。例如,对于 LLaMA-3-8B,层数 $n_{\mathrm{layers}}$ 为 32,头数 $h$ 为 8,头部维度 $d$ 为 512,输入长度 $l$ 为 8192,批处理大小 $b$ 为 64 时,以 fp16 精度(每个值 2 字节)执行推理需要 $4bhdl n_{\mathrm{layers}}$ 字节来存储 KV cache——相当于 256GB 的内存。因此,有效地压缩 KV cache 对于减少 GPU 内存使用至关重要。

均匀量化与分组量化。压缩 KV cache 的直接方法是均匀量化(Uniform Quantization),它将连续数值数据映射到离散域。具体来说,将高精度矩阵(例如 float32)$\mathbf{X}$ 量化为 $b$-bit 精度的矩阵 $\mathbf{X}'$,首先确定量化步长 $q$。每个元素 $X_{i,j} \in \mathbf{X}$ 可以量化为 $\mathsf{Q}(X_{i,j})$:

$$\mathsf{Q}(X_{i,j}) = \lfloor (X_{i,j} - \mathbf{X}_{min}) / q \rfloor$$

$$q = (\mathbf{X}_{max} - \mathbf{X}_{min}) / (2^b - 1)$$
其中 $\lfloor \cdot \rfloor$ 是向下取整函数。然而,均匀量化没有充分利用数据的分布特征,这可能导致显著的量化误差,尤其是在存在异常值的情况下。更先进的技术是分组量化(Group Quantization),它将矩阵分成多个组,期望每组内的数据共享相似的分布特征。与均匀量化不同,分组量化允许每组具有不同的量化参数(如步长)。这种灵活性使该方法能够更好地适应数据的局部特征,从而在保持低位宽的同时减少量化误差。KIVI 提出的逐通道 Key 量化和逐词元 Value 量化就是一种分组量化。

Keys 和 Values 的分布探索。为了深入理解 Keys 和 Values,本文以 LLaMA-2-7b-chat-hf 生成的句子为例进行了初步实验。观察第 10 层、第 17 头的 Keys 和 Values 的幅度发现,某些通道表现出异常大的 Keys,并且在这些通道内,Keys 的分布显得相对均匀。相比之下,Values 没有明显的特征。这些观察结果与 KIVI 是一致的。

异常通道中的分布特征。进一步调查这些异常通道的分布发现,虽然 Keys 通常表现出均匀的分布,但有少数 tokens 是明显的例外。这种模式在排序后变得更加清晰,一些 Keys 具有非常小的值,而其他 Keys 则显著更大。这些例外会大幅增加量化公式中的 $X_{max} - X_{min}$,最终降低量化准确性。

识别与移除异常 Tokens。直观上,在异常通道中 Key 幅度非常小的 tokens,其整体幅度也很可能较小。通过绘制异常通道中的 Keys 和所有通道中 Keys 的幅度,结果证实了这一假设,表明可以通过 Keys 的幅度有效且准确地识别这些异常 tokens。由于异常 tokens 会严重影响量化准确性,通过在量化过程中排除这些异常 tokens 并以全精度保留它们,可以大大减少注意力输出的损失。实验结果揭示,保留具有最大 Keys 的 tokens 性能最差,而保留具有最小 Keys 的 tokens 则取得了最佳结果,这与前文的发现相吻合。
初步实验的观察结果:(a) Keys 按通道分布并具有一些异常通道。(b) Values 的分布没有表现出任何显著特征。(d) 在某些异常通道中,少数具有低幅度 Keys 的 tokens 破坏了这些通道内原本均匀的分布。(e) 异常通道中排序后 Keys 的可视化显示,数值从极低值迅速增加到极高值。(c) 基于不同标准保留全精度 tokens 时,量化前后注意力输出的 L1 损失。最佳结果是保留具有最小 Key 幅度的全精度 tokens。

方法细节

异常 Tokens 追踪的动态识别机制。基于前文的观察,一小部分异常 tokens 会严重影响量化的准确性。因此,本文尝试在量化过程中动态识别这些 tokens,在量化时将它们排除,并保留它们的全精度表示。该方法由两个核心组件构成:量化(Quantization)和解码(Decoding)。

量化阶段的设计与执行。首先,定义一个固定大小的异常池(outlier pool),其容量为 outlier_num,用于存储异常 tokens 的 Keys 和 Values。接着,遵循 KIVI 【索引 29,KIVI: A tuning-free asymmetric 2bit quantization for KV cache,2024年,ICML会议】的方法,采用逐通道的 Key 量化和逐词元的 Value 量化。然后,每隔 $G$(组大小,本方法中的一个超参数)步对 KV Cache 进行一次量化。因此,在每个量化步骤中,有 $G$ 个 tokens 需要被量化。基于前文探索出的规则,计算每个 token 的 Keys 幅度作为衡量标准,所有 tokens(包括待量化的 tokens 和已经在异常池中的 tokens)根据该标准竞争异常池中的位置。一旦某个 token 被选为异常 token,该 token 的 Keys 和 Values 将被所有 tokens 的平均值替换,以消除它们对当前组量化参数的影响。最后,当异常池已满且需要进行替换时,那些原本在异常池中但被新加入的 tokens 击败的 tokens 需要返回到它们原来的位置进行量化。为了简化实现,本文维护了一个额外的池来存储这些被淘汰的 tokens,当这个额外的池满了时,便停止识别新的异常 tokens。

解码阶段的多精度注意力计算。在解码过程中,系统维护了三种类型的 KV Cache:量化的 KV Cache、全精度的 KV Cache 以及存储在异常池中的 KV Cache。其中,全精度的 KV Cache 包括组 tokens(当组未满时,这些 tokens 不会被量化并保持全精度)和最近的 tokens(用于最近 tokens 的全精度滑动窗口)。首先,将 Query 乘以上述三种类型的所有 Keys,并将结果拼接起来以生成注意力分数。接着,将这些注意力分数乘以每种类型对应的 Values,并将它们相加生成最终的注意力输出。最后,为了提高解码效率,系统利用了一个 CUDA 融合内核(fused kernel)来执行全精度和量化矩阵的乘法运算。
OTT 概览。上图:解码阶段。将 Query 乘以每种类型的 Keys 并拼接结果以获得注意力分数。将注意力分数乘以每种类型的 Values 并对结果求和以获得注意力输出。下图:量化阶段。在量化之前处理异常 tokens。

实验环境

  • 数据集

    • 常规上下文长度评估:GSM8K(算术推理)、BBH(主流语言与符号推理)、HumanEval(代码补全)。
    • 长上下文长度评估:LongBench 中的四类任务,包括 Document QA、Summarization、Few-shot Learning 和 Code completion。
  • 模型架构:LLaMA-2-7B-chat-hf、LLaMA-2-13B-chat-hf、LLaMA-3-8B-Instruct、Mistral-7B-Instruct-v0.2。

  • 硬件配置:NVIDIA A100 40G GPUs(吞吐量测试中使用 NVIDIA A800 80G)。
  • 软件配置:KIVI 作为强大的免微调基线。2-bit 量化。对于 OTT,设置组大小 $G = 128$,残差长度(滑动窗口大小)$R = 32$,outlier_num 设置为 3。前两层不设异常池(outlier_num = 0)。淘汰 tokens 附加池大小为 32。Keys 和 Values 每 $G$ 步同时压缩。测试框架使用 LM Eval 和 InstructEval。

实验结果

  • 常规上下文长度评估:在 GSM8K 和 BBH(few-shot, few-shot CoT, zero-shot CoT)以及 HumanEval(pass@1, pass@10)上,OTT 在所有设置下均显著优于 KIVI。例如,在 BBH (3-CoT, LLaMA-3-8B-Instruct) 上,OTT 比 KIVI 提高了 12.93%。与 FP16 相比,OTT 在大多数设置下仅产生微小的准确度损失。最大准确度下降出现在 BBH (3-CoT, Mistral-7B-Instruct) 上,这可能是由于任务复杂度高和需要的生成长度长所致。
  • 长上下文长度评估:在 LongBench 上(Table 2),OTT 在大多数设置下优于 KIVI,与 FP16 基线相比性能差距极小。虽然 KIVI 在大多数任务上保持了良好的准确性,但偶尔会出现显著的性能下降(例如,LLaMA-3-8B-Instruct, LCC: $56.58\% \rightarrow 44.42\%$)。然而,OTT 没有遇到这种情况,这表明该方法实现了比 KIVI 更高的量化准确性。
  • 效率比较:吞吐量测试(Fig 3a)显示,在小批处理大小下,OTT 略慢于 FP16。但随着批处理大小增加,OTT 展现出显著的速度优势,且始终快于 KIVI(因为 OTT 不需要每步压缩 Values)。内存测试(Fig 3b/3c)表明,量化显著降低了内存使用。OTT 需要的内存略多于 KIVI(因保留了更多全精度 tokens),但随着序列长度增加,这种影响逐渐减小。最终 KIVI 和 OTT 的压缩比均达到约 $6.4\times$。
    吞吐量和内存的实验:(a) 在 NVIDIA A800 80G 上不同批处理大小下不同方法的吞吐量 (tokens/s) 比较。(b) 在 NVIDIA A800 80G 上不同批处理大小下的峰值内存使用情况(包括模型权重和其他组件)。(c) 在 NVIDIA A100 40G 上,当 batch size = 1 时,不同序列长度下的峰值内存使用情况。结果显示 OTT 实现了高达 6.4 倍的峰值内存减少和 2.3 倍的吞吐量增加。
  • 消融实验
    • 组大小与残差长度:较大的残差长度会增加内存但提高准确性;固定残差长度时,组大小影响不明显。为平衡性能和压缩比,主实验选择 $G=128, R=32$。
    • 异常 Token 数量:保留哪怕 1 个异常 token 也能显著提升性能,但继续增加 outlier_num 收益递减且增加内存开销,因此选定 outlier_num = 3
    • 浅层异常 Tokens:实验发现浅层不存在异常 tokens,在浅层将 outlier_num 设为 0 几乎不影响性能,因此主实验中所有模型前两层的 outlier_num = 0

结论

本文从 KIVI 的假设出发,进一步探索了异常通道中 Keys 的分布。观察到少数异常 tokens 偏离了 KIVI 的假设。量化这些 tokens 会产生不利影响,因为它增加了其他 tokens 的量化误差。基于这些观察,本文提出了带有异常 Tokens 追踪的 KV Cache 量化方法(OTT),该方法利用 Keys 的幅度在解码过程中动态追踪这些 tokens,将它们从量化过程中排除,同时保留它们的全精度表示。大量实验表明,该方法在准确性上取得了显著提升,同时大幅降低了内存使用量并提高了吞吐量。

未来的局限性在于:当序列长度极短且批处理大小极大时,由于组 tokens 和最近 tokens 的存在,OTT 的压缩比会降低;在极长生成任务下,由于误差累积,2-bit 量化偶尔仍会产生一定的精度损失。

补充细节(相关工作)

LLMs 的高效推理。大型语言模型通常具有庞大的参数,导致推理计算成本高昂。为解决此问题,一些研究采用参数修剪技术消除冗余参数(如 LLM-Pruner, SparseGPT)。其他研究专注于量化模型权重,例如 GPTQ 使用二阶信息将模型量化为 3 或 4-bit 精度;AWQ 基于激活分布保留关键权重,量化其余权重。这些方法可以与 KV Cache 压缩结合使用。

KV Cache 压缩。KV Cache 压缩能以最小精度损失显著减小尺寸。Liu 等人(2024b)发现 Keys 的异常通道幅度极大;Hooper 等人(2024)发现在旋转位置嵌入之前量化 Key cache 可减少负面影响;Xiao 等人(2024)提出了 StreamingLLM 保留初始和最终 tokens;Sun 等人(2024)发现了“海量激活”模式,少数激活值远高于其他值并作为关键偏置项;Zhang 等人(2023)发现只有少数 tokens 影响输出。

附录

A 附加图表。附录提供了额外的初步实验图表。图 4 展示了异常通道中的 Keys 与整体 Keys 幅度的对应关系。图 5 和图 6 验证了浅层(如 Layer 0)中不存在异常通道和异常 tokens 的现象。
异常通道中的 Keys(上)和整体 Keys 的幅度(下)。
LLaMA-2-7B-chat-hf 在第 17 头的 Keys 和 Values 的幅度。
异常通道中的 Keys(上)和异常通道中排序后的 Keys(下)。

B 额外实验结果
在 LLaMA-2-70b-chat-hf 上的实验。为了验证在更大模型上的性能,在 LLaMA-2-70b-chat-hf 上进行了额外实验。实验设置与主实验完全一致。结果表明,OTT 在更大模型上基于 KIVI 依然能取得更高的准确性优势。
与 token 淘汰方法的比较。将 OTT 与 StreamingLLM、H2O 和 SnapKV 等 token 淘汰方法在 LongBench 上进行了比较。为了保持压缩比一致,在预填充阶段淘汰 84% 的 tokens。结果表明,即使在更有利的设置下,表现最好的 SnapKV 依然略低于 OTT。
与 ZipCache 的比较。将 OTT 与 ZipCache 进行了比较,设置 20% 的 tokens 为 4-bit 量化,80% 为 2-bit 量化以保持压缩率一致。结果显示 ZipCache 的表现弱于 KIVI 和 OTT。

C 额外时间分析
计算开销的详细拆解。计算开销主要来自两方面。首先,在压缩阶段,系统需要计算每个 token 的 key 幅度、进行比较、选择索引并进行量化。虽然异常操作的成本相对量化较高,但由于压缩仅每 $G$ 步执行一次,因此与整个解码过程相比,该时间成本几乎可以忽略不计。其次,在注意力计算阶段,系统需要计算异常池中的 qkv,并根据异常 token 索引覆盖注意力分数,这具有一定的成本。通过绘制注意力块中详细的时间消耗比例(图 7),异常操作约占 $18\%$。考虑到整个前向步骤中的预处理、后处理和 FFN 计算,异常操作的时间比例非常小。
注意力块中的时间比例。

D 低幅度 Keys 破坏注意力权重的证明
量化误差分析。定义 $K_c \in \mathbb{R}^n$ 为包含 $n$ 个 Key 值的异常通道,其中存在一个子集 $S$,其大小 $m \ll n$,使得非 $S$ 中的元素服从均匀分布 $K_{c,i} \in [\mu - \sigma, \mu + \sigma]$,而 $S$ 中的异常元素 $K_{c,j} \in [\epsilon, \delta]$,且 $0 < \epsilon \ll \mu - \sigma$。低幅度异常值的存在迫使全范围变为 $X_{\min} \le \epsilon \ll \mu - \sigma$ 且 $X_{\max} \ge \mu + \sigma$。这导致量化步长膨胀为 $q = \frac{(\mu + \sigma) - \epsilon}{2^b - 1} \gg \frac{2\sigma}{2^b - 1}$。因此,低幅度异常值放大了量化步长,导致该通道中所有 tokens 的近似误差变大。
误差向注意力权重的传播。对于查询向量 $Q \in \mathbb{R}^d$ 和量化后的 Key 矩阵 $K'$,注意力分数为 $A_i = \frac{QK_i'}{\sqrt{d}}$。量化后的分数为 $A_i^{\mathrm{quant}} = A_i + \Delta A_i$。在异常通道 $c$ 中,误差传播为 $\Delta A_i \propto Q_c(K_{c,i}' - K_{c,i}) \approx Q_c \cdot q$。由于在异常通道中 $|Q_c|$ 通常很大,量化步长中的误差被放大并传播到了注意力权重中。

E OTT 的数学公式化
异常 Token 识别与竞争机制。对于具有 Key 向量 $\mathbf{K}_i$ 的 token $t_i$,其异常分数 $S_i$ 计算为其 Keys 的幅度,通常通过 $L_1$ 范数测量:

$$S_i = \|\mathbf{K}_i\|$$


在每个量化步骤中,当前组 $\mathcal{T} = \{t_1, t_2, \ldots, t_G\}$ 中的 tokens 与现有异常池 $\mathcal{O}$(容量为 $N$)竞争。首先计算所有 tokens 的 $S_i$;然后将它们合并并按 $S_i$ 升序排序;接着选择具有最小 $S_i$ 的前 $N$ 个 tokens 形成新的异常池 $\mathcal{O}^{(t+1)}$:

$$\mathcal{O}^{(t+1)} = \operatorname*{argmin}_{\mathrm{top-}N \mathrm{\ tokens\ by\ } S_i} \left( \mathcal{O}^{(t)} \cup \mathcal{T}^{(t)} \right)$$
异常 tokens 被排除在量化之外,而非异常 tokens 使用逐通道和逐词元方法进行量化。

F 初步结果的统计分析
在 LongBench 上记录了生成过程中前 1024 个 tokens 的 Layer 10, Head 16 的 keys,将通道值范围分为十等份并记录 tokens 落入的区间,结果证实了极少数 token 落在极小值区间的假设。

G 额外基准测试和基线
为了全面验证 OTT 的有效性,增加了 Needle-in-a-Haystack 和 Ruler 基准测试,以及 ZipCache 和 GEAR 基线方法。
在 Needle-in-a-Haystack 上的结果。实验结果(图 9 和图 10)显示,GEAR 在所有方法中表现最好,但牺牲了内存和吞吐量。OTT 的表现优于 KIVI(将准确率从 $93.1\%$ 提高到 $99.2\%$),而 ZipCache 表现最差。
在 Ruler 上的结果。GEAR 依然取得最佳准确度,OTT 在 $G=32$ 和 $G=128$ 时均取得了比 KIVI 更好的准确度,证明了该方法的有效性。
在 LongBench 的完整结果。OTT 在 LongBench 上几乎没有损失,表现与 GEAR 几乎一样好,并明显优于 ZipCache 和 KIVI。
在 Helmet 和 LongBench-v2 上的结果。在公平比较下,OTT 在这两个基准测试中的表现均优于基线方法。
在更长模型上的结果。使用 Llama-3-8B-ProLong-512k-Instruct 在 64k 和 128k 上下文长度下测试 Ruler,结果表明该方法在超长场景下表现良好。
吞吐量和内存分析。在 NVIDIA A100 40GB GPU 上使用 LLaMA-2-7B-chat-hf 进行的额外实验(图 8)表明,OTT 的吞吐量略高于 KIVI(因为其残差 tokens 的处理比 KIVI 更简单)。在内存使用方面,OTT 消耗的内存略多于 KIVI,因为需要存储更多 tokens,而 ZipCache 使用的 GPU 内存最少。由于 GEAR 代码库仅支持伪压缩(且真压缩不支持异常值处理),因此未在图中展示。
在 NVIDIA A100 40G 中,输入长度 = 64,输出长度 = 384,批处理大小 = 128 时,LLaMA-2-7B-chat-hf 下不同方法的吞吐量(左)和内存使用(右)。
在具有 4k 上下文大小的 LLaMA-2-7B-chat-hf 上 Needle-in-a-Haystack 的结果。表格的纵轴代表深度百分比,横轴代表 token 长度。
在具有 8k 上下文大小的 LLaMA-3-8B-Instruct 上 Needle-in-a-Haystack 的结果。表格的纵轴代表深度百分比,横轴代表 token 长度。

方法细节中的引用汇总

  • 【索引 29,KIVI: A tuning-free asymmetric 2bit quantization for KV cache,2024年,ICML会议】:在“量化阶段的设计与执行”段落中被引用。原文描述为“Following KIVI (Liu et al., 2024b), we use channel-wise Key quantization and token-wise Value quantization.”,用于支撑本文采用与 KIVI 相同的逐通道 Key 量化和逐词元 Value 量化的基础量化架构。