VecInfer: Efficient LLM Inference With Low-Bit KV Cache via Outlier-Suppressed Vector Quantization
VecInfer: Efficient LLM Inference With Low-Bit KV Cache via Outlier-Suppressed Vector Quantization
发表时间: 2026-07 · ACL 2026
原文: https://aclanthology.org/2026.acl-long.1454
作者/机构:Dingyu Yao 等 / 中国科学院信息工程研究所,中国科学院大学网络空间安全学院,小米公司
速读
一句话结论 本文提出了 VecInfer,一种通过平滑与 Hadamard 双重变换抑制异常值并结合融合 CUDA 算子的向量量化方法,在仅用 2-bit 存储大模型 KV Cache 的情况下实现了几乎无损的精度,并大幅降低了长上下文推理的端到端延迟。
要解决什么问题 大语言模型在长上下文推理时,KV Cache(键值缓存)的显存占用会随序列长度线性增长,成为限制并发量和推理速度的核心瓶颈。为了压缩 KV Cache,现有的向量量化(Vector Quantization,将高维向量映射到有限的码本中心点以节省空间)方法虽然比标量量化更灵活,但在极低位宽(如 2-bit)下会遭遇严重的精度崩塌。其根本机制卡点在于:Key Cache 中存在大量数值极大的异常值(Outliers),这些异常值距离任何码本中心点都非常远,导致聚类学习出的码本严重依赖具体任务,无法均匀、全面地覆盖原始数据的正常分布,极大增加了量化难度。此外,在硬件执行层面,如果在注意力计算前先将低位宽数据反量化回浮点数,会引入巨大的全局显存读写开销,导致理论上的显存节省无法转化为实际的推理加速。
怎么做的 VecInfer 的核心思路是在对 Key Cache 进行向量量化之前,先通过数学变换将其分布“拍平”以消除异常值,同时在底层算子中将反量化与注意力计算融合,从而绕开分布不均和显存访存双重卡点。该方法主要由三个关键部件构成。第一是双重等价变换,负责在不改变最终注意力分数的前提下抑制异常值。首先使用平滑变换(Smooth Transformation),通过通道级缩放因子 $\boldsymbol{\lambda}$ 降低通道间的方差;接着使用 Hadamard 变换,让数据乘上一个正交的 Walsh-Hadamard 矩阵 $\mathbf{H}_D$。根据中心极限定理,这能将通道内的异常值重新分配到相邻元素中,使其近似高斯分布。为了保持计算等价性,Query 也需要进行相应的逆变换,更新后的注意力分数计算式为:
第二是异常值抑制的向量量化,负责对变换后的 Key 和原始 Value 进行压缩。利用离线预训练的 K-Means 码本,将高维向量映射为低位宽索引。由于 Key 在变换后依然比 Value 对量化更敏感,方法允许为 Key 分配比 Value 更高的位宽以保精度。第三是硬件高效的定制化 CUDA 算子,负责消除反量化带来的访存开销。该算子采用了细粒度分块计算,将量化后的 KV 块从全局显存加载到高速共享显存中;同时利用异步流水线执行,在计算当前块的注意力分数时,异步预取下一个块的量化数据,将反量化过程完全隐藏在计算耗时之中。
效果如何 实验在 H100 和 A100 硬件上进行,评测了 Llama-3.1-8B、Mistral-7B、Qwen2.5-14B 以及 DeepSeek-R1-Distill 等多种规模的模型。对比基线明确选取了代表标量量化路线的 KIVI、代表向量量化路线的 MILLION,以及未量化的 SDPA 和 FlashAttention2。在 LongBench 的 13 个长上下文任务中,VecInfer 在 2-bit 配置下平均精度仅下降 2.1%,而同为向量量化的 MILLION 则出现了严重掉点(VecInfer 领先其 14.5%)。在 GSM8K、MATH500 等复杂数学推理任务中,当压缩到 2-bit 时 KIVI 和 MILLION 均已失效(无法生成连贯回复),而 VecInfer 仍能保持极小的性能衰减。在速度方面,对于 196K 序列长度的 Llama-3.1-8B,2-bit 的 VecInfer 在大 Batch 自注意力计算上比 FP16 基线提速 2.7 倍,单 Batch 端到端延迟降低了 8.3 倍。作者也指出了该方法的代价与局限:为了提升精度而增大码本尺寸会显著增加共享显存开销并拖慢速度,存在精度与效率的权衡;此外,由于缺乏原生的 KV 压缩 API,将该方法无缝集成到 vLLM 或 SGLang 等现有主流推理框架中仍存在工程部署上的挑战。
主要贡献
当前基于Transformer的大型语言模型(LLM)在长上下文任务和复杂推理中取得了显著成功。为了实现高效推理,键值(KV)缓存是一种关键机制,它存储了先前的键和值状态,以避免在自回归解码期间进行冗余的注意力计算。然而,KV缓存的大小随着序列长度呈线性增长,这对高效的LLM推理和部署提出了重大挑战,特别是在内存消耗和计算开销方面。
为了减少KV缓存的使用,量化成为一种有前景的解决方案,主要包括标量量化(SQ)和向量量化(VQ)。SQ将浮点值映射为定点整数,但在位宽上的灵活性有限。相比之下,VQ通过将高维向量映射到有限的码本条目集合中,提供了更大的灵活性,其中反量化被简化为高效的查找操作。尽管节省了内存,但现有的低比特KV缓存方法仍然难以在精度和效率上达到预期的收益。
基于VQ的KV缓存的有效部署必须解决两个关键挑战:
1. 低位宽下的无损精度:VQ通常沿着硬件兼容的Token维度对KV缓存进行量化,这使其对异常值高度敏感。异常向量远离任何码本质心,且学习到的质心往往依赖于具体任务,进一步增加了量化难度。
2. 硬件对齐的推理加速:在注意力计算之前执行反量化会引入显著的开销,严重限制了实际的加速效果。因此,实现真正的速度提升需要对硬件友好的内核设计,以最小化内存访问并优化线程调度。
为解决上述问题,本文提出了VecInfer,这是一种用于激进的低比特KV缓存压缩的新型VQ方法。研究目标是在大幅压缩KV缓存的同时实现高效推理。其核心创新点如下:
* 识别出异常值是VQ中的主要挑战,并提出了VecInfer,该方法在量化之前对键缓存应用平滑(smooth)和Hadamard变换,以抑制异常值并降低量化难度。
* 为了实现高效的硬件加速,设计了一个融合反量化与计算的CUDA内核,具有细粒度分块计算和异步流水线执行的特点。
* 广泛的实验表明,VecInfer在各种量化位宽、下游任务和模型架构上均优于基线方法,同时显著降低了自注意力延迟和端到端延迟。在Llama-3.1-8B(196k序列长度)上,仅使用2-bit量化即可达到与全精度相当的性能,并在大批量自注意力计算中实现高达$2.7\times$的加速,在单批量端到端延迟上降低$8.3\times$。
背景知识与关键Observation
KV缓存与注意力机制:KV缓存通过在LLM推理(包括预填充和解码阶段)期间存储键值状态来消除冗余的注意力计算。在预填充期间,处理提示(prompt)以产生第一个输出Token,并用键值状态$\mathbf{K}, \mathbf{V} \in \mathbb{R}^{N \times D}$初始化KV缓存,其中$N$是提示Token的数量,$D$是注意力维度。在解码期间,LLM执行自回归生成,逐个Token产生输出序列。对于当前的输入状态$\mathbf{q}, \mathbf{k}, \mathbf{v} \in \mathbb{R}^{1 \times D}$,KV缓存更新为$\mathbf{K} \gets \mathrm{Concat}(\mathbf{K}, \mathbf{k})$和$\mathbf{V} \gets \mathrm{Concat}(\mathbf{V}, \mathbf{v})$。自注意力机制通过KV缓存捕获上下文中所有Token之间的连接,计算注意力输出为$\mathbf{s} = \mathbf{q}\mathbf{K}^{\top} / \sqrt{D}, \ \mathbf{p} = \mathrm{softmax}(\mathbf{s}), \ \mathbf{o} = \mathbf{p}\mathbf{V}$。FlashAttention【引用:Flashattention: Fast and memory-efficient exact attention with IO-awareness+2022+NeurIPS】是一种感知IO的算法,通过分块、重计算和在线softmax操作来减少注意力中的内存开销。
向量量化原理:VQ【引用:Product quantization for nearest neighbor search+2010+IEEE transactions on pattern analysis and machine intelligence】将连续的向量空间映射到有限的代表性码本向量集合中,将每个向量视为一个量化单元。VQ采用K-Means构建一个包含$2^b$个质心的码本$\mathcal{C}$,每个质心有$d$个维度。给定一个$d_h$维向量$\textbf{x} \in \mathbb{R}^{d_h}$,VQ将其划分为$d_h / d$个不相交的子向量:$\left[ {\bf x}_1, \ldots, {\bf x}_i, \ldots, {\bf x}_{d_h / d} \right]$。每个子向量$\mathbf{x}_i \in \mathbb{R}^d$随后被分配到$\mathcal{C}$中距离其最近的质心索引,相应的质心索引被编码为$b$位表示:$j^* = \underset{j \in \{1, \dots, 2^b\}}{\arg \operatorname* {min}} \| \mathbf{x}_i - \mathcal{C}_j \|^2, \operatorname{VQ}(\mathbf{x}_i, \mathcal{C}) = j^*$。这些子向量索引随后被组合以形成原始向量$\mathbf{x}$的压缩表示。VQ显著减少了内存使用。与使用$d_h \times 2$字节(假设16位浮点精度)存储完整的$d_h$维向量不同,VQ仅需要$2^b \times d \times 2$字节用于码本,加上$(d_h / d) \times (b / 8)$字节用于索引。然而,在模型推理期间,由于量化数据仅包含码本索引,直接的算术操作是不可能的。因此,在每次计算之前必须执行反量化,即使用存储的索引从码本中检索相应的质心。
重新思考量化难度:尽管先前的研究【引用:Million: Mastering long-context llm inference via outlierimmunized kv product quantization+2025+arXiv】【引用:KV cache is 1 bit per channel: Efficient large language model inference with coupled quantization+2024+NeurIPS】表明VQ相比SQ缓解了异常值问题,但这种优势在实践中是有限的。异常向量仍然远离任何码本质心,且这些学习到的质心表现出高度的任务依赖性。因此,码本条目未被充分利用,这增加了量化难度。
双重变换降低量化难度:受权重-激活变换中计算不变性【引用:Smoothquant: Accurate and efficient post-training quantization for large language models+2023+ICML】【引用:Quarot: Outlier-free 4-bit inference in rotated LLMs+2024+NeurIPS】的启发,本文研究了平滑和Hadamard变换如何降低键缓存的量化难度,同时确保查询和键之间的计算不变性。为了分析变换的效果,采用奇异值分解(SVD),将矩阵分解为$\mathbf{A} = \mathbf{U} \pmb{\Sigma} \mathbf{V}^{\top}$,其中正交矩阵$\mathbf{U}$和$\mathbf{V}$是旋转,对角矩阵$\pmb{\Sigma}$是拉伸【引用:Infinigen: efficient generative inference of large language models with dynamic kv cache management+2024+OSDI】。图3(a)展示了$\mathbf{V}^{\top}$的列向量如何被旋转和拉伸以形成A的列向量$a_1$和$a_2$,分别代表最大值和最小值。图3(b)表明,结合平滑和Hadamard变换减少了$\tilde{a}_1$和$\tilde{a}_2$之间的幅度差距,从而产生了无异常值的分布。这种双重变换减少了通道间的变化并抑制了异常值,产生了更均匀的分布。这种均匀性有助于实现与任务无关的码本表示,并确保全面覆盖原始数据分布。值得注意的是,单独应用这些变换会导致次优的均匀性。
方法细节
异常值抑制的向量量化:基于上述分析,提出了VecInfer,这是一种基于VQ的KV缓存压缩方法,在量化之前应用平滑和Hadamard变换来抑制键缓存中的异常值并降低量化难度。首先通过使用因子$\pmb{\lambda} \in \mathbb{R}^D$进行通道级缩放来平滑键,并将逆缩放应用于查询以在查询-键乘法中保持计算不变性:$\mathbf{q} \gets \mathbf{q} \mathrm{diag}(\boldsymbol{\lambda}), \mathbf{K} \gets \mathbf{K} \mathrm{diag}(\boldsymbol{\lambda})^{-1}$。这里的缩放因子是从校准样本中离线预计算的,定义为:$\lambda_i = \sqrt{\operatorname*{max}(|\mathbf{K}_i|)}, i = 1, 2, \ldots, D$,其中$\mathbf{K}_i$是$\mathbf{K}$的第$i$个通道。由于平滑变换减少了通道间方差而没有解决通道内方差,显著的百分位数波动依然存在。为了进一步抑制异常值,应用一个满足$\mathbf{H}_D \mathbf{H}_D^{\top} = \mathbf{I}$的正交Hadamard矩阵$\mathbf{H}_D$。对于$D = 2^k$,Walsh-Hadamard矩阵递归定义为:$\mathbf{H}_{2^k} = \frac{1}{\sqrt{2}} \left[ \begin{array}{cc} \mathbf{H}_{2^{k-1}} & \mathbf{H}_{2^{k-1}} \\ \mathbf{H}_{2^{k-1}} & -\mathbf{H}_{2^{k-1}} \end{array} \right], \mathbf{H}_1 = \left[ 1 \right]$。通过将查询和键都乘以$\mathbf{H}_D$,确保了它们之间的计算不变性:$\mathbf{q} \gets \mathbf{q} \mathbf{H}_D, \mathbf{K} \gets \mathbf{K} \mathbf{H}_D$。
Hadamard引理与注意力分数重写:根据引理1,对于键状态$\mathbf{K} \in \mathbb{R}^{N \times D}$,其符号满足$\mathrm{sign}(K_{i,j}) \stackrel{i.i.d.}{\sim} \mathrm{Uniform}\{-1, +1\}$,以及构造的Hadamard矩阵$\mathbf{H} \in \mathbb{R}^{D \times D}$,根据中心极限定理,变换后的矩阵$\tilde{\mathbf{K}} = \mathbf{K}\mathbf{H}$表现出近似的高斯分布,从而重新分配了K的异常值。引理1表明Hadamard旋转有效地将异常值重新分配到相邻元素中,产生更均匀的分布,进一步降低了量化的难度。总之,在经过平滑和Hadamard变换后,注意力分数可以重写为:$\mathbf{s} = (\underbrace{\mathbf{q} \mathrm{diag}(\pmb{\lambda}) \mathbf{H}_D}_{\tilde{\mathbf{q}}}) \cdot \underbrace{(\mathbf{K} \mathrm{diag}(\pmb{\lambda})^{-1} \mathbf{H}_D}_{\tilde{\mathbf{K}}})^{\top}$。
注意力机制中的向量量化KV缓存:为了将VQ无缝集成到注意力中,对抑制了异常值的键进行预采样,并通过K-Means预训练码本。在预填充期间,对键应用双重变换,随后对变换后的键$\tilde{\bf K}$和原始值$\mathbf{V}$进行VQ:$\tilde{\mathbf{K}}_q = \mathrm{VQ}(\tilde{\mathbf{K}}, \mathcal{C}_k), \mathbf{V}_q = \mathrm{VQ}(\mathbf{V}, \mathcal{C}_v)$,其中$\mathrm{VQ}(\cdot)$表示向量量化函数,$\mathcal{C}_k, \mathcal{C}_v$分别是键和值的码本。在解码期间,每个新到达的键集合$\mathbf{k}$经历在线双重变换。变换后的键$\tilde{\mathbf{k}}$及其对应的值$\mathbf{v}$然后使用预训练的码本进行量化。量化结果随后与先前量化的对进行拼接:$\tilde{\mathbf{K}}_q \gets \mathrm{Concat}(\tilde{\mathbf{K}}_q, \mathrm{VQ}(\tilde{\mathbf{k}}, \mathcal{C}_k)), \mathbf{V}_q \gets \mathrm{Concat}(\mathbf{V}_q, \mathrm{VQ}(\mathbf{v}, \mathcal{C}_v))$。为了输出的一致性,对查询q应用逆变换。用$\mathrm{VQ}^{-1}(\cdot)$表示反量化算子。注意力计算则由下式给出:$\mathbf{s} = \tilde{\mathbf{q}} (\mathrm{VQ}^{-1}(\tilde{\mathbf{K}}_q, \mathcal{C}_k))^{\top} / \sqrt{D}, \mathbf{p} = \mathrm{softmax}(\mathbf{s}), \mathbf{o} = \mathbf{p} (\mathrm{VQ}^{-1}(\mathbf{V}_q, \mathcal{C}_v))$。值得注意的是,即使在变换之后,键表现出的量化敏感性仍高于值。为了保持精度,可以为键分配更高的位宽。
硬件高效的定制内核:在自回归解码期间,每个新生成的Token都需要对低比特KV缓存进行反量化,这引入了大量的开销和复杂性。为了应对这一挑战,提出了一个硬件对齐的内核,该内核将反量化与注意力计算融合在一起。通过最小化全局内存访问,该内核的运行速度快于未融合的基线。内核架构结合了两个关键优化。
细粒度分块计算:该实现将注意力计算划分为多个块(tiles),并将它们从全局内存加载到共享内存中,有效地缓解了内存带宽瓶颈。具体而言,采用(batch_size, num_heads, num_splits)的三维网格配置,其中每个线程块包含128个线程,这些线程共同处理量化的键值对的单个块,以计算相应的局部注意力输出。
异步流水线执行:目标是将量化的键值对从全局内存传输到共享内存以实现高效访问。为了充分利用CUDA核心,利用memcpy_async API将内存传输与计算重叠。在处理第$i$个块时,在计算$\mathbf{s}^{(i)}$的同时异步加载值代码$\mathbf{V}^{(i)}_q$。随后,在计算$\mathbf{o}^{(i)}$期间,异步预取下一个块的键代码$\tilde{\mathbf{K}}^{(i+1)}_q$。此外,优化了键和值代码的共享内存布局,以最小化bank冲突并提高吞吐量。优化的内核在H100上针对大批量自注意力实现了相较于原生全注意力$2.6 \sim 3.3\times$的加速。
实验环境
- 模型与任务:在多种LLM上进行实验,包括Llama-3.1-8B-Instruct, Mistral-7B-Instruct-v0.3, Qwen2.5-14B-Instruct, DeepSeek-R1-Distill-Llama-8B, DeepSeek-R1-Distill-Qwen-14B, Qwen3-8B。为评估长上下文性能,在LongBench【引用:LongBench: A bilingual, multitask benchmark for long context understanding+2024+ACL】的13个任务上进行评估,涵盖单/多文档问答、摘要、少样本学习、代码补全和合成任务。为评估推理能力,使用GSM8K、MATH500、AIME24和AMC2023数据集。
- 参数设置:温度(temperature)设为0.6,top-$p$设为0.95。评估指标为Pass $@ 1$准确率。GSM8K、MATH500和AMC2023的最大输出长度设为16,384个Token,AIME24设为32,768个Token。
- 基线方法:KIVI【引用:Kivi : Plug-and-play 2bit kv cache quantization with streaming asymmetric quantization+2023】(标量量化)和MILLION【引用:Million: Mastering long-context llm inference via outlierimmunized kv product quantization+2025+arXiv】(向量量化)。所有方法的残差长度设为128。
- 实现细节:平滑因子使用Pile数据集中的256个随机样本(每个样本512个Token)离线校准。码本在Qasper数据集上通过K-means聚类预训练,最大迭代次数设为30。
实验结果
- 长上下文任务精度:在LongBench的13个数据集上,VecInfer在1.25到4比特的平均精度范围内始终优于基线方法(如表2所示)。当使用2-bit精度进行KV缓存存储时,VecInfer平均精度仅下降$2.1\%$,而与另一种基于VQ的方法MILLION相比,平均性能提升了$14.5\%$。
- 复杂推理任务精度:在数学推理任务上(如表3所示),当精度降至2-bit时,KIVI和MILLION均经历了显著的性能下降,无法生成连贯的响应。相比之下,VecInfer在复杂推理任务上表现出最小的性能下降。模型类型和任务难度显著影响性能下降程度,例如DeepSeek-R1-Distill-Qwen-14B比DeepSeek-R1-Distill-Llama-8B表现出更好的量化容忍度。
- 端到端延迟:在64k序列长度下,KIVI由于缺乏融合内核支持而遇到OOM(内存不足)错误。如图7所示,在输入长度$l_{input} = 192\mathrm{k}$和输出长度$l_{output} = 129$时,VecInfer在1-bit、2-bit和4-bit配置下分别实现了$9.0\times, 8.3\times$和$6.6\times$的解码加速。加速优势随着序列长度的增加而增大。
- 延迟细分:图8显示了不同输入长度下注意力块的延迟细分。相对于SDPA,VecInfer通过消除昂贵的拼接和重复操作,减少了全局内存读/写开销。在196k序列长度和2-bit配置下,VecInfer在自注意力方面实现了$2.0\times$的加速。平滑和Hadamard变换的额外成本可以忽略不计。
- 不同变换的消融实验:表4报告了不同变换在LongBench上的对比性能。以仅使用VQ为基线,平滑和Hadamard变换独立地将平均性能分别提高了$4.9\%$和$14.1\%$。它们的组合带来了比单一变换大得多的收益。
- 码本大小的消融实验:表5表明,对于给定的位宽,增加码本大小始终能提高精度,但这是以增加共享内存开销为代价的。为了平衡精度与效率,对于2-bit量化采用$2^8 \times 4 \times 2$字节的码本大小,对于1.5-bit量化采用$2^{12} \times 8 \times 2$字节的码本大小。
结论
本文提出了VecInfer,一种用于激进KV缓存压缩同时实现高效推理的新型VQ方法。VecInfer采用平滑和Hadamard变换来抑制键缓存中的异常值并提高码本利用率,从而降低量化难度。实验表明,VecInfer在长上下文和数学推理任务上优于基线。通过将计算和反量化融合到单个CUDA内核中,VecInfer显著降低了注意力和端到端延迟,促进了LLM在资源受限GPU上的部署。未来工作可以探索将向量量化与稀疏注意力模式结合用于混合精度KV缓存压缩,以及解决将VecInfer无缝集成到现有服务框架(如vLLM和SGLang)中的实际挑战。
附录
相关工作 - FlashAttention:查询、键和值矩阵$\mathbf{Q}, \mathbf{K}$, 和 $\mathbf{V}$ 的维度定义为$N \times D$,其中$N$表示序列长度,$D$表示注意力维度。自注意力计算公式为:$\mathbf{S} = \mathbf{Q} \mathbf{K}^{\top} / \sqrt{D}, ~ \mathbf{P} = \mathrm{softmax}(\mathbf{S}), ~ \mathbf{O} = \mathbf{P} \mathbf{V}$。标准注意力实现涉及计算大型中间矩阵(即$N \times N$的矩阵$(\mathbf{S}, \mathbf{P})$),这些矩阵需要存储在全局内存中。由于全局内存访问的带宽有限和延迟高,读写$(\mathbf{S}, \mathbf{P})$会产生显著的内存I/O开销。FlashAttention【引用:Flashattention: Fast and memory-efficient exact attention with IO-awareness+2022+NeurIPS】利用在线softmax对输入矩阵进行分块处理,在快速的共享内存中执行块级计算。FlashAttention2【引用:Flashattention-2: Faster attention with better parallelism and work partitioning+2024+ICLR】通过实施优化的并行化策略提高了GPU资源利用率,将$\mathbf{Q}$置于外循环,将$\mathbf{K}$和$\mathbf{V}$置于内循环。对于每个块的计算公式为:$\mathbf{S}_{ij} = \mathbf{Q}_i \mathbf{K}_j^{\top} / \sqrt{D}, m_{ij} = \operatorname*{max}\{m_{i,j-1}, \operatorname{rowmax}(\mathbf{S}_{ij})\}, \widetilde{\mathbf{P}}_{ij} = \exp(\mathbf{S}_{ij} - m_{ij}), \ell_{ij} = e^{m_{i,j-1} - m_{ij}} \ell_{i,j-1} + \mathrm{rowsum}(\widetilde{\mathbf{P}}_{ij}), \mathbf{O}_{ij} = \mathrm{diag}(e^{m_{i,j-1} - m_{ij}}) \mathbf{O}_{i,j-1} + \widetilde{\mathbf{P}}_{ij} \mathbf{V}_j$。最终输出$\mathbf{O}_i$计算为:$\mathbf{O}_i = \mathrm{diag}(\ell_{i,T_{kv}})^{-1} \mathbf{O}_{i,T_{kv}}$。FlashAttention3【引用:Flashattention-3: Fast and accurate attention with asynchrony and low-precision+2024+arXiv】利用Hopper GPU的架构特性,采用生产者-消费者warp专门化,将块级GEMM与在线softmax操作交错,并利用FP8硬件支持进行块量化。
相关工作 - 注意力变体:LLM推理分为预填充阶段和解码阶段。对于计算受限的预填充阶段,现有方法侧重于最大化并行处理能力和计算吞吐量,如FlashAttention、SageAttention、MInference等。对于内存受限的解码阶段,现有方法侧重于加速KV缓存的I/O操作,如动态KV缓存修剪、检索最重要Token的稀疏注意力、以及将KV缓存压缩为低精度表示的量化方法。BitDecoding【引用:Bitdecoding: Unlocking tensor cores for long-context llms with low-bit kv cache+2025+arXiv】通过协同利用CUDA核心和Tensor核心,实现了高效的低比特KV缓存解码。
内核实现细节 - 融合内核:为了减少读写中间矩阵的开销,采用了融合的反量化-计算内核,提高了内存和延迟效率。具体实现利用了细粒度分块计算和异步流水线执行。算法1描述了VecInfer的实现过程:首先对查询和键进行双重变换,然后进行向量量化。在计算注意力输出时,将量化的$\tilde{\mathbf{K}}_q$和$\mathbf{V}_q$划分为$T = \lceil \frac{N}{B} \rceil$个块。在循环中,使用在线softmax方案增量地重新缩放每个块的部分结果,以确保最终输出正确。为了充分利用CUDA核心,利用memcpy_async API将内存传输与计算重叠。在计算$\mathbf{s}^{(i)}$的同时异步加载$\mathbf{V}_q^{(i)}$,并在计算$\mathbf{o}^{(i)}$期间预取下一个迭代的$\tilde{\mathbf{K}}_q^{(i+1)}$。
# Algorithm 1 Implementation of VecInfer
1: Input: q, K, V, codebooks C_k, C_v, block size B.
2: Preprocessing: Apply smooth and Hadamard transformation to q and K.
3: Quantization: VQ transformed K and original V.
4: Compute lookup table (lut) for queries and C_k.
5: Divide quantized K and V into T blocks.
6: Initialize output o, l, m in Shared Memory (SMEM).
7-8: Load C_v and first block of K into SMEM.
9: for i = 1 to T do
10: Prefetch V block i from Global Memory (GMEM) to SMEM (async).
11: Compute attention scores s^(i) using lookup table.
12-13: Compute online softmax updates (m_new, p^(i), l_new).
14: Wait for V block i to load.
15: Prefetch K block i+1 from GMEM to SMEM (async).
16: Compute partial output o using inverse VQ on V.
17: Wait for K block i+1 to load.
18: Update l and m.
19: end for
20-23: Finalize output o and write to GMEM.
内核延迟比较:图9比较了在A100 (40GB)和H100 (80GB) GPU上,不同batch size和序列长度下VecInfer内核与基线方法的速度。
不同变换的细节:为了分析不同变换的效果,使用SVD将变换分解为旋转(U, V)和拉伸$(\pmb{\Sigma})$分量。图11(a)展示了$\mathbf{V}^{\top}$的列向量如何被旋转和拉伸。图11(b)和(c)证明了平滑和Hadamard变换分别通过拉伸和旋转减少了最大最小值的幅度差异。图11(d)表明结合这两种变换能达到最佳平衡。图10进一步证明,单独应用这些变换会产生次优的均匀性,而它们的组合能实现最均匀的分布。
键/值缓存的量化敏感性:现有研究表明,异常值的存在放大了键缓存中的量化误差。然而,表6的实验发现,即使通过变换抑制了异常值,变换后的键缓存仍然表现出比值缓存更高的量化敏感性。因此,策略是实施混合精度,为键缓存和值缓存分配不同的存储精度。
任务无关的码本与额外实验:表7显示,当使用在不同数据集上预训练的码本时,性能几乎保持一致,这表明学习到的码本具有良好的泛化能力,实际上与任务无关。表8报告了在4-bit量化下LongBench的额外评估结果,证明所有测试模型在VecInfer下保持无损性能,且VecInfer始终优于其他方法。
Hadamard引理证明:对于引理1的证明,考虑矩阵的第$(i,j)$个元素:$\tilde{K}_{i,j} = \sum_{l=1}^D K_{i,l} H_{l,j} = \sum_{l=1}^D |K_{i,l}| \cdot \epsilon_{i,l} \cdot H_{l,j}$,其中$\epsilon_{i,l} = \mathrm{sign}(K_{i,l}) \stackrel{\mathrm{i.i.d.}}{\sim} \mathrm{Uniform}\{-1, +1\}$ 且 $H_{l,j} \in \left\{ -\frac{1}{\sqrt{D}}, +\frac{1}{\sqrt{D}} \right\}$。期望为$\mathbb{E}[\tilde{K}_{i,j}] = 0$。由于$\mathbb{E}[\epsilon_{i,l} \cdot H_{l,j}] = 0$,方差为$\operatorname{Var}(\tilde{K}_{i,j}) = \sum_{l=1}^D |K_{i,l}|^2 \cdot \frac{1}{D}$。根据Lindeberg-Feller中心极限定理,当$D \to \infty$时,$\tilde{K}_{i,j}$依分布收敛于高斯随机变量:$\tilde{K}_{i,j} \stackrel{d}{\to} \mathcal{N}(0, \frac{1}{D} \sum_{l=1}^D K_{i,l}^2)$。
💬 评论讨论
欢迎在这里分享您的想法和见解!