LLM推理优化技术综述:KVCache、PageAttention、FlashAttention、MQA、GQA

本文概述了大模型在推理过程中遇到的KVCache问题,重点介绍了PageAttention、FlashAttention、MQA和GQA等优化技术,旨在减少重复计算,提升性能。PageAttention通过显存管理和Copy-on-write减少显存占用,MQA和GQA通过共享参数减少模型体积,FlashAttention则利用GPU硬件层次结构提高内存效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LLM推理优化技术综述:KVCache、PageAttention、FlashAttention、MQA、GQA

随着大模型被越来越多的应用到不同的领域,随之而来的问题是应用过程中的推理优化问题,针对LLM推理性能优化有一些新的方向,最近一直在学习和研究,今天简单总结下学习笔记。

PART01:自回归场景引发的KVCache问题

首先LLM推理的过程是一个自回归的过程,也就是说前i次的token会作为第i+1次的预测数据送入模型,拿到第i+1次的推理token。在这个过程中Transformer会执行自注意力操作,为此需要给当前序列中的每个项目(无论是prompt/context还是生成的token)提取键值(kv)向量。这些向量存储在一个矩阵中,通常被称为kv cache。kv cache是为了避免每次采样token时重新计算键值向量。利用预先计算好的k值和v值,可以节省大量计算时间,尽管这会占用一定的存储空间。

所以未来LLM推理优化的方案就比较清晰了,就是尽可能的减少推理过程中kv键值对的重复计算,实现kv cache的优化。目前减少KV cache的手段有许多,比如page attention、MQA、MGA等,另外flash attention可以通过硬件内存使用的优化,提升推理性能。

PART02:PageAttention显存优化

PageAttention是目前kv cache优化的重要技术手段,目前最炙手可热的大模型推理加速项目VLLM的核心就是PageAttention技术。在缓存中,这些 KV cache 都很大,并且大小是动态变化的,难以预测。已有的系统中,由于显存碎片和过度预留,浪费了60%-80%的显存。PageAttention提供了一种技术手段解决显存碎片化的问题,从而可以减少显存占用,提高KV cache可使用的显存空间,提升推理性能。

首先,PageAttention命名的灵感来自OS系统中虚拟内存和分页的思想。可以实现在不连续的空间存储连续的kv键值。

在这里插入图片描述

另外,因为所有键值都是分布存储的,需要通过分页管理彼此的关系。序列的连续逻辑块通过 block table 映射到非连续物理块。

在这里插入图片描述

另外,同一个prompt生成多个输出序列,可以共享计算过程中的attention键值,实现copy-on-write机制,即只有需要修改的时候才会复制,从而大大降低显存占用。

在这里插入图片描述

PART03:MHA\GQA\MQA优化技术

接下来是GQA和MQA优化技术,在LLAMA2的论文中,提到了相关技术用来做推理优化,目前GQA和MQA也是许多大模型推理研究机构核心探索的方向。

MQA,全称 Multi Query Attention, 而 GQA 则是前段时间 Google 提出的 MQA 变种,全称 Group-Query Attention。MHA(Multi-head Attention)是标准的多头注意力机制,h个Query、Key 和 Value 矩阵。MQA 让所有的头之间共享同一份 Key 和 Value 矩阵,每个头只单独保留了一份 Query 参数,从而大大减少 Key 和 Value 矩阵的参数量。GQA将查询头分成N组,每个组共享一个Key 和 Value 矩阵。

如上图,GQA以及MQA都可以实现一定程度的Key value的共享,从而可以使模型体积减小,GQA是MQA和MHA的折中方案。这两种技术的加速原理是(1)减少了数据的读取(2)减少了推理过程中的KV Cache。需要注意的是GQA和MQA需要在模型训练的时候开启,按照相应的模式生成模型。

PART04:FlashAttention优化技术

最后讲下Flash attention优化技术,Flash attention推理加速技术是利用GPU硬件非均匀的存储器层次结构实现内存节省和推理加速,它的论文标题是“FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness”。意思是通过合理的应用GPU显存实现IO的优化,从而提升资源利用率,提高性能。

