Reference · Runtime ledger

Kimi K3 vLLM 推理状态台账

当输出不对、cache 命中异常或 speculative decode 回滚失败时,用这张表先确认“谁拥有它、什么时候写、下一步谁读”。版本固定到 vLLM f4b161d7

请求持久状态

状态所有者prefill 写入plain decode随长度增长
KDA recurrent state请求 × KDA 层 × TP rank保存 prompt 末尾 state读取后原地前进一步
KDA Conv4 state请求 × KDA 层 × TP rank保存 Q/K/V 最近 3 项shift 并追加新输入
MLA latent KV请求 × MLA 层 × token/page每 prompt token 写 576 维 latent追加一项并查询全部可见页是,O(T)
prefix/cache metadata请求/调度器建立长度、hash、page 与 slot 映射长度 +1,分配/复用 slot按 block/page
RecoverSSM 记录spec 请求 × KDA 层通常不需要仅启用对应 speculative 路径时使用依配置与 draft 长度

只在当前 forward 内存在

临时量典型 shape最后消费者为何不能算作 cache
AttnRes buffer[T,8,7168]最终深度聚合新 token 会重建自己的深度来源
KDA Q/K/V/decay/gate[T,96,128]KDA core/output projection只把最终 recurrent/conv state 提交
MLA prefill K/V[T,96,192]/[T,96,128]prefill attention持久页只存 [T,576] latent
router logits[T,896] FP32Top-16 routing下一 token 重新路由
expert activation[T×16,3584/3072]combine属于本层 channel mixing workspace
LM logits选中位置 [N,160000]sampler采样后无需作为模型历史读取

prefill / decode 分派

模块prefillplain decode
KDAShortConv + FlashKDA 或 chunk fallback;提交末尾 statefused conv update + recurrent KDA + norm/gate;原地提交
MLA临时展开 K/V,运行 causal attention,latent 插页W_UK_T BMM1 → latent MQA → W_UV BMM2
AttnResbuffer 第一维覆盖所有 packed prompt token只为本轮 decode token 建 buffer
LatentMoE按所有 packed token 路由按当前 decode token 路由;小 batch 更偏 memory-bound

一个 token 的提交边界

调度器确定本轮输入 token 和其逻辑位置,准备 KDA state index 与 MLA slot mapping。
token 穿过全部 93 层;每个 KDA 层更新自己的 state,每个 MLA 层追加自己的 latent。
临时 AttnRes、Q/K/V、router 和 expert workspace 在相应消费者完成后可复用。
最终 hidden 进入 LM head;sampler 从 logits 选出下一个 token。
新采样 token 尚未进 cache,必须作为下一轮输入再次完成上述流程。

排错不变量

不变量 1:同一请求提交到所有 69 个 KDA cache group 的逻辑长度必须一致;不能让某层停在 D、另一层已经到 E。
不变量 2:同一请求的 24 个 MLA 层各有独立 latent page 序列;它们 shape 相同但数值和权重空间不同。
不变量 3:prefill 采样出 E 后,cache 仍截止 D;只有消费 E 的 decode forward 才提交 E。
不变量 4:speculative 验证拒绝 suffix 时,KDA state 必须恢复到最后接受 token 的边界;不能只回收 MLA slots。

逐步示例见第二课。源码入口:kda.pymla.pymodel.py