本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,从而导致模型变得越来越大,因此,我们需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。 模型压缩主要分为如下几类:
- 剪枝(Pruning)
- 知识蒸馏(Knowledge Distillation)
- 量化(Quantization)
本系列将针对一些常见大模型量化方案(GPTQ、LLM.int8()、SmoothQuant、AWQ等)进行讲述。
- 大模型量化概述
- 量化感知训练:
- 训练后量化:
- 大模型量化技术原理:GPTQ、LLM.int8()
- 大模型量化技术原理:SmoothQuant
- 大模型量化技术原理:AWQ、AutoAWQ
- 大模型量化技术原理:SpQR
- 大模型量化技术原理:ZeroQuant系列
- 大模型量化技术原理:FP8
- 大模型量化技术原理:FP6
- 大模型量化技术原理:FP4
- 大模型量化技术原理:KIVI、IntactKV、KVQuant
- 大模型量化技术原理:QServe(QoQ)、GEAR、QuaRot
- 大模型量化技术原理:QuIP、QuIP#
- 大模型量化技术原理:总结
之前介绍的一些关于模型权重和激活的量化方法,如:AWQ、SmoothQuant等,本文介绍几篇关于KV Cache量化的方法KIVI、IntactKV、KVQuant。
文章较长,建议先点赞收藏,后续再慢慢观看。另外,我撰写的大模型相关的博客及配套代码均整理放置在Github:llm-action,有需要的朋友自取。
KIVI
背景
在LLM批量推理场景中,由于KV缓存的存在,它在生成过程中保存注意力Key和Value以防止重新计算,使其成为新的内存和速度瓶颈。随着批量大小和上下文长度的增加,这个瓶颈变得更加明显。例如,在 PaLM-540B 中,批量大小为 512,上下文长度为 2048,仅 KV 缓存就可以占用 3TB,这是模型参数大小的 3 倍。此外,GPU SRAM 必须为每个生成的Token 从 GPU 设备内存加载整个 KV 缓存,在此期间计算核心处于空闲状态。因此,减少 KV 缓存大小同时保持LLMs的准确性很重要。
针对这个问题的现有工作可以大致分为三类。
- 一些工作建议减少 KV 缓存中 Attention Head 的数量,如:GQA和MQA。然而,这些方法需要从头开始训练模型或对现有模型进行微调。
- 另一条研究路线通过丢弃不重要的Token来减少 KV 缓存大小。
- 其他一些工作试图从系统角度解决这个问题,例如:卸载 KV 缓存或将虚拟内存和分页技术扩展到注意力机制中,如:PagedAttention。
要减小KV缓存的大小,最简单有效的方法是减少KV缓存占用的总字节数,即量化。但目前业界缺乏深入研究KV缓存的元素分布来了解KV缓存量化的难度和局限性。 本文通过对主流 LLM 的 KV 缓存中的元素分布进行了全面的研究,发现如下几点:
- 当对 Key 和 Value 缓存使用常用的逐Token量化时,INT4 数据类型可以保持准确性。然而,将其量化为 INT2 时,会导致精度显著下降。
- 当按通道量化 Value 缓存时,无论如何量化Key缓存,精度都会显著恶化。
- 当使用较低的数值精度(例如:INT2)时,最准确的方法是逐通道量化 Key 缓存和逐 Token 量化 Value 缓存。
因此,KIVI开发了一种 2 位非对称 KV 缓存量化方法。该方法对 Key 缓存按通道进行量化,即沿通道维度对元素进行分组并将它们一起量化。同时,对 Value 缓存按Token进行量化。这使得 Llama、Falcon 和 Mistral 模型与FP16相比保持几乎相同的质量,同时减少了 2.6 倍的峰值内存(包括模型权重),并且内存使用量的减少使得批量大小增加了 4 倍,实际的推理吞吐量提高了 2.35 倍 ∼ 3.47 倍。
为什么键和值缓存应该沿着不同的维度进行量化?
一是由于观察到将逐通道的Key缓存和逐Token的Value缓存量化为 2 位导致的精度下降非常小。
二是通过可视化不同层的原始 KV 缓存分布观察到,在 Key 缓存中,一些固定通道表现出非常大的幅度,每个通道内异常值的持续存在意味着逐通道量化可以将量化误差限制在每个通道内,而不影响其他正常通道。而在 Value 缓存中,没有明显的异常值。同时,由于注意力分数高度稀疏,因此,输出只是一些重要 Token 的 Value 缓存的组合。每个 Token 的量化可以将误差限制在每个单独的Token上。因此,量化其他 Token 不会影响重要Token的准确性。因此,按Token量化会导致相对误差更小。
工作原理
由于LLM新生成的Token的Key和Value缓存是按顺序到达的。从实现的角度来看,逐Token的Value缓存量化可以与流式场景很好地结合在一起,新量化的张量按Token维度直接附加到现有的量化的Value缓存中。 然而,对于逐通道 key 缓存量化,量化过程跨越不同的Token,因此,不能直接在流式场景中实现。为了解决这个问题,KIVI 将每 G 个Token 的 Key 缓存进行分组并分别进行量化。 具体解决方案如下:
由于 中 token 数量可以是任意的,因此,将 中的 Token 分成两部分,即分组部分 和余留部分 。其中, 表示当前 Key 缓存 中 token 的数量, 表示剩余 Token 的数量, 而 可以被 G 整除。 可以均匀地分为 组,只存储分组量化的 ,而 则保持全精度。
在解码过程中,每个新到达的Key缓存 都会添加到 中,一旦 到达 R 个Token(这是一个超参数:余留长度),将其量化并将其与之前量化的 连接起来。然后将 重置为空张量。注意:R 应该可以被 G 整除,以便于分组量化。
对于Value缓存,与Key缓存类似,也将其分为两部分(即和),并保持最新的Value缓存为全精度。具体来说,维护一个队列,每个新到达的Value缓存都被推入队列中。一旦队列达到预定义的余留长度 R,就会弹出最久的Value缓存。然后弹出的Value缓存按Token进行量化,并沿着Token维度与先前量化的Value缓存连接起来。
在预填充阶段,尽管只有量化的 KV 缓存保留在内存中,但全精度(FP16)的Key和Value张量会传递到下一层。
整个算法的伪代码如下所示。
实验细节
通过在不同量化配置之间进行比较(常规的4位或2位 KV Cache量化与采用KIVI进行4位或2位 KV Cache量化),KIVI与其他配置相比获得了最佳结果。对于像GSM8K这样难度较大的生成任务,采用2位 KV Cache量化(按通道量化K,按Token量化V)结果比全精度明显更差,而采用KIVI-2的精度仅下降2个百分点。
2位 KV Cache量化(按通道量化K,按Token量化V)和KIVI之间的差异在于KIVI为局部相关Token保留了全精度KV缓存滑动窗口。这个滑动窗口对于保持像数学推理这样难度较大的生成任务的精度至关重要。
使用LM-Eval框架(用于正常上下文长度评估)在CoQA、TruthfulQA和GSM8K任务上对KIVI进行基准测试。对于Llama和Mistral模型,尽管KV缓存被存储在2位中,KIVI的精度下降最多只有2%。例如,在Llama2-7B模型中,从16位到2位只会轻微降低精度,其他Llama系列模型也观察到类似的趋势。对于Falcon-7B,由于它采用GQA并且只有一个头用于KV缓存,与基于Llama的模型相比,它已经高度压缩,需要4比特的KIVI来保持精度,而2比特的KIVI在这种情况下可能会有较大的精度下降。
此外,KIVI在LongBench数据集(用于长上下文评估)上的表现也表明KIVI是一种有效的KV缓存压缩方法,在各种难度较大的长上下文生成任务中对精度的影响很小。
作者在GSM8K(这是最难的生成任务之一)上对KIVI进行消融实验,以展示超参数组大小G和余留长度R对模型性能的影响。对于组大小而言,组大小为32和64时结果相似,而当组大小达到128时,性能显著下降。对于余留长度而言,将组大小固定在32的情况下,余留长度与模型精度之间没有一致的模式。即余留长度为128可以获得良好的结果,与32和96的结果相似,而残余长度为64时性能最差。
此外,在单个NVIDIA A100 GPU (80GB)上,对于Llama2-7B模型,与FP16基线相比,KIVI在类似的最大内存使用量的情况下,可以将最大批量大小提升高达4倍,并提供2.35× ∼ 3.47×更大的吞吐量。随着上下文长度和输出长度的增加,这个吞吐量数字可以变得更大。如果进一步将KV缓存量化过程与先前的操作融合,这个加速可以大大增加。
IntactKV
背景
LLM 在自然语言处理的各项任务上都取得了出色的表现,但其庞大的参数量也给实际部署带来了新的挑战。而模型量化是一种常用的模型压缩方法,可以通过将模型权重和激活值压缩到低比特来有效降低模型推理时的算力和内存开销,然而量化往往伴随着模型的精度损失。对此,作者提出了一种新的量化方法IntactKV,通过预先缓存关键词元的无损KV Cache来保证量化模型中关键词元表征无损,通过理论推导证明这能有效降低模型的量化误差上界。此外,缓存的无损KV还可以作为模型的额外参数做进一步校准,进一步弥补量化误差。IntactKV实现简单并且与GPTQ、AWQ、QuaRot等当前主流的LLM量化方法正交,实验表明,IntactKV可以作为插件有效提升现有量化模型精度,同时不会带来额外的推理开销,在仅权重量化和权重激活量化上均取得了当前SOTA精度。
关键词元(Pivot Tokens)
现有研究发现,LLM激活值在特定通道上存在离群值,这些离群值往往出现在所有词元的激活值上,使得LLM的激活值难以量化。而作者发现LLM中还存在另一种特殊的离群值,如下图所示,它只存在于LLM输入的首词元[BOS]以及开头的一些特定词元上(如“,”、“.”等标点符号),并且这类离群值比特定通道上的离群值还要大得多。
更为重要的是,这类特定词元上的离群值会导致LLM将大量的自注意力得分分配到这些词元上,形成Attention Sink,因此作者将这些特定词元称为关键词元(pivot tokens)。由于汇聚了大量自注意力得分,关键词元的表征对LLM来说至关重要。类似的现象也在同期工作Massive Activations in Large Language Models中被发现并得到了更为细致的研究。针对这一现象,还没有其他的研究对量化模型的影响做深入探索。
技术原理
作者发现模型量化会不可避免地导致关键词元表征受损,进而严重影响模型精度,因此如果能保证关键词元的表征,也就是其KV cache无损,就能有效降低量化误差。为此,作者提出使用IntactKV—先使用全精度模型生成关键词元的无损 KV 并将其缓存下来,量化模型在推理时就能直接使用无损的关键词元表征,从而有效提升量化模型精度。如下图所示,IntactKV包含了从首词元[BOS]开始的若干词元,随着IntactKV包含词元数的增加,量化误差也不断降低,尤其是当IntactKV包含关键词元时,量化误差会得到明显下降,这也进一步验证了关键词元的重要性。
然而,模型在每次推理时的输入序列各不相同,这意味着并不能使用任意长度的IntactKV,否则在每次量化模型推理前都必须调用全精度模型来生成对应输入的IntactKV,这会带来额外的推理开销。对此,作者利用了LLM推理时的公共前缀,如果IntactKV只包含公共前缀,那么全精度模型在生成IntactKV后就可以被释放,不会给之后量化模型的推理带来任何额外开销。
- 对于预训练LLM,输入序列前一般都会加上[BOS]词元作为公共前缀,因此可以使用只包含[BOS]词元的长度为1的IntactKV,称为IntactKV_[B]。如图2所示,由于首词元总为关键词元,因此使用IntactKV_[B]就可以明显地降低量化误差。
- 而对于SFT模型,输入序列前一般会包含一段系统提示词作为公共前缀,因此可以使用长度为系统提示词的IntactKV,称为IntactKV_[P]。由于使用了更长的IntactKV,IntactKV_[P]能覆盖更多关键词元,进一步降低量化误差。作者在实验中发现,对于Vicuna模型,长度为34的系统提示词就足以覆盖全部关键词元。
此外,缓存的IntactKV还可以作为模型的额外参数做校准来进一步弥补量化误差。具体来说,可以在大小为128的校准集上做了轻量化训练,可学习参数仅为缓存下来的IntactKV,损失函数采用量化模型和全精度模型输出的 MSE loss:
其中, 表示INTACTKV的集合, 是第 层Transformer层的映射函数, 是LLM中Transformer层的数量。 是输入序列,而 、 分别是全精度权重和量化权重。
使用IntactKV进行推理的伪代码如下所示:
实验细节
- 仅权重量化
首先在PPL任务上进行了实验。如表1所示,IntactKV能很好地与GPTQ、OmniQuant、AWQ等主流量化方法结合,无需任何训练或额外推理开销即可在LLaMA系列的不同模型上有效提升量化模型精度,其中AWQ+IntactKV在各个模型上都达到了最优效果。
基于Vicuna模型,在MMLU和QA任务上做了进一步实验。如表2所示,实验结论与PPL任务基本一致。
对量化模型的生成质量也进行了评估,通过GPT-4对模型生成回答进行打分来衡量量化模型的生成能力。如表5所示,IntactKV_[P]已经能明显提升量化模型的回复得分,对IntactKV的轻量化校准,则进一步提升了模型的回复质量。
- KV Cache量化
为了将IntactKV用于KV cache量化,作者采用混合精度量化策略,将IntactKV(无损KV)保存为全精度,其余KV cache量化到低比特。
对于仅权重量化方案,如AWQ,如果进行 KV cache 量化,由于模型仍然需要先将量化的KV cache反量化为全精度才能进行自注意力计算,因此上述混合精度方案在推理时只需要将IntactKV(无损KV)和反量化后的KV cache重新拼接到一起即可,并不会带来额外的推理开销。如图4所示,IntactKV在不同的量化比特设置下均可以有效提升AWQ(仅权重)量化模型精度,尤其是在低比特时提升更加明显。目前,IntactKV已经被集成到了SOTA KV Cache量化方法KVQuant中。
- 权重和激活值量化
对于权重激活值量化,KV cache需要全部量化到低比特才能有效利用低比特矩阵乘进行运算加速。这与保持关键词元的KV缓存无损的理念相矛盾。但作者发现关键词元的KV cache表征明显比其余KV cache表征更加平坦,就算直接将IntactKV量化到低比特也只会带来极少的精度损失,因此对于权重和激活值量化,作者选择将IntactKV进一步压缩到低比特(采用RTN量化)以免引入额外的推理开销。如表6所示,IntactKV能有效提升当前SOTA量化方法精度,将 OmniQuant 的 PPL 平均提高了 1.07,将 QuaRot 的 PPL 平均提高了 0.31,这进一步缩小了W4A4量化模型与原始模型间的精度损失。
KVQuant
背景
LLM 在处理需要长上下文窗口的应用时越来越受欢迎,例如:长文档摘要、长文档问答、多轮对话应用和代码分析等。为了支持这些应用,需要增加 LLMs 的上下文长度。但随着上下文长度的增加,LLMs 在推理过程中的内存消耗也显著增加,尤其是 KV缓存。对于短序列长度来说,内存消耗的主要贡献者是权重矩阵,因此最优策略是最小化模型大小,以减少内存消耗以及带宽需求。然而,对于长序列长度而言,主要的瓶颈是推理过程中KV缓存激活。KV缓存的大小可能成为内存占用的主要贡献者,即使是对于32K上下文限制。当考虑到批处理推理时,这一挑战将进一步加剧。因此,开发压缩KV缓存的方法对于实现高效的长序列长度推理至关重要。
由于KV缓存激活中异常值的存在以及现有均匀和非均匀量化方法的次优比特(bit)分配,导致现有的方法准确率显著下降。KVQuant的作者对最新的LLMs中的KV缓存激活进行了广泛的分析,发现了一些可以利用的点,以实现超低精度量化,同时最小化准确性损失。
技术原理
KVQuant 通过结合几种新颖的方法来促进低精度 KV 缓存量化。具体的优化技术如下:
一、逐通道(Per-Channel)对 Key 进行量化,通过调整 Key 激活的量化维度以更好地匹配分布;
通过分析KV缓存的分布情况发现Key矩阵在特定通道上存在明显的异常值,这些通道的平均幅值比其他通道大;这与之前(LLM.int8()、SmoothQuant)的论文中关于LLM激活中的异常通道的观察结果一致。而Value矩阵既存在异常通道也存在异常token(但这些异常值没有Key矩阵中的通道的异常值那么极端)。
为了更好地匹配分布,研究了按通道的KV缓存量化,即缩放因子和零点由同一通道中的元素共享。通过沿通道维度共享缩放因子和零点,将具有相似幅度的值组合在一起,从而在低精度量化时减轻异常通道对其他通道的影响,并且通过实验发现按通道对Key量化带来了显著的准确性提升,但对Value则不然。通过消融比较发现按通道对 Key 量化和按Token对 Value 进行量化获得了更好的困惑度(Perplexity)。
当然按通道量化也面临挑战,因为如果在线计算,每次向Key缓存中添加新token时可能需要重新计算缩放因子。本文展示了可以通过使用校准集离线校准缩放因子,从而避免昂贵的在线重新计算。
此外,按通道对Key进行量化也在同期的工作KIVI中被探索,该工作将同一通道中的大幅度值组合在一起以最小化量化误差。他们的按通道量化方法需要进行细粒度分组,同时保持KV缓存的一部分为fp16精度。而本工作则展示了通过利用离线校准集,可以准确地执行按通道量化,而不需要进行分组。
二、在 RoPE 之前对 Key 进行量化,在旋转位置嵌入之前量化Key激活,以减轻其对量化的影响;
在量化Keys时遇到的一个问题是处理旋转位置嵌入(RoPE),它在大多数 LLMs(包括LLaMA和LLaMA2等)中应用于 Keys 和 Queries 。但应用RoPE后的Key向量缓存的挑战在于,它将导致序列中不同位置的不同通道对(pairs)以不同数量混合。上图2中展示了RoPE之后的激活分布,由于通道对之间旋转导致不一致的通道幅值,这使得通常具有一致的大幅度值的Key激活通道更难量化。这激发了作者探索是否可以在RoPE应用之前执行Key量化,然后在反量化后即时高效地应用位置嵌入。
通过实验发现在 RoPE 之前对 Key 进行量化带来了精度的提升,同时,为了能够在RoPE之前量化Key,作者开发了一个融合Kernel,以在反量化后高效应用RoPE。
三、非均匀 KV 缓存量化,通过导出每层敏感度加权的非均匀数据类型,以更好地表示分布;
均匀量化(Uniform quantization)对于KV缓存量化来说是不理想的,因为Query和Key激活的分布是非均匀的。此外,KV缓存加载受内存带宽限制,无论批量大小或序列长度如何,这意味着非均匀量化方法引入的反量化开销不会成为问题(因为增加的计算不会引入任何额外的延迟)。因此,作者希望利用非均匀量化方法对KV缓存进行量化。
在 SqueezeLLM 中,作者使用敏感度加权的k-means方法计算非均匀量化。然而,这不能直接应用于 KV 缓存量化,因为 Values 是在运行时动态量化的,这意味着我们需要在推理过程中在线应用 K-means,并且在线估计激活的敏感度也很困难。
因此,KVQuant 通过在校准数据上离线导出每层(per-tensor)的非均匀数据类型来促使高效的在线进行非均匀 KV 缓存量化,然后再按 per-channel 或 per-token 重新缩放以准确表示Key和Value的分布。通过在推理之前在校准集上离线计算敏感度加权量化路标(signposts),同时在导出共享数据类型之前,将每个通道单独归一化到范围 [−1 , 1 ] 来保持与per-vector量化的兼容性。
四、按向量(Per-Vector)密集和稀疏量化,分别隔离每个向量的异常值,以最大限度地减少量化范围中的偏差。
对于Key和Value,大多数元素(约99%)都被包含在动态范围的一小部分内。这意味着通过采用密集和稀疏量化的方法(如SqueezeLLM中所示)可以隔离一小部分数值上的异常值,并将它们存储在一个单独的稀疏矩阵中。这样做可以限制需要表示的范围,从而允许我们用更高的精度来表示剩余的元素。
此外,Key和Value的分布中,不同的通道和token具有不同的平均幅值。因此,在一个通道中被视为异常值的元素,在另一个通道中可能并不是异常值(因为那个通道可能有更大的平均幅值)。因此,在量化的粒度范围内,直接处理那些使动态范围发生偏离的离群值是至关重要的,以便解决沿着特定维度数值范围扩大的问题。KVQuant 采用了按向量密集和稀疏量化的方法,通过为每个向量使用不同的异常值阈值(对于按通道量化,是每个通道单独一个阈值;对于按token量化,是每个token单独一个阈值),而不是为每层使用单一的异常值阈值。
计算按向量密集和稀疏量化的异常值阈值可能会带来潜在的准确性和效率挑战。KVQuant 能够准确地离线校准 per-channel 的异常值阈值,并能够高效地在线计算per-token的异常值阈值。在确定上下异常值阈值后,向量中的其余数值被归一化到[-1, 1]的范围,然后最小化方程 (忽略异常值)以获得剩余数值的非均匀数据类型的量化路标(signposts)。
下图展示了通过移除一小部分离群值数值,并保持其全精度的好处,以及按向量(Per-Vector)密集和稀疏量化相对于每层(Per-Tenser/Per-Matrix)使用单个全局离群值阈值量化的优势。
五、Attention Sink 感知量化
先前的工作表明,在LLMs的前几层之后,模型倾向于将较大的注意力分数分配给第一个Token。即使开始的Token在语义上并不重要,也会发生这种情况。发生这种现象是因为模型倾向于使用开头的Token作为“sink”。KVQuant 中证明了,由于 Attention Sink 现象,模型对第一个Token中的量化误差异常敏感。通过仅保留第一个Token为FP16,就可以获得好处,特别是对于 2 比特量化。另一项同期进行的工作 Intactkv 也得出了类似的观察结果。
注意,在保留第一个Token为fp16时,作者也在校准过程中考虑到这一点,这意味着在导出 nuqX 数据类型(一个 X 比特按层灵敏度加权的非均匀数据类型)以及校准Key的缩放因子和零点时,忽略第一个Token。该方法会持续产生性能优势,特别是在较低位宽且没有密集和稀疏量化的情况下。
六、离线校准与在线计算
激活量化的一个关键挑战是,要么需要实时计算统计数据(这可能非常昂贵),要么需要使用离线校准数据(这可能对模型准确性有负面影响)。
图 3 展示了对于键和值在线与离线计算缩放因子(和零点)的挑战。在逐通道量化中,更新在线缩放因子是具有挑战性的,因为每个传入通道对应的缩放因子可能需要在 KV 缓存中添加新Token时进行更新。因此,离线(即在运行推理之前使用校准数据)计算统计数据是可取的。虽然这可能对模型准确性有负面影响,通过实验发现可以采用逐通道量化有效地进行离线校准,从而避免了在线更新缩放因子的需要。
对于逐Token量化,由于存在异常的 Value tokens ,离线校准缩放因子是具有挑战性的。因此,每个传入Token在线计算缩放因子和异常值阈值是可取的。通过卸载到CPU来有效地在线计算每个Token的异常值阈值。通过利用定制的量化函数实现来压缩激活,可以在线执行逐 Token 的 Value 量化而不会影响性能。
此外,为了在推理期间高效地执行激活量化,KVQuant 利用专门的 kernel 进行实现,采用4位量化方法压缩向量到要降低的精度,并提取稀疏异常值,使用压缩向量执行矩阵-向量乘法,并使用稀疏异常值执行稀疏矩阵-密集向量乘法。
将量化的Key和Value矩阵元素存储为4比特,它们用作查找表的索引以恢复相应的 fp16 值。同时,通过以压缩稀疏行(CSR)或压缩稀疏列(CSC)格式存储稀疏异常值矩阵(取决于哪种格式更适合添加新的Key和Value token);并且 Key 矩阵-向量运算的 kernels 实时应用RoPE以支持在RoPE之前进行量化。
实验细节
下图1是 KVQuant 中使用的不同组件概述 ,当将 LLaMA-7B 模型的 KV 缓存量化为 3 位精度时,这些组件在 fp16 基线上导致困惑度降低不到 0.1。
通过实验对比,KVQuant 方法在 3 位和 2 位量化方面始终明显优于基线方法。一旦隔离1%的异常值,KVQuant进一步提升了低精度量化的性能,相对于 fp16 基线而言,在Wikitext-2上 4 位量化实现了低于 0.02 的困惑度退化、3 位量化低于 0.1 的困惑度退化以及 2 位量化低于 0.5 的困惑度退化;在所有模型中,分别节省 了3.7×、4.8× 和 6.9× 倍内存。
为了评估较长上下文长度的性能,使用了大量输入上下文来评估 Wikitext-2 的困惑度,如图 4 所示,结果证明 KVQuant 方法在输入上下文量较大的情况下仍保持准确性,从而实现高效、准确的长序列长度推理。
表 4 提供了KVQuant方法与低精度权重量化一起应用时的结果(其中权重量化遵循Squeezellm中的方法)。即使权重也被量化以降低精度,当利用 KVQuant 的 KV 缓存量化方法时,观察到仅有少量的困惑度下降(当 LLaMA-7B 和 LLaMA-13B 模型使用 nuq4-1% 量化KV缓存时, 4 位和 3 位权重量化困惑度下降 0.02 和 0.1以内 )。其结果证明了KVQuant法与现有的仅权重量化方法兼容。
此外使用批量大小 1 对实现的 4 位密集和稀疏压缩和矩阵向量Kernel进行基准测试。通过在不同序列长度评估Kernel在生成过程中的性能。在A6000 GPU上,对于Key和Value乘法,相对于基线,可以分别降低 1.2-1.6× 和 1.3-1.7× 的延迟。
结语
本文介绍了两篇关于 KV Cache 量化的典型方案KIVI、KVQuant;同时,介绍了一种保持关键词元无损的量化小技巧IntactKV,该方法也可用于与 KV Cache 量化搭配使用。
码字不易,如果觉得我的文章能够能够给您带来帮助,期待您的点赞收藏加关注~~
参考文档: