DeepSeek-V3 精神 · 教学版

MLA:少存 KV

MHA 每个头都存 K/V;GQA 少存几个头;MLA 连完整 K/V 都不存,只缓存一段低维「压缩稿」,用时再展开。

跑 python code/02_mla_attention.py · 不是 bit-exact 论文复现

1. 三种 Attention 存什么

MHA 每头一份 K 每头一份 V Cache ∝ nh GQA Q 仍是 nh 头 K/V 只有 nkv 头 Cache ∝ nkv MLA 缓存低维 latent + 少量 RoPE 键 用时再 up-project
图 1 · Decode 时真正贵的是「历史 K/V 占多少内存」

2. 教学实现在干什么

x → 压缩成 c_kv(低维)+ 一小段 rope key     ← 这是 cache 的东西
c_kv → 展开成各头的 K_nope 和 V             ← 计算时才做
Q 仍分 nope / rope 两段,拼起来做 QKᵀ

脚本默认:kv_lora_rank=32,再加 qk_rope_head_dim=16,所以 cacheable 最后一维是 48。对比 MHA 要存 2 × nh × T × d。

3. 数量级(脚本会打印)

同一套玩具超参下(T=128, fp16, batch1, 一层):

MHA : 约 128 KiB
GQA : 约 32 KiB   (nkv = nh/4)
MLA : 约 12 KiB   (只存 latent + rope)

论文里的真实 DeepSeek-V3 比例看官方配置;这里只建立「MLA 是在砍 cache 体积」的直觉。

面试口径:MLA 把 KV 压到共享低维空间,decode 少读内存;代价是 up-project 多几次小矩阵乘。别声称自己实现了官方核。

4. 和主线的关系

编译器/NPU 侧:Decode 瓶颈常是读 KV。GQA/MLA/量化 KV 都是在减这份流量。算子 lab 仍优先 Triton tiling;MLA 只需能讲清「存什么、为何更小」。

← Attention · 下一篇:张量并行 →