Reuse a Prefix
让相同前缀只计算一次
从请求分叉理解前缀复用、引用计数与写时复制。
可复用的是相同计算状态,不只是看起来相同的一段文字。
01相同开头带来重复 prefill
多条请求可能带着相同系统消息、长文档或少样本示例。只要输入 token、位置与模型计算条件一致,这段前缀产生的 KV 就可以共享。复用后每条请求从自己的后缀继续,不必重复计算开头。文本相似或渲染相同还不够,聊天模板与特殊 token 的差别也会改变实际前缀。
# Framework pseudocode for explicit prefix-state sharing.
# The prefix state is already available; no automatic lookup is assumed.
child = create_child_request(suffix_request)
child.block_table = prefix_state.block_table.copy()
for block in child.block_table:
pool.retain_reference(block)
shared_tail = child.block_table[-1]
if append_would_modify_shared_state(shared_tail):
private_tail = pool.copy_for_write(shared_tail)
child.block_table[-1] = private_tail
pool.release_reference(shared_tail)
# Inspect scheduler.fork_seq usage in examples/benchmark.py.
# Sharing also requires matching computation conditions.02共享状态需要所有权规则
共享只读块时增加引用计数,请求结束时减少,最后一个引用消失后才能回收。如果分叉发生在未写满的尾块,后续写入不能覆盖另一条请求正在使用的内容,需要复制或其他隔离策略。查找键还应区分模型版本、位置与缓存格式;把这些条件遗漏,命中率再高也可能算错。
03上游示例证明了什么
上游前缀复用示例先计算共同的 cached prefix,再通过 scheduler.fork_seq 构建后续请求,展示了显式分叉与状态复用。它不能单独证明发布版包含任意请求自动检索的完整 KV 服务。阅读时将分叉机制、前缀索引、跨机器传输与服务级淘汰分开;本课仅讲共享与生命周期这条主线。
04前缀块命中后,还要确认 SWA 状态
官方生产设计:官方部署文章区分前缀 KV 块命中与滑动窗口注意力(SWA)状态就绪。部分 SWA 状态没有随前缀保存时,可以回放有限长度的后缀,近似恢复继续执行所需的窗口状态。读这类方案时要同时追踪命中位置、状态有效范围和回放边界,不能仅凭块命中就直接开始 decode。 开源核对:StateBlock明确区分保存与丢弃的状态,并注明 consumer SWA 依赖 prefill 重算;截断元数据入口要求保留后缀覆盖 SWA 窗口与回退余量。公开版本包含这些恢复机制,但 README仍将完整 KV cache 服务列为未提供的基础设施,不能据此推断完整的生产前缀检索与恢复服务已经开源。
动手想一想
两个请求共享一个完整块和一个半满块,再分别追加不同 token。画出引用计数与写时复制过程,并指出哪一步可以安全释放旧块。