# FP4 从权重走进 KV 缓存

> 专家权重 FP4、其余 FP8 的方案 V4.1 原样沿用；新的一步是把主 KV 缓存也用量化感知训练压到 4 bit，而且特意选了和索引器不同的格式。滑动窗口缓存则留在 FP8。

- 作者：David（道雾轩）
- 专栏：DeepSeek V4.1 Flash 深度解析（https://daiw.net/manual/deepseek-v4-flash.md）
- 最后更新：2026-09-19
- 原文：https://daiw.net/manual/deepseek-v4-flash/fp8-fp4
- 转载与引用：请注明出处并附原文链接（https://daiw.net/about/copyright）

V4 已经把“在参数最多的地方省得最狠”用在了权重上：MoE 专家用 FP4，其余大部分用 FP8 [2]。V4.1 **沿用**这套权重方案，再把同一个思路推进到了缓存上 [1][3]。

## 各部件用什么精度

| 部件 | V4-Flash | **V4.1-Flash** | 出处 |
| --- | --- | --- | --- |
| 路由专家权重 | FP4 | FP4 | V4 论文；V4.1 的 `config.json` 与参考推理代码 |
| 其余大部分权重 | FP8 | FP8 | 同上 |
| 索引器的 Q / K | FP4（MXFP4） | FP4（MXFP4） | 两份报告 |
| 主 KV 缓存 | FP8，RoPE 维用 BF16 | **FP4** | 两份报告 |
| 滑动窗口 KV | FP8，RoPE 维用 BF16 | FP8 | 两份报告 |
| Engram 嵌入表与投影 | —— | FP8 | V4.1 报告 |

V4.1 报告没有单独复述专家权重的量化流程，只说优化配置在 V4 的基础上调整；`config.json` 的量化配置写着 FP8 与 `expert_dtype: fp4`，参考推理代码的说明里也写着“dense-fp8 / MoE-fp4”的算子 [1][3]。所以权重这一行是沿用。

## 沿用的部分：专家 FP4 与量化感知训练

V4 在**后训练阶段**引入量化感知训练（QAT），对象是两处 [2]：

- **MoE 专家权重**，这是显存占用的大头。优化器维护的 FP32 主权重先量化到 FP4，再反量化回 FP8 参与计算。V4 论文特意指出这一步反量化是无损的：FP8（E4M3）比 FP4（E2M1）多两位指数，动态范围更大，只要每个 FP8 块里各 FP4 子块缩放因子的比值不超过某个阈值，细粒度的缩放信息就能被 FP8 完全吸收。反向传播直接把梯度传回 FP32 主权重，等价于直通估计器。
- **索引器的 QK 路径**，QK 激活的缓存、读取与乘法全在 FP4 下进行；索引分数再从 FP32 降到 BF16，top-k 选择提速 2 倍，KV 条目的召回率保持在 99.7%。

强化学习采样和推理时，直接用原生 FP4 权重，保证采样行为与线上部署一致 [2]。

量化感知训练和社区常做的事后量化，差别在于模型知不知道自己会被量化：

| | 事后量化（PTQ） | 量化感知训练（QAT） |
| --- | --- | --- |
| 做法 | 训完之后把权重压到低精度 | 训练时就让模型在低精度约束下学习 |
| 模型知不知道自己被量化 | 不知道 | 知道，并会适应 |
| 谁能做 | 任何人，事后即可 | 只有训练方 |

对使用者的实际意义：**官方放出的 FP4 专家权重不是“压缩版”，就是它训练时的形态。**

## 新的一步：主 KV 缓存也用 FP4

V4.1 把量化感知训练扩展到了**主 KV 缓存**，同样在后训练阶段引入 [1]。这里 FP4 的作用和权重不同：**不是为了让矩阵乘法更快，而是为了少占存储**。和 V4 的 FP8 主 KV 相比，HBM 里和卸载到 SSD 上的占用都差不多减半 [1]。

### 为什么格式和索引器不一样

报告的解释很有工程味 [1]：

- 索引器的 Q、K 要直接参与 FP4 矩阵乘法，必须用硬件原生支持的格式。为了兼容尽可能多的硬件，V4 就选了 OCP 标准的 **MXFP4**（每 32 个数共享一个缩放），哪怕实验里别的格式更准。
- 主 KV 缓存在做注意力之前会先反量化，**不需要硬件原生支持这种格式的乘法**，于是可以挑更准的。

