分类: AI Infra
-
LMCache前缀索引
本文比较 vLLM v1 的本地 Automatic Prefix Caching(APC)与接入 vLLM 的 LMCache 分块前缀索引。下文谈到“vLLM 命中 GPU、LMCache 从 CPU 等存储载回”时,前提是未启用 vLLM 的 KV 卸载。vLLM 当前也提供 OffloadingConnector,可把前缀 KV 卸载到 CPU、文件系统或对象存储,再按需载回。 文中的 token ID、哈希值、block ID -
vLLM 前缀缓存的命中流程:块哈希链、命中粒度与块的生命周期
前缀缓存要复用相同前缀的 KV,需要一层索引回答两个问题:这段前缀算过没有、它的 KV 在哪些块里。vLLM 的答案是一张平铺的字典,键是由块哈希串成的链;SGLang 的答案是 Radix Tree。 代码引用自 vLLM main 分支(2026-09-21 拉取)与 SGLang main 分支。 复用单位是块 vLLM 的缓存池由固定大小的块组成,默认每块 16 个 token: # vllm/config/cache.py:7 -
PagedAttention:KV Cache 的分页、块表寻址与换页边界
PagedAttention 把序列的 KV Cache 划分为固定大小的块,通过块表记录这些块在缓存池中的位置。Attention kernel 根据块表读取 K/V,因此同一条序列的缓存可以分散存放。 它借鉴了操作系统的分页思想,但分页、地址翻译、换入换出分别承担不同职责。现代 GPU 已有硬件 MMU;PagedAttention 在硬件地址翻译之上,增加了一层面向 KV Cache 的软件映射。 KV Cache 如何按块分配 -
从 MHA 到 MQA 和 GQA:KV Cache 为什么会变小
看到 MQA 的“共享 K/V”时,一个直接的问题是:标准 MHA 的多个 Head 明明接收同一批 Token,为什么还要专门强调共享? 这里混在一起的是两种共享。MHA 的多个 Head 共享同一个输入隐藏状态 X,但各自生成独立的 Q、K、V。MQA 进一步让所有 Query Head 使用同一组投影后的 K/V。GQA 位于两者之间,每组 Query Head 共享一组 K/V。 从一次序列预测开始 为避开具体 tokenize -
KV Cache 注意力公式
计算公式 注意力权重统一记为 α,Attention 输出统一记为 o。o 经过多头合并、残差、FFN 和后续层后形成最终隐藏状态 h[N-1],用于预测第 N 个 Token。 有 KV Cache: 每一层只计算当前 Token 的 o[N-1], 历史 Token 的 K/V 直接读取缓存。 无 KV Cache: 每一层重新处理完整前缀, 从 o[1] 一直计算到 o[N-1], 借此重建各层历史 K/V。 $$ \boldsy