KV Cache 不能“随用随丢”或立即释放,核心原因在于LLM 算法的计算依赖与GPU 显存管理的工程代价。
具体体现在以下几个方面:
自回归(Autoregressive)依赖:后一个 Token 必须看到前面所有 Token
在 Decode 阶段,生成第NNN个 Token 时,Attention 层需要与第111到第N−1N-1N−1个 Token 的 K 和 V 矩阵做点积。
如果把前面的 KV 释放了,生成下一个 Token 时就无法计算注意力,除非把所有历史 Token 重新做一次昂贵的 Prefill 计算。
显存分配与回收的巨额开销(显存碎片与 CUDA API 阻塞)
如果在 GPU 上频繁执行细粒度的显存分配与释放(如频繁调用
cudaFree),会导致极高的 CPU-GPU 同步等待开销,并引发严重的显存碎片。像 vLLM 等现代推理框架采用了类似操作系统页表(PagedAttention)的内存池技术。显存是以“页/块(Block)”为单位统一预分配的,即便某个 Token 结束了,也必须等到整块 Block 上的所有 Token 都失效且没有其他句柄引用时,才会被标记回收放回空闲池。
投机解码与多分支采样的引用锁(Tree Attention / Beam Search)
在投机解码或 Parallel Sampling 中,多个候选 Token 树分支会共享同一个祖先节点(Prefix)的 KV Cache。
此时系统存在引用计数(Reference Count)。只有当某个分支被彻底拒绝、且没有其他活跃分支依赖该段 KV 时,这部分 KV 才能被清空。
Prefix Caching(前缀缓存复用)
系统提示词(System Prompt)、长上下文或多轮对话的历史 KV,往往会被多个并发请求或后续对话复用。
推理框架通常会采用 LRU(最近最少使用)策略将这些 KV 保留在显存或 Swap 中,而不是立即释放,以此换取后续请求“零 Prefill 延迟”的巨大吞吐提升。