KV Cache
了解 KV Cache 如何优化像 LLM 这样的 Transformer 模型。探索该技术如何减少推理延迟并提高 Ultralytics YOLO26 的效率。
KV Cache (Key-Value Cache) 是一种关键的优化技术,主要用于 Large Language Models (LLMs) 以及其他基于 Transformer 的架构,以加速 inference latency 并降低计算成本。其核心在于,KV cache 会存储序列中先前 token 的由 attention mechanism 生成的 Key 和 Value 矩阵。通过保存这些中间计算结果,模型在每次生成新 token 时,就可以避免为整个对话历史重新计算注意力状态。这个过程将 text generation 工作流从二次复杂度操作转变为线性复杂度操作,使得与聊天机器人以及 AI agents 的实时交互成为可能。
机制与优势#
在一个标准的 Transformer 模型中,生成下一个词需要关注所有先前的词以理解上下文。如果没有缓存,模型将不得不在每一步重新计算整个序列的数学关系。KV cache 通过充当内存库来解决这个问题。
- 速度提升: 通过从内存中检索预先计算好的 key 和 value,系统可以极大地加速 inference engine。这对于需要低延迟的应用(例如客服机器人中的 real-time inference)至关重要。
- 资源效率: 尽管它会增加内存使用量(VRAM),但它显著减少了每个 token 所需的计算量(FLOPs)。这种权衡通常通过诸如 model quantization 或分页等技术来管理,类似于操作系统管理 RAM 的方式。
- 扩展上下文: 对 KV cache 的高效管理允许模型处理更大的 context window,从而使它们能够处理长文档或在较长时间内保持连贯的对话。
实际应用#
KV cache 是部署现代生成式 AI 的基础组件,但其原理也延伸到了 computer vision (CV) 领域。
-
生成式聊天机器人: 诸如 ChatGPT 或 Claude 的服务严重依赖 KV 缓存。当用户提出追问时,模型不会从头开始重新阅读整个聊天历史。相反,它将新的输入附加到上一轮的缓存状态后,从而实现近乎即时的响应。
-
视频理解: 在 video understanding 任务中,模型按顺序处理帧。类似于文本 token,可以缓存过去帧的视觉特征,以帮助模型跟踪对象或识别动作,而无需重新处理整个视频历史。这对于时间上下文至关重要的 action recognition 尤其相关。
高效内存管理#
随着模型规模的增长,KV Cache 的大小可能成为瓶颈,消耗掉数 GB 的 GPU 内存。近期的进展集中在优化这种存储方式上。
- PagedAttention: 受操作系统中虚拟内存的启发,vLLM 引入的 PagedAttention 允许将 KV cache 存储在不连续的内存块中。这减少了碎片化,并在 model serving 期间实现更高的批处理大小。
- KV 缓存量化: 为了节省空间,开发者通常专门对缓存的值应用 mixed precision 或 int8 量化。这减小了内存占用,使 RAM 有限的 edge AI 设备能够运行功能强大的模型。
- 提示词缓存: 这是一种相关技术,其中静态系统提示词(例如“你是一个乐于助人的编程助手”)的 KV 状态会被计算一次,并在许多不同的用户会话中重复使用。这是大规模优化 prompt engineering 工作流的核心功能。
区分相关概念#
区分 KV Cache 与其他缓存及优化术语非常有帮助:
- KV 缓存与 Prompt Caching 的区别: KV Cache 通常指在单个生成流期间使用的动态、逐个 token 的内存。提示词缓存专门指存储固定输入指令的处理状态,以便在多个独立的推理调用中重复使用。
- KV 缓存与 Embeddings 的区别: Embeddings 是捕获语义的输入数据(文本或图像)的向量表示。KV cache 存储专门为了序列生成目的而从注意力层内的这些 embeddings 派生出的激活(key 和 value)。
- KV 缓存与 Model Weights 的区别: 模型权重是神经网络静态的、学习到的参数。KV cache 由在特定输入序列的前向传递过程中生成的动态、临时数据组成。
示例:视觉模型中的上下文#
虽然 KV 缓存最著名于 NLP 领域,但维护状态的概念也适用于高级视觉模型。在下面的示例中,我们使用 Ultralytics YOLO26 模拟了在视频跟踪场景中传递状态(上下文)的想法。在这里,跟踪器在各帧之间维护对象的身份,这在概念上类似于缓存跨 token 维护上下文的方式。
from ultralytics import YOLO
# Load the Ultralytics YOLO26 model
model = YOLO("yolo26n.pt")
# Track objects in a video, maintaining identity state across frames
# The 'track' mode effectively caches object features to link detections
results = model.track(source="https://ultralytics.com/images/bus.jpg", show=False)
# Print the ID of the tracked objects
if results[0].boxes.id is not None:
print(f"Tracked IDs: {results[0].boxes.id.numpy()}")希望管理数据集并部署优化模型的开发者可以利用 Ultralytics Platform,它简化了从数据标注到高效 model deployment 的流程。对于那些对注意力的更深层机制感兴趣的人来说,像 PyTorch 这样的库提供了实现这些缓存机制的基础构建块。