最后选定的格式是：**E2M1 数值，每 16 个通道配一个 E4M3 缩放**。它仿照 NVIDIA 的 NVFP4，但省掉了 NVFP4 的第二级全局缩放，以兼顾精度与简单。

### 为什么可以省掉全局缩放

报告做了一个数值上界的推演 [1]：

- 这种格式能表示的最大绝对值是 448 × 6 = 2688；
- V4.1 训练出的 RMSNorm 权重最大约为 1，归一化后 512 维 KV 潜向量的 L2 范数至多约为 $\sqrt{512} \approx 22.6$；旋转位置编码不改变范数，所以旋转后各通道的最大绝对值也不超过这个数；
- 训练中实际观察到的最大值只有 10 左右。

动态范围绰绰有余，去掉全局缩放“没有可测量的精度损失”，缓存布局也更简单。

### 两个细节

- **在 RoPE 之后量化**。先量化再加位置编码只能换来一点点精度，却会给解码增加额外开销；带 RoPE 与不带 RoPE 的部分用同一种格式 [1]。
- **滑动窗口 KV 留在 FP8**，因为它对量化更敏感 [1]。这也说明“哪里压、哪里不压”是逐个部件试出来的。

按这个格式，一条 512 通道的主 KV 占 288 字节；[CSA2 那一章](https://daiw.net/manual/deepseek-v4-flash/csa2)用它把每 token 890 字节拆了出来。

## 这一代的共同选择

把 V4 系列和同期的 K3 并排（K3 的数据见 [K3 专栏](https://daiw.net/manual/kimi-k3/spec-sheet)）：

| | **DeepSeek V4 / V4.1** | **Kimi K3** |
| --- | --- | --- |
| 权重精度 | FP4（专家）+ FP8（其余） | MXFP4 |
| 训练方式 | 量化感知训练 | 量化感知训练（自 SFT 起） |
| 缓存精度 | V4：FP8；**V4.1：主 KV 为 FP4** | —— |

4 bit 权重加量化感知训练，一年前还是激进的实验做法，现在已是前沿开放权重模型的常见配置。V4.1 往前多走的一步是把 4 bit 用到缓存上。

## FP4 不是万能的

- **训练稳定性要求高**：4 bit 的动态范围窄，要靠配套的缩放策略兜底，上面那段上界推演就是在证明“这里兜得住”。
- **硬件支持是前提**：FP4 的计算加速要靠硬件原生支持。没有对应算子的卡上，FP4 权重可能要先解压成更高精度再算，省了显存但没省算力。V4 论文也说，现有硬件上 FP4 × FP8 的峰值算力与 FP8 × FP8 相同，未来硬件理论上可以再快约 1/3 [2]。
- **不是每处都适合压**：滑动窗口 KV 就被留在了 FP8。

第四部分的下一章讲后训练。👉 [后训练：算法不变，数据与环境放大](https://daiw.net/manual/deepseek-v4-flash/post-training)

## 参考文献

- [1] DeepSeek-AI. “DeepSeek-V4.1-Flash: Pushing the Limits of KV Cache Compression.” 2026-09. [arXiv:2609.19969](https://arxiv.org/abs/2609.19969) —— 第 2.4.2 节（Engram 的 FP8）、第 2.4.4 节（FP4 主 KV 缓存：格式选择、上界推演、RoPE 后量化、滑动窗口保留 FP8）、第 2.5 节（优化配置沿用 V4）。
- [2] DeepSeek-AI. “DeepSeek-V4: Towards Highly Efficient Million-Token Context Intelligence.” 2026-04. [arXiv:2606.19348](https://arxiv.org/abs/2606.19348) —— 第 1 节（FP4 × FP8 的算力说明）、第 2.3.4 节（KV 的 BF16 / FP8 混合存储、FP4 索引器）、第 5.2.1 节（专家权重与索引器的 FP4 量化感知训练）。
- [3] Hugging Face：[deepseek-ai/DeepSeek-V4.1-Flash](https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash) 的 `config.json` 与 [inference/README.md](https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash/blob/main/inference/README.md) —— 量化配置与“dense-fp8 / MoE-fp4”算子的说明。
