LLM上下文缓存与状态复用机制的分析和探索

在大模型推理中,上下文缓存与状态复用是提升性能、降低成本的核心技术。

它们主要围绕KV Cache展开,旨在解决Transformer架构中的计算冗余和显存瓶颈。

这里尝试基于网络资料,探索和分析KV Cache复用和分页注意力机制。

1 KV Cache

探索和分析状态复用,需要先了解其优化的对象-KV Cache。

1)KV Cache (Key-Value Cache)

在GPT Self-Attention中,每生成一个token,都需要计算该token与之前所有token的关联度。

为避免每次重新计算历史词语的key和value向量,系统会将它们缓存在显存,这就是KV Cache。

2)内存挑战

KV Cache的显存占用随序列长度和并发请求数线性增长。

在Llama2-70B这类大模型上,单个请求可能占用数百MB显存,更严重的是内存碎片化。

传统方案为每个请求预分配最大长度的连续显存,导致60%-80%的显存浪费,限制了并发能力。

2. 上下文缓存

上下文缓存的核心思想是让多个请求共享KV Cache,避免对相同内容进行重复计算。

2.1 Prefix Caching

Prefeix Caching即前缀缓存,这种技术专注于复用请求间的公共前缀部分,如固定的系统指令、多轮对话历史,将计算量从O(N)降到O(N - 公共前缀长度)。

1)应用场景

多轮对话、基于知识库的RAG问答、Few-shot示例共享、并行推理,如Self-Consistency等场景,都通过该技术显著受益。

2)实现机制

通过Radix Tree(基数树)等数据结构高效管理KV Cache。

它将Token序列构成树的边,新请求可快速通过树匹配最长公共前缀,并复用对应的缓存节点。

2.2 更广泛KV缓存复用

除了前缀匹配,还有更通用的复用方案:

1)LMCache

支持任意位置的文本复用,而不仅是前缀。

它将KV Cache持久化到GPU、CPU内存甚至磁盘,实现跨请求、跨进程的共享。

在vLLM等框架中,可为多轮对话、RAG等场景带来3-10倍的响应速度提升。

2)MemShare

针对长推理模型的共享KV缓存需求,通过协同过滤算法识别可复用的缓存块,并支持零拷贝共享,以降低显存开销、提升吞吐量。

3. 高效内存管理

解决复用问题后,就需要高效管理这些缓存。

3.1 PagedAttention

比如,LLM框架中的核心技术-PagedAttention。

它借鉴操作系统的分页思想,从根本上解决了KV Cache的内存碎片问题。

将KV Cache切分为固定大小的块Block,按需分配,并允许它们存储在非连续的物理内存中。

3.2 PagedAttention成效

1)消除碎片

按需动态分配,解决了预分配导致的内部和外部内存碎片。

2)内存共享

支持写时复制Copy-on-Write,使多个请求能安全地共享相同的缓存块。

3)性能提升

与HuggingFace Transformers相比,vLLM的吞吐量最高可提升24倍。

4)PagedAttention vs. Prefix Caching

两者常被混淆,但分工不同。PagedAttention是仓库管理员,负责如何高效地存储KV块,解决内存碎片;而Prefix Caching是智能调度员,负责决定存储什么,通过复用前缀来避免重复计算。

4. 补充优化技术

1)FlashAttention

算法层面的I/O感知优化,通过分块计算Tiling减少对显存的读写,使注意力计算提速2-4倍。

2)Chunked Prefill

将计算密集的Prefill阶段切分成小块,与Decode阶段交错执行,避免GPU算力被长Prompt独占,提升整体吞吐量。

3)KV Cache量化

将KV Cache压缩为FP8等低精度格式,可将显存占用降低约50%,支持更大批次和更长上下文。

4)分布式KV缓存

LMCache等技术支持将KV缓存池扩展到多节点共享,实现更大规模的上下文复用。

如百度百舸通过优化此技术使首Token延迟TTFT性能在64K长上下文中提升6.2倍。

reference


LMCache:基于KV缓存复用的LLM推理优化方案

https://developer.aliyun.com/article/1691956

Paged Attention

https://docs.vllm.tw/en/latest/design/paged_attention/#__codelineno-0-1

vLLM Optimization Techniques: 5 Practical Methods to Improve Performance

https://docs.jarvislabs.ai/blog/vllm-optimization-techniques

Automatic Prefix Caching

https://docs.vllm.ai/en/v0.14.0/design/prefix_caching/

Chunked Prefill

https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5906026.html

From Tokens to Layers: Redefining Stall-Free Scheduling for LLM Serving with Layered Prefill

https://arxiv.org/abs/2510.08055

KVFlow: Efficient Prefix Caching for Accelerating LLM-Based Multi-Agent Workflows

https://neurips.cc/virtual/2025/loc/san-diego/poster/119883

VLLM V1 Scheduler: Inconsistent Request Scheduling Under Token Budget Limit

https://discuss.vllm.ai/t/vllm-v1-scheduler-inconsistent-request-scheduling-under-token-budget-limit/1241?page=2#post_21

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

https://developer.baidu.com/article/details/1922871

相关推荐
杰克尼2 小时前
redis(day07-Redis 最佳实践)
数据库·redis·缓存
香蕉鼠片1 天前
Redis
数据库·redis·缓存
小臭希1 天前
Redis(NoSQL数据库,Linux-Ubuntu环境下)
数据库·redis·缓存
神の愛1 天前
mybatis什么时候不走 缓存??
spring·缓存·mybatis
014-code1 天前
Redis 删除缓存失败怎么办?重试、死信、补偿的工程化方案
数据库·redis·缓存
rannn_1111 天前
【Redis|高级篇1】分布式缓存|持久化(RDB、AOF)、主从集群、哨兵、分片集群
java·redis·分布式·后端·缓存
難釋懷1 天前
认识Canal
缓存
難釋懷2 天前
缓存同步
spring·缓存·mybatis
呼啦啦5612 天前
C++vector
java·c++·缓存