首先我们要了解一个硬件机制,计算速度越快的硬件往往越昂贵且体积越小,Flash attention的核心原理是尽可能地合理应用SRAM内存计算资源。

A100 GPU有40-80GB的高带宽内存(HBM),带宽为1.5-2.0 TB/s,而每108个流处理器有192KB的SRAM,带宽估计在19TB/s左右。也就是说,存在一种优化方案是利用SRAM远快于HBM的性能优势,将密集计算尽放在SRAM,减少与HBM的反复通信,实现整体的IO效率最大化。比如可以将矩阵计算过程,softmax函数尽可能在SRAM中处理并保留中间结果,全部计算完成后再写回HBM,这样就可以减少HBM的写入写出频次,从而提升整体的计算性能。如何有效分割矩阵的计算过程,涉及到flash attention的核心计算逻辑Tiling算法,这部分在论文中也有详细的介绍。

以上是对于最近LLM模型推理优化方面新的一些技术点的学习和概况总结,感激引用的文章作者,这方面还有很多内容需要总结和进一步消化。

引用:

[1]大模型推理加速工具:vLLM - 知乎

[2]百度安全验证

[3]vLLM大模型推理加速方案原理(PagedAttention)

[4]为什么现在大家都在用 MQA 和 GQA? - 知乎

[5]百度安全验证

[6]https://zhuanlan.zhihu.com/p/645376942

