Kimi K3 注意力机制 · 交互可视化
KDA 递推状态 · DPLR 三步更新 · 混合层架构 · AttnRes 深度注意力 · 双状态内存池 · ReplaySSM
一、KDA 递推状态 vs MLA KV Cache
KDA:定长矩阵状态,每步原地覆写(固定 ~54 MB,TP=8)。MLA:追加式 KV,随序列长度线性增长。
拖动滑块模拟 128K token 序列中两种状态的演化。
已处理 token 数:
1K
KDA 递推状态(69 层 × 固定大小)
状态大小不变 ≈ 54 MB(TP=8) |
单层 ≈ MLA 几千 token 的 cache
Gated MLA KV Cache(24 层 × 追加式)
KV cache 随序列增长 ≈ 27 KB/步(全部 24 层)
二、DPLR 三步状态更新
KDA 将 $(I - \beta_t k_t k_t^\top) \cdot \mathrm{Diag}(\alpha_t) \cdot S_{t-1} + \beta_t k_t v_t^\top$ 分解为三步,
全部通过向量-矩阵运算实现,避免物化任何 $d_k \times d_k$ 矩阵。
→
Diag(αt)
逐通道遗忘
S' = Diag(αt) · St-1
→
δ 修正
删除 key 方向旧成分
S'' = S' − βt·kt(ktTS')
→
KV 写入
写入新 key-value
St = S'' + βt·ktvtT
=
三、混合层架构(3:1 交替)
93 层中,69 层为 KDA(蓝色),24 层为 Gated MLA(紫色)。每四个注意力层中,三个是 KDA,一个是 Gated MLA。
悬停查看层编号。
KDA(69 层)— $O(N)$ 线性注意力
Gated MLA(24 层)— $O(N^2)$ 完整注意力锚点
四、AttnRes:注意力在深度上的扩展
标准残差中每个前置层输出权重恒为 1(被"冲淡"),AttnRes 用可学习的伪查询向量选择性检索前置 block 的表示。
Block AttnRes(N=8)是 Kimi K3 实际使用的变体。
标准残差连接
每个前置子层输出以固定权重 1 累加
来源层
贡献
权重
hl = Σ vi(全部权重 = 1)
Block AttnRes(Kimi K3)
伪查询向量 wl 学习各 block 的重要程度
来源 Block
注意力
权重
hl = Σ αi→l · vi α = softmax(wlT · φ(vi))
五、双状态统一内存池
KDA 递推状态和 MLA KV blocks 共享一块物理内存,从两端向中间增长。不再需要为两种状态预分配独立池。
KDA 递推状态
按 head 切分 (TP)
空闲区域
按 token 切分 (TP)
MLA KV Blocks
◀ KDA 增长方向
MLA 增长方向 ▶
六、ReplaySSM:投机解码中的 KDA 状态管理
投机解码时不保存完整 KDA 快照(每层每头 64 KB),改为保存原始输入(~1 KB/步)。
sampler 确定接受长度后,fused fold kernel 仅重放被接受的 prefix——结果逐比特相同。
draft model
生成候选 token
每步生成 1 token
→
存储原始输入
(vi, ki, gki, βi)
~1 KB/步(非 64 KB 快照)
→
fused fold kernel
重放接受的 prefix
从 checkpoint 出发
=
bit-identical
KDA 状态
32× 内存削减