KV Cache
了解 KV Cache 如何优化 LLM 等 Transformer 模型。了解这项技术如何降低推理延迟并提升 Ultralytics YOLO26 的效率。
KV Cache(键值缓存)是一种关键的优化技术,主要用于大型语言模型 (LLMs)及其他基于 Transformer 的架构,以加快推理延迟并降低计算成本。从本质上说,KV Cache 会存储序列中先前词元的注意力机制生成的 Key 和 Value 矩阵。保存这些中间计算结果后,模型每次生成新词元时就无需重新计算整个对话历史的注意力状态。这一过程将文本生成工作流从二次复杂度运算转变为线性复杂度运算,使聊天机器人和AI 智能体能够实现实时交互。
机制与优势#
在标准 Transformer 模型中,生成下一个词时需要关注所有先前的词,以理解上下文。如果没有缓存,模型每一步都必须重新计算整个序列的数学关系。KV Cache 通过充当内存库来解决这个问题。
- 速度提升:通过从内存中读取预先计算的键和值,系统可以大幅加快推理引擎的速度。这对于需要低延迟的应用至关重要,例如客户服务机器人中的实时推理。
- 资源效率:虽然 KV Cache 会增加内存用量(VRAM),但会显著减少每个词元所需的计算量(FLOPs)。这种权衡通常通过模型量化或分页等技术来管理,类似于操作系统管理 RAM 的方式。
- 扩展上下文:高效管理 KV Cache 后,模型可以处理更大的上下文窗口,从而能够处理长文档,或在较长时间内保持对话连贯。
实际应用#
KV Cache 是部署现代生成式 AI 的基础组件,其原理也适用于计算机视觉 (CV)。
-
生成式聊天机器人:像 ChatGPT 或 Claude 这样的服务高度依赖 KV 缓存。用户提出后续问题时,模型不会从头重新读取整个聊天记录,而是将新输入追加到上一轮的缓存状态中,从而近乎即时地作出响应。
-
视频理解:在视频理解任务中,模型会按顺序处理帧。与文本词元类似,过去帧的视觉特征也可以缓存起来,帮助模型跟踪物体或识别动作,而无需重新处理整个视频历史。这对动作识别尤其有用,因为时间上下文至关重要。
高效内存管理#
随着模型规模扩大,KV Cache 的大小可能成为瓶颈,占用数 GB 的 GPU 内存。近期的进展主要集中在优化这类存储。
- PagedAttention:受操作系统虚拟内存启发,vLLM 引入的 PagedAttention 允许将 KV Cache 存储在非连续的内存块中。这能减少内存碎片,并在模型服务期间支持更大的批量大小。
- KV Cache 量化:为了节省空间,开发者通常会对缓存值专门应用混合精度或 int8 量化。这样可以缩小内存占用,让 RAM 有限的边缘 AI设备也能运行性能出色的模型。
- 提示缓存:这是一种相关技术,会对静态系统提示(例如“你是一位乐于助人的编程助手”)的 KV 状态计算一次,并在多个不同用户会话中重复使用。这是大规模优化提示工程工作流的一项核心功能。
区分相关概念#
区分 KV Cache 与其他缓存及优化术语很有帮助:
- KV Cache 与提示缓存:KV Cache 通常指单次生成过程中逐词元更新的动态内存。提示缓存则专指存储固定输入指令的已处理状态,以便在多个独立推理调用中重复使用。
- KV Cache 与嵌入:嵌入是输入数据(文本或图像)的向量表示,用于捕捉语义含义。KV Cache 存储的是注意力层中由这些嵌入生成的激活值(键和值),专门用于序列生成。
- KV Cache 与模型权重:模型权重是神经网络静态的学习参数。KV Cache 则由处理特定输入序列时,在前向传播过程中生成的动态临时数据构成。
示例:视觉模型中的上下文#
KV 缓存最常见于 NLP,但维持状态这一概念也适用于高级视觉模型。下面的示例使用 Ultralytics YOLO26,模拟在视频跟踪场景中传递状态(上下文)的过程。在这里,跟踪器会维持物体在不同帧中的身份,这在概念上类似于缓存跨词元维持上下文。
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,简化从数据标注到高效模型部署的整个流程。想要深入了解注意力机制的开发者,可以使用 PyTorch 等库,其中提供了实现这些缓存机制的基础模块。