<think>嗯,我现在要了解一下KV Cache优化,这好像是关于大模型推理加速的技术吧。首先,得先搞清楚什么是KV Cache。在Transformer模型中,特别是自回归模型如GPT,每次生成一个token的时候,模型都需要处理之前所有生成的token。这时候,注意力机制中的Key和Value向量会被缓存起来,避免重复计算,这就是KV Cache的作用。 不过,KV Cache虽然节省了计算时间,但会占用很多内存,尤其是在处理长序列时,内存消耗会变得非常大。比如,生成很长的文本时,KV Cache可能会成为瓶颈,影响推理速度和可扩展性。所以,优化KV Cache的目标应该是减少内存占用,同时保持或提升推理速度。 接下来,我得想想有哪些优化方法。可能的方向包括压缩、共享、量化或者动态管理这些缓存。比如,有没有办法只保留重要的Key和Value,而丢弃那些不太重要的?或者能不能对KV Cache进行量化,用更少的比特来存储,从而减少内存占用? 还有一种可能是结构上的优化。比如,Multi-Query AttentionMQA)或者Grouped-Query AttentionGQA),这些方法通过减少Key和Value头的数量来降低缓存的大小。MQA让所有的查询头共享同一组Key和Value头,而GQA则是分组共享,这样可以在减少缓存的同时保持一定的模型性能。 另外,动态KV Cache管理也是个方向。根据序列的长度或者生成过程中的某些指标,动态调整缓存的大小。比如,当序列超过一定长度时,选择性丢弃一些较早的token的KV Cache,或者合并多个token的KV信息,从而控制内存增长。 还有像窗口注意力或者稀疏注意力机制,可能限制了每个token只能关注前面一定窗口内的token,这样KV Cache的大小就不会随着序列长度线性增长,而是固定在一个窗口大小,从而节省内存。 不过这些方法可能各有优缺点。比如,量化可能会引入精度损失,影响模型生成的质量;而动态管理可能需要复杂的策略,实现起来比较麻烦。MQAGQA需要在训练时调整模型结构,可能不适合已经训练好的模型。 另外,有没有一些系统级的优化?比如内存分配策略,或者利用硬件特性来更高效地存储和访问KV Cache。比如,FlashAttention这样的优化技术,通过优化显存访问方式来提高效率,可能也能间接优化KV Cache的性能。 还有一个问题是,不同的模型架构可能对KV Cache的依赖不同。比如,Decoder-only的模型在生成时每一步都需要KV Cache,而Encoder-Decoder模型可能在解码时也需要缓存Encoder的KV,所以优化策略可能需要根据模型类型调整。 再想想实际应用中的效果。比如,使用KV Cache优化后,内存占用的减少比例有多大?推理速度能提升多少?有没有论文或者实验结果支持这些数据?比如,GQA可能比MQA在保持模型质量的同时减少更多的缓存,或者某些动态管理方法在长文本生成中效果显著。 还有,工程实现上的挑战。比如,如何高效地实现KV Cache的压缩或量化,是否容易集成到现有的推理框架中,如Hugging Face的Transformers库或者vLLM等。可能有些优化需要修改模型结构或者注意力计算的具体实现,这可能涉及到底层代码的改动。 最后,总结一下,KV Cache优化主要是通过结构设计、压缩技术、动态管理和硬件协同等方法,在减少内存占用的同时保持推理效率,这对于大模型的实际应用非常重要,尤其是在资源受限的环境下或者需要处理超长序列的场景中。</think>KV Cache优化是大型语言模型(LLM推理加速的关键技术之一,以下是逐步解析: --- ### **1. KV Cache的作用** 在Transformer的自回归生成中(如GPT),每次生成新token时,模型需计算当前输入与历史所有token的注意力。为提升效率,**Key和Value向量会被缓存**(即KV Cache),避免重复计算。例如: - **未优化时**:生成第$t$个token需重新计算前$t-1$个token的Key/Value。 - **使用KV Cache后**:直接复用缓存,计算复杂度从$O(t^2)$降为$O(t)$。 --- ### **2. 问题:KV Cache的内存瓶颈** - **内存消耗公式**: $$ \text{内存} = 2 \times L \times h \times b \times s $$ 其中$L$为层数,$h$为注意力头数,$b$为批大小,$s$为序列长度。 - **示例**:175B参数的模型,序列长度2048时,KV Cache占用显存约**1.2TB**,远超GPU容量。 --- ### **3. 优化方法分类** #### **(1) 结构设计优化** - **Multi-Query Attention (MQA)** 所有Query头共享同一组Key/Value头,显存占用降低为原$1/n$($n$为头数)。 - **Grouped-Query Attention (GQA)** 折中方案,将头分为若干组,组内共享Key/Value,平衡性能与显存(如Llama 2采用)。 #### **(2) 量化与压缩** - **INT8/FP8量化**:将Key/Value从FP16转为低精度格式,显存减半。 - **稀疏化**:丢弃部分不重要的Key/Value(需设计重要性评估指标)。 #### **(3) 动态管理策略** - **窗口限制**:仅保留最近$k$个token的KV Cache(类似滑动窗口),显存复杂度从$O(s)$降为$O(k)$。 - **选择性缓存**:根据注意力分数或熵值,动态丢弃低频使用的历史KV。 #### **(4) 系统级优化** - **内存复用**:通过内存池预分配,减少碎片化(如vLLMPagedAttention)。 - **计算-存储权衡**:部分场景下牺牲计算换显存,如重新计算部分Key/Value。 --- ### **4. 实际效果对比** | 方法 | 显存减少比例 | 时延影响 | 适用场景 | |---------------|--------------|----------|------------------------| | MQA | 90%+ | 低 | 高吞吐推理 | | INT8量化 | 50% | 中 | 显存受限设备 | | 窗口限制 | 80%+ | 高 | 超长文本生成 | | PagedAttention| 30%~50% | 低 | 多请求并行 | --- ### **5. 挑战与趋势** - **精度损失**:量化或稀疏化可能降低生成质量,需结合校准或微调。 - **硬件适配**:需与GPU/NPU的显存带宽特性结合(如FlashAttention-2)。 - **动态策略泛化**:如何设计普适的KV Cache淘汰机制仍需探索。 --- ### **总结** KV Cache优化通过**结构简化、量化压缩、动态管理**等方法,显著降低显存占用,使大模型在有限资源下支持更长序列和更高吞吐。未来方向包括自动化策略与硬件协同设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值