为什么保留FP8?一文读懂DeepSeek-V4.1-Flash-1017-oQ3e-ngram-mtp的196B Engram N-gram条件记忆机制
DeepSeek-V4.1-Flash-1017-oQ3e-ngram-mtp 是 DeepSeek-V4.1-Flash-1017 的 MLX 混合精度量化版(oQ3e 档位):主网权重被压缩到平均 3.629 bits/weight,而 196B 参数的 Engram N-gram 条件记忆表却刻意保留原始 FP8 精度(E4M3 数值 + 每 32 通道一个 E8M0 缩放,等效 8.25 bits/weight),运行时可从 SSD 直接读取、不占常驻内存。这篇文章把这套"选择性保精度"的设计讲透。
三分钟速览
- Engram 表是一张 196.6B 参数的"字典式"查找记忆,占全部权重的 25.8%
- 量化预算只针对"其余权重",Engram 被排除在外,因此保留 FP8
- 依赖 SSD offload,常驻内存与非 ngram 版本一致,约 239 GiB
📦 模型速览:763B 参数里都有什么
DeepSeek-V4.1-Flash-1017 是 552B 骨干的多模态混合专家(MoE)模型,采用 Causal Encoder-Decoder 结构,配备 Compressed Sparse Attention 2(CSA2)、Engram 条件记忆与 DSpark 投机解码。本仓库是它的 oQ3e 混合精度 MLX 检查点,由四部分构成:
| 组件 | 逻辑参数量 | 量化后存储 |
|---|---|---|
| 语言骨干 | 551.881B | 230.942 GiB |
| Engram 表(N-gram 记忆) | 196.614B | 188.833 GiB |
| 视觉编码器 | 0.485B | 0.904 GiB |
| MTP 头 | 14.225B | 7.495 GiB |
| 合计 | 763.205B | 428.174 GiB |
记住两个关键数字:剔除 Engram 表后有效平均 3.629 bits/weight,完整检查点则为4.819 bits/weight——两者之差正是本文要回答的问题。
🔍 Engram N-gram 条件记忆到底是什么
如果把 Attention 理解为"通读全文找线索",那么 Engram 就是"翻字典":它把**最近几个 token 组成的局部模式(n-gram)**直接映射到一张预存记忆表里,取出对应的记忆向量注入网络。
关键规格可在 config.json 中查证:
engram_layer_ids: [1, 14]— 第 1、14 层各部署一组 Engramengram_num_embeddings— 每层约3.84 亿个记忆槽位(384,006,168 / 384,016,682),每个槽位 256 维engram_max_ngram_size: 4— "条件"最多由连续 4 个 token 组成engram_vocab_size: 16000000— n-gram 词表桶多达 1600 万engram_n_heads: 8、engram_head_dim: 256
之所以叫条件记忆:模型查询的不是单个词,而是"最近 4 个词的短语"这个局部条件,命中即取回一段现成的记忆。这类机制适合存储固定短语、事实关联等海量低层知识,单次查找的成本远低于完整注意力。
对应的实际张量可在 model.safetensors.index.json 中查到,例如language_model.layers.1.engram.embed.weight(第 1 层记忆表)、language_model.layers.14.engram.embed.weight(第 14 层记忆表),以及配套的q_weight/k_weight/wkv查询与投影权重。
❓ 为什么保留 FP8:三个原因
整份模型都压到了平均 3.63 bit,唯独 196B 的 Engram 表"高抬贵手"留在 FP8。这不是疏漏,而是三层权衡的结果。
原因一:查找型权重对量化误差最敏感
网络里做矩阵乘法的权重是"大面积平均型"的:成千上万个数的微小误差会被乘法平滑掉。而 Engram 表是"定点读取型":某个槽位一旦被命中,256 维向量原样投入使用,误差没有藏身之处——记忆值一旦偏了,就是"查错了字典",后续层很难纠正。保留原始 E4M3 + E8M0 缩放(即 MXFP8,group 32)存储,就是为了保住记忆内容的保真度。
原因二:量化预算刻意把 Engram 排除在外
oQ3e 量化器的目标对象是"剔除 Engram 后的其余权重"(见 quantization_report.json 中的budget_scope: remaining_weights_excluding_engram),目标平均 3.5 bit、硬上限 3.7 bit。如果把 196B 的表塞进同一预算,整体平均值会被大幅抬高,主网精度反而被稀释。"表归表、网归网"是最干净的分账方式。
原因三:SSD offload 让 FP8 不花"内存钱"
一张 188.8 GiB 的表,最大的顾虑是常驻内存。但 oMLX 支持把 Engram 表直接从 SSD 读取,README 明确说明:常驻内存与非 ngram 版本一致(约 239 GiB)。也就是说,保留 FP8 的代价记在磁盘上,而不是内存上——对本地大模型而言,磁盘恰恰是更便宜的那一侧资源。
一句话总结:FP8 体积已只有 BF16 的一半、预算不计它、内存不占它,唯独"内容保真"要求严格——FP8 就是它的最优解。
⚙️ oQ3e 的"位宽预算"是怎么分的
该检查点由 oQ(oMLX v0.7.1)混合精度量化生成(Improved oQe):先按实测层敏感度分配位宽,再用 1024 样本 × 512 token 的重要性矩阵、配合加权最小二乘重拟合,对每个量化组的 scale 与偏置做精修。
实际位宽分布(完整表格见 README.md):
| 存储格式 | 逻辑权重 | 占比 | 有效 bits/weight |
|---|---|---|---|
| Affine 3-bit,group 64 | 543.582B | 71.224% | 3.50 |
| MXFP4,group 32 | 13.590B | 1.781% | 4.25 |
| Affine 4-bit,group 64 | 2.055B | 0.269% | 4.50 |
| Affine 8-bit,group 64 | 1.886B | 0.247% | 8.50 |
| Affine 6-bit,group 64 | 1.258B | 0.165% | 6.50 |
| MXFP8,group 32 | 0.779B | 0.102% | 8.25 |
| BF16 | 3.399B | 0.445% | 16.00 |
| FP32 | 0.042B | 0.006% | 32.00 |
| Engram MXFP8,group 32 | 196.614B | 25.762% | 8.25 |
| 合计 | 763.205B | 100% | 4.819 |
可以看出:超过七成权重只花 3 bit,而对精度敏感的模块(视觉编码器、部分注意力输出投影等)会额外分到 6/8-bit 甚至 BF16——这正是"混合精度"的含义:把有限的位宽花在刀刃上。
🚀 名字里的 "mtp":MTP 与 DSpark 投机解码
模型还附带14.225B 参数的 MTP(Multi-Token Prediction)权重(量化后 7.495 GiB):共 3 个 nextn 预测层,采用 DSpark 机制一次投机多个候选 token(block size 5,锚定第 37/38/39 层,128 个路由专家取 top-3,Markov 秩 256),细节见 config.json。推理时由主模型验证投机结果,命中率高的场景下生成速度会有明显提升。
❓ 快速答疑
Q:实际运行大概需要多少内存?Engram 表经 SSD offload 后,常驻内存与非 ngram 版本一致,约239 GiB;磁盘则需约 430 GiB 放完整检查点。
Q:保留 FP8 和非 ngram 版本比,差别在哪?两者除 Engram 表外的权重完全一致,差异只在表的存储方式:ngram 版本以 FP8 保留更高保真的查找记忆,代价是磁盘占用多出约 188.8 GiB。
Q:为什么平均是 4.819 bit 而不是 3.5 bit?3.5 bit(目标值,实际 3.629)是"剔除 Engram"口径的平均;196B 的表按 8.25 bit 计入后,整体口径升到 4.819 bit——这就是"表隔离、网压缩"策略的直接体现。
Q:量化细节在哪看?quantization_report.json 记录了量化档位(oq_level: 3)、目标位宽(3.5)、预算范围、校准设置与逐模块精度策略。
📥 获取与阅读建议
git clone https://gitcode.com/hf_mirrors/mlx-community/DeepSeek-V4.1-Flash-1017-oQ3e-ngram-mtp推荐阅读顺序:README.md(量化摘要与存储分解)→ config.json(模型结构、Engram 与 MTP 参数)→ quantization_report.json(逐模块量化细节)→ LICENSE(MIT 协议)。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考