内容提要
本文解析 Kimi K3.1 Pro 的推理代码结构:主干仍为 93 层,由 69 层 KDA 与 24 层 Gated DSA 交替组成,其余配置沿用 K3。核心变化是将原 24 层 Gated MLA 改为 Gated DSA:每层独立索引器用三路投影为历史 token 打分,经 ReLU 加权求和后选出 top-2048 位置,再由 96 头 NoPE MLA 在这些位置上计算注意力,最后乘 sigmoid 输出门。稀疏化仅减少主注意力的读取量,主 KV 与索引 key 缓存仍随历史增长。
延伸解读
稀疏选择省的是读取,不是存储
文章明确指出,top-2048 只是当前 query 本次参与主注意力的位置集合,并非缓存容量上限。未被选中的历史位置仍可能被后续 query 选中,因此每个 DSA 层都要保留全部历史的主 KV 与索引 key。按维度粗算,1M 历史下 24 层缓存从约 27 GiB 增至约 33 GiB,说明 DSA 减少的是主注意力的读取量,历史存储反而因索引 key 增加。
别把 2048/1M 当成端到端加速比
在 1M 历史末端,2048 个位置约占 0.195%,但这只是主注意力读取位置的比例。索引器仍需对全部可见历史打分,prefill 阶段因果位置对仍是 O(n²) 量级;投影、TopK、MoE、KDA 与通信也照常执行。文章强调,仅凭结构无法给出实际延迟,稀疏化不等于整体提速数百倍。
读代码要区分配置默认值与 checkpoint
vLLM 的配置类默认写的是 16 个索引头、64 维,而发布 checkpoint 覆盖为 32 头、128 维,分析时应以 checkpoint 为准。类似地,full_attn_layers 只是沿用 K3 的层分类字段,不代表这些层仍做稠密注意力;共享的 topk_indices_buffer 只是临时存储复用,每层仍运行自己的索引器,不能解读为跨层复用选择结果。
前向结构可确认,训练配方仍是空白
文章能确认的是 69 层 KDA 加 24 层 Gated DSA、32×128 逐层独立索引器、top-2048、96 头 NoPE MLA 与 sigmoid 输出门。但推理代码没有给出索引器的训练损失、蒸馏方式、热身或冻结策略,也无法解释为何选 32 头、top-k 取 2048。公开配置的 num_nextn_predict_layers=0 同样不能证明训练时未用过 MTP。
Q&A
Kimi K3.1 Pro 相比 K3 在模型结构上最大的变化是什么?
K3.1 Pro 将原来 24 层 Gated MLA 替换为 Gated DSA(DeepSeek Sparse Attention),其余结构(93 层主干、69 层 KDA、AttnRes、Stable LatentMoE、MoonViT-V2 等)均沿用 K3。
Kimi K3.1 Pro 的 93 层主干是如何排布的?
主干共 93 层,按 [KDA, KDA, KDA, Gated DSA] 重复 23 次(共 92 层),最后第 93 层为 Gated DSA。即 69 层 KDA 与 24 层 Gated DSA 交替。
Gated DSA 中的索引器(indexer)是如何工作的?
每层有独立索引器,用三路投影:Query 从主注意力低秩表示分出(1536→32×128),Key 从输入投影为 128 维(含 LayerNorm),头权重投影为 32 个标量。各头点积经 ReLU 后按头加权求和得到分数,再在因果可见历史中选 top-2048 位置。
DSA 选出的 top-2048 位置之后,主注意力如何计算?
索引器只返回位置编号,主注意力仍使用自己的 96 头 NoPE MLA 的 query、key、value 在选中位置上计算 softmax 注意力,最后乘以 sigmoid 输出门(7168→12288)再经输出投影。
Gated DSA 的稀疏化能减少 KV 缓存吗?
不能。稀疏化只减少主注意力读取的历史位置数量,主 KV 缓存(512 维 latent + 64 维共享 key)和索引 key 缓存(128 维)仍随历史增长。top-2048 只是每次查询的工作集,不是缓存容量。
Kimi K3.1 Pro 的索引器是每层独立还是跨层共享?
每个 DSA 层都有自己独立的索引器参数,且每层独立选择 top-k 位置。vLLM 中共享的 topk_indices_buffer 只是临时工作内存,不是跨层共享选择结果。