深圳Yolo 视觉
深圳
立即加入
词汇表

KV Cache

了解 KV Cache 如何优化像 LLM 这样的 Transformer 模型。学习这项技术如何减少 Ultralytics YOLO26 的推理延迟并提高效率。

KV Cache(键值缓存)是一种关键的优化技术,主要用于 大型语言模型 (LLM) 和其他基于 Transformer 的架构,以加速 推理延迟 并降低计算成本。其核心是,KV 缓存存储了 注意力机制 为序列中先前 token 生成的 Key 和 Value 矩阵。通过保存这些中间计算结果,模型避免了每次生成新 token 时重新计算整个对话历史的注意力状态。这个过程将 文本生成 工作流从二次复杂度操作转变为线性复杂度操作,使与聊天机器人和 AI 代理 的实时交互成为可能。

机制与优势

在标准的 Transformer 模型中,生成下一个词需要关注所有之前的词以理解上下文。如果没有缓存,模型需要在每一步重新计算整个序列的数学关系。KV 缓存通过充当内存库来解决这个问题。

  • 速度提升: 通过从内存中检索预先计算的键和值,系统显著加快了 推理引擎 的速度。这对于需要低延迟的应用程序至关重要,例如客户服务机器人中的 实时推理
  • 资源效率: 虽然它增加了内存使用量 (VRAM),但它显著减少了每个 token 所需的计算量 (FLOPs)。这种权衡通常通过 模型量化 或分页等技术进行管理,类似于操作系统管理 RAM 的方式。
  • 扩展上下文:KV 缓存的有效管理使模型能够处理更大的上下文窗口,从而能够处理长文档或在长时间内保持连贯的对话。

实际应用

KV 缓存是部署现代生成式 AI 的一个基本组成部分,但其原理也延伸到了 计算机视觉 (CV) 领域。

  1. 生成式聊天机器人:ChatGPTClaude 等服务严重依赖 KV 缓存。当用户提出后续问题时,模型不会从头开始重新读取整个聊天历史。相反,它将新的输入附加到上一轮的缓存状态中,从而实现近乎即时的响应。
  2. 视频理解:视频理解任务中,模型按顺序处理帧。类似于文本token,可以缓存过去帧的视觉特征,以帮助模型 track 对象或识别动作,而无需重新处理整个视频历史。这对于动作识别尤其重要,因为时间上下文至关关键。

高效内存管理

随着模型规模的增大,KV 缓存的大小可能成为瓶颈,消耗数 GB 的 GPU 内存。最近的进展集中在优化这种存储方式。

  • PagedAttention:受操作系统中虚拟内存的启发,PagedAttention(由vLLM引入)允许KV缓存存储在非连续内存块中。这减少了碎片化,并在模型服务期间实现更高的批处理大小。
  • KV 缓存量化:为了节省空间,开发者通常将 混合精度 或 int8 量化专门应用于缓存值。这减少了内存占用,使得内存有限的 边缘 AI 设备能够运行高性能模型。
  • 提示缓存(Prompt Caching):一种相关技术,其中静态系统提示(例如,“您是一个有用的编码助手”)的KV状态被计算一次,并在许多不同的用户会话中重用。这是优化大规模提示工程工作流的核心功能。

区分相关概念

将 KV Cache 与其他缓存和优化术语区分开来是有帮助的:

  • KV 缓存与 提示缓存KV 缓存通常指在单个生成流中使用的动态的、逐令牌的内存。提示缓存特指存储固定输入指令的已处理状态,以便在多个独立的推理调用中重复使用。
  • KV 缓存与 嵌入嵌入是输入数据(文本或图像)的向量表示,捕获语义含义。KV 缓存存储在注意力层中从这些嵌入派生出的 激活(键和值),专门用于序列生成。
  • KV 缓存与 模型权重模型权重是神经网络的静态学习参数。KV 缓存包含在特定输入序列的前向传播过程中生成的动态临时数据。

示例:视觉模型中的上下文

尽管 KV 缓存最常用于 NLP 领域,但维护状态的概念也适用于高级视觉模型。在下面的示例中,我们使用 Ultralytics YOLO26 模拟了在视频 track 场景中传递状态(上下文)的概念。在这里,track 器在帧之间保持对象的身份,概念上类似于缓存如何在 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,它简化了从数据标注到高效 模型部署 的流程。对于那些对注意力机制的深层原理感兴趣的人,像 PyTorch 这样的库提供了实现这些缓存机制的基础模块。

让我们一起共建AI的未来!

开启您的机器学习未来之旅