概述
KV cache optimization shrinks and manages that memory so models serve longer contexts to more users at once.
深入探讨
In a transformer, each new token attends to all previous tokens via attention's keys (K) and values (V). Recomputing K and V for the whole sequence at every step would be quadratic and wasteful, so models cache them: the KV cache. The downside is size. The cache grows linearly with sequence length, batch size, layers, and heads, so a long-context request can consume more GPU memory than the model weights themselves. Optimization tackles this from several angles: paged memory (vLLM's PagedAttention) stores the cache in non-contiguous blocks to reduce fragmentation and enable sharing; quantization stores K and V in 8-bit or 4-bit; and architectural changes like Grouped-Query Attention (GQA) and Multi-Query Attention (MQA) let many query heads share fewer key/value heads, slashing cache size at the source.
现实世界的实施
vLLM's PagedAttention serving many concurrent chat sessions by packing KV blocks while reducing memory fragmentation
Llama 模型中的分组查询注意力机制减少了 KV 缓存大小,以便 GPU 内存可以容纳更长的上下文
将 KV 缓存量化为 8 位 (KV8),以在长文档摘要期间将缓存内存大致减半
前缀缓存可在数千个 API 请求中重用共享系统提示的 KV 块
KV缓存优化的未来
随着上下文窗口扩展到数十万或数百万个令牌,KV 缓存成为服务的主要成本。预计积极的缓存压缩和驱逐(丢弃低关注令牌)、默认的跨请求前缀共享、将冷缓存卸载到 CPU 或 NVMe,以及 MLA 和 GQA 等架构成为标准。缓存管理将越来越类似于具有分层和智能预取的完整内存层次结构。
付诸实践
为什么这很重要
- 成本与预算. 多年来,架构决策决定着性能和运营成本。
- 更清晰的判决. 技术教育帮助团队选择正确的堆栈,而不仅仅是最新的堆栈。
- 质量控制. 更好的工程选择可以减少生产中的可靠性事故。
留意
- 优化一项基准测试可以隐藏更广泛的系统弱点。
- 基础设施和维护成本常常被低估。
- 随着系统变得更加复杂,安全性和可观察性差距可能会扩大。
后续步骤
- 在实施之前定义延迟、质量和成本目标。
- 在实际负载和数据条件下进行基准测试。
- 仪器监控错误、漂移和用户影响。
- 在扩展之前准备回滚和事件响应路径。
不断探索
常见问题
What is KV Cache Optimization?
KV 缓存存储变压器已经计算出的键和值,因此它不会为每个新令牌重做工作 - 但它可以膨胀到千兆字节。 KV 缓存优化会缩小并管理该内存,因此模型可以同时为更多用户提供更长的上下文。
KV 缓存存储什么以及为什么?
缓存先前令牌中的键和值可以避免对每个新令牌重新进行注意力计算,从而节省时间。
为什么KV缓存会成为内存问题呢?
缓存大小随上下文长度和并发性而变化,因此长请求可能会使用大量 GPU 内存。
PagedAttention 借用了什么操作系统概念?
PagedAttention 将缓存存储在通过表映射的非连续固定大小块中,就像操作系统分页一样。
Grouped-Query 和 Multi-Query Attention 如何减少 KV 缓存大小?
跨多个查询头共享键/值头意味着要存储的 K 和 V 向量要少得多。
KV 缓存中前缀共享的好处是什么?
共享系统提示会生成相同的 KV 条目,因此多个请求可以指向相同的块,而不是重复它们。