KVQuant:使用 KV 缓存量化实现 1000 万上下文长度 LLM 推理

内容安全与风控MySQL

“ 挺实用的一篇文章,之前我写过一个博客里面关于长上下文推理的难点有一条是: 因为kv-cache的存在,每个输入token都会有一个key vector和value vector,这个缓存实在第一次推理的时候计算的(编码prompt的时候)。后续,这些值会被复用(加快推理速度)于生成后续的每一个token。 举个具体的例子: 例如一个7B的大模型,他有32个block,每个key、value向量都是4096的维度,每个输入有2个4096的向量(kev、value),一般用bf16/fp16存储每个值,每个值占用2个字节,输入context长度为32k。这就意味着一共有32 x 4096 x 2 x 2 x 32,000 = 16 GB的数据 (这个计算是针对一个注意力头的,通常使用多个小的注意力头,但是这个不影响)。而7B模型本身在fp16的精度下大概占用13 GB。 所以如果你想推理一个32k长度的文本,基本上显存占用对于模型参数本身和kv-cache来说是一半一半。

“ 原理感兴趣的小伙伴可以看原文把,量化的文章本来就难啃下来,当初看gptq awq都花了好久。


        
          
https://arxiv.org/pdf/2401.18079.pdf  
https://github.com/SqueezeAILab/KVQuant/  

      

picture.image

这个文章提到的KVQuant的方法,通过量化Key-Value(KV)缓存激活来减少大型语言模型(LLM)推理过程中的内存消耗。KV缓存在处理长文档分析和总结等任务时,由于需要较大的上下文窗口,成为内存消耗的主要贡献者。文章提出了几种创新的量化方法,以在极低精度(如4位以下)下准确表示KV缓存激活,同时保持模型性能。

KVQuant提到的量化方法包括:

  • Per-Channel Key Quantization:通过调整量化维度以更好地匹配Key激活的分布,特别是在应用RoPE(Rotary Positional Embedding)之前进行量化,以减轻其对量化的影响。
  • Pre-RoPE Key Quantization:在应用RoPE之前对Key激活进行量化,以减轻RoPE对量化的影响。
  • Non-Uniform KV Cache Quantization:提出了一种基于每层敏感性加权的非均匀数据类型(NUQ),通过在校准集上离线计算,为KV缓存量化提供准确的数据类型。
  • Per-Vector Dense-and-Sparse Quantization:为每个向量单独隔离异常值,以最小化量化范围的偏差,并在稀疏表示中紧凑存储这些值。
  • Q-Norm:通过规范化量化中心点来减轻分布偏移,为2位量化提供额外的好处。picture.image

KVQuant通过这些方法实现了在Wikitext-2和C4数据集上的3位量化,且在LLaMA、LLaMA-2和Mistral模型上取得了小于0.1的困惑度衰退。此外,KVQuant还开发了定制的CUDA内核,与baseline fp16矩阵向量乘法相比,为LLaMA-7B模型提供了约1.4倍的速度提升。这些结果展示了KVQuant在实现低精度KV缓存量化方面的准确性和效率。

文章还讨论了KVQuant在长上下文长度推理中的应用,展示了如何通过KVQuant在单个A100-80GB GPU上实现高达1百万上下文长度的LLaMA-7B模型推理,以及在8-GPU系统上实现高达1千万上下文长度的推理。这些成果对于提高LLM推理效率和扩展模型应用范围具有重要意义。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 XR 技术的探索与实践
火山引擎开发者社区技术大讲堂第二期邀请到了火山引擎 XR 技术负责人和火山引擎创作 CV 技术负责人,为大家分享字节跳动积累的前沿视觉技术及内外部的应用实践,揭秘现代炫酷的视觉效果背后的技术实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论