Study MLA Indexer
定位
Indexer 是 DeepSeek 为 MLA 配套设计的预选器,完整组合叫 DSA(DeepSeek Sparse Attention)。
- 不是通用 sparse attention 方案
- 离开 MLA 单独用没有意义(需要 latent $c^{KV}$ 配合)
- 首发:DeepSeek-V3.2,沿用:R1、GLM-5.x、Kimi K2
数学流
按数据流顺序:
hidden_states X ∈ ℝ^(L×d)
│
├─ K compressor: k_repr_t = RoPE(x_t · W_kr) → quant(FP8) d → d_idx
├─ 写 Indexer K cache
├─ Q proj: q_t = RoPE(x_t · W_q) d → d_idx
├─ Logits: logits[i,j] = q_i · k_repr_j / √d_idx [L, L]
└─ Top-k: topk_indices[i] = arg top-k_j logits[i,j] [L, k]
↓
MLA sparse MQA 在 topk 处 gather latent c^KV
关键参数(DSv3.2):$d=7168$、$d_{idx}=128$、$d_c=512$、$k=2048$、$L$ 可达 100K+。
成本比:$d / d_{idx} ≈ 56×$(indexer 计算量是 MLA 主注意力的 1/56)。
三个 why
| 问题 | 答案 |
|---|---|
| 为什么 decode 必须 sparse? | 单 query 对 L 个 KV:dense 是 $O(L \cdot d)$,memory-bound(读 KV 1.4GB/step)。sparse gather 仅 $k \cdot d_c = 1\text{MB}$,省 1000× 带宽。 |
| 为什么 prefill 短可以 dense? | 当 query 侧 $\leq k$ 时 dense MHA 总开销 $O(L_q \cdot L \cdot d)$ 可控($L_q$ 小),indexer 反而是浪费。所有 prefill seq_len ≤ k 时直接走 dense MHA,indexer 算了也没人用。 |
| 为什么 indexer 要 cache? | 不 cache 时每步重算历史 $k_repr$:总成本 $O(L^2 \cdot d \cdot d_{idx})$。cache 后 $O(L \cdot d \cdot d_{idx})$。L=100K 时差 10 万倍。 |
两条 cache 区分
| Cache | 存什么 | 维度 | 谁写 | 谁读 |
|---|---|---|---|---|
| MLA KV cache | $c^{KV}$(latent 压缩) | $d_c=512$ | MLA 主路径 | MLA 主路径 |
| Indexer K cache | $k_repr$(RoPE + quant) | $d_{idx}=128$ | indexer step 1 | indexer step 4(logits) |
完全独立的两条 cache。Indexer 的 K cache 是 indexer 自己的持久状态——即使下游决定不读 topk,K cache 也必须先于 scoring 决策更新(下游 step 仍可能消费历史 $k_repr$)。
性能账
代入 $L=10^5, k=2048, d=7168, d_c=512, d_{idx}=128$:
| 路径 | 单次计算 | 累计 L 个 query |
|---|---|---|
| Dense MHA | $O(L \cdot d)$ | $7.2 \times 10^{13}$ ops |
| Sparse MQA + indexer | $O(k \cdot d_c + L \cdot d_{idx})$ | $1.4 \times 10^{12}$ ops |
| 加速比 | ≈ 50× |
e2e 实测(DSv3.2, GLM-5.2):短 prefill 场景 +2.54% req/s,TPOT decode 零回归,gsm8k 准确率 0.9424 不变。
与其他 sparse attention 的关系
| 方案 | 提出者 | 选择机制 | 可学习 | 与 MLA 配合 |
|---|---|---|---|---|
| DSA indexer | DeepSeek-V3.2 | 小 attention 网络 → top-k | ✅ | 专为 latent 设计 |
| NSA | DeepSeek 早期 | 三分支(压缩+选择+滑动窗) | ✅ | 独立 |
| Sliding Window | Mistral / Longformer | 固定窗口 | ❌ | 通用 |
| BigBird | 随机+窗口+全局 | ❌ | 通用 | |
| Routing Transformer | Roy et al. | k-means 聚类 | 部分 | 通用 |
| MInference | Microsoft | 动态 pattern 预测 | ✅ | 通用 |
DSA 独特之处:indexer 选出的 top-k 在 MLA 的 latent $c^{KV}$ 上 gather,gather 数据量 $k \cdot d_c$ 比 GQA 上的 $k \cdot d$ 小 14×。没有 MLA 的 latent compression,indexer 的内存优势不显著。
vLLM 现状
用 indexer 的模型:DeepSeek-V3.1 / V3.2 / R1、GLM-5.x、Kimi K2 Thinking 不用:Qwen-3(dense MLA)、Llama / Mistral(GQA)、GPT-OSS
核心文件:vllm/model_executor/layers/sparse_attn_indexer.py
Open questions
- PCP 下 indexer cache 所有权问题(vLLM 文档明确说”未验证”)
- MTP draft 迭代的 index sharing 怎么实现 topk 复用
- Kimi K2 用 DSA 的具体配置(topk、indexer 维度)
- indexer 端到端训练用什么梯度近似(straight-through?Gumbel-softmax?)