Skip to content

约 18 分钟阅读

15. DeepSeek:MLA、MoE 与 MTP ​

上一篇看了 Qwen 各代怎样在 Llama 式骨架上逐项调整。DeepSeek 走得更远:从 2024 年的 V2 开始,它同时改了注意力(MLA)和 FFN(DeepSeekMoE),之后每一代都在这两块上继续动刀。这一篇按 V2 → V3 → R1 → V3.1/V3.2 → V4 的顺序读各代的 config.json 和 Transformers 源码,回答几个具体问题:DeepSeek-V3 的 6710 亿参数怎样算出来、为什么每个 token 只用到其中约 370 亿;MLA 让 KV Cache 小到什么程度、代价是什么;MTP 是什么、为什么能拿来做投机解码;R1 和 V3.1 到底改没改架构;V3.2 和 V4 的稀疏注意力分别怎样挑位置。MLA 和 MoE 的通用机制分别在第 04 篇和第 10 篇推导过,这里只讲 DeepSeek 的具体取舍和数字。

读完你应该能拿到任意一个 DeepSeek 检查点,从配置判断它属于哪一代结构,手算它的参数量和每 token 的 KV Cache,并分清哪些能力来自架构、哪些来自训练。

先看哪些代改了结构 ​

“DeepSeek 又发新模型了”这句话背后,有时是一套新结构,有时只是同一套权重骨架换了训练方法。判断方法很朴素:把新旧两份 config.json 逐项比较,看有没有新增字段;再看 Transformers 里是否为它新建了模型类。

DeepSeek 各代中,V2、V3、V3.2、V4 改了网络结构,R1 和 V3.1 与 V3 结构相同、只改了训练

按这个标准,六个版本分成两类。V2、V3、V3.2、V4 都改了结构:V3.2 的配置多出 index_* 三个字段,模型类从 DeepseekV3ForCausalLM 变成 DeepseekV32ForCausalLM;V4 换成了全新的 deepseek_v4。R1 的 config.json 与 V3 逐项相同,一个字段都没变;V3.1 只在 quantization_config 里多了 scale_fmt: ue8m0,那是 FP8 缩放因子的存储格式,不是网络结构。R1 的长思维链和 V3.1 的“思考/非思考”切换,都要到训练和对话模板里找原因。

V2:MLA 和 DeepSeekMoE 第一次组合 ​

DeepSeek-V2(2024 年 5 月发布)总参数 2360 亿、每 token 激活 210 亿,60 层、隐藏维度 5120、128 个注意力头。它的两项改动后来一直沿用。

MLA(Multi-head Latent Attention,多头潜在注意力)把每个 token 的 K、V 压成一个 kv_lora_rank = 512 维的潜向量,再加一个所有头共用的 qk_rope_head_dim = 64 维位置分量,缓存里只存这 576 个数;查询侧也先压到 q_lora_rank = 1536 维再展开。低秩压缩、解耦 RoPE 和矩阵吸收的推导见第 04 篇,这里只看 DeepSeek 为它付出和换回了什么。

DeepSeekMoE 把 FFN 拆成很多个小专家:V2 每个 MoE 层有 160 个路由专家、2 个共享专家,每个 token 选 6 个路由专家,每个专家的中间维度只有 1536(moe_intermediate_size),第 1 层保留普通密集 FFN(first_k_dense_replace = 1)。细粒度专家让组合更多,共享专家专门承担所有 token 都需要的通用变换。V2 的负载均衡靠三项辅助损失(专家级、设备级、通信量),并限制每个 token 最多发往 3 台设备(topk_group = 3)。

把 V2 的参数按配置逐项加起来,得到 235,741,434,880,和 Hugging Face 上 V2 检查点统计的参数总数一个不差。这说明后面 V3 用的同一套算法是可靠的。

MLA 的账:省下显存,多花计算 ​

V3 沿用 V2 的 MLA 配置,层数变成 61,每 token 的缓存是:

text
MLA 每 token KV Cache = 层数 × (kv_lora_rank + qk_rope_head_dim) × 每个数的字节
                      = 61 × (512 + 64) × 2 B(BF16)
                      = 70,272 B ≈ 68.6 KiB

资料助手把一整本 10 万 token 的员工手册放进上下文时,差别就是能不能放得下:

同样 61 层、128 个查询头每层每 token 存的数10 万 token(BF16)
普通 MHA:128 头 × (K 192 + V 128)40,960约 500 GB(465 GiB)
GQA:8 个 KV 头 × (128 + 128)2,048约 25.0 GB(23.3 GiB)
MLA(V3 实际)576约 7.0 GB(6.5 GiB)
对照:Llama-3.1-8B(32 层 GQA)2,048约 13.1 GB(12.2 GiB)

V2 论文用“等价于 2.25 组的 GQA”描述这件事,(512 + 64) ÷ (2 × 128) = 2.25;论文报告相比 DeepSeek 67B,KV Cache 减少 93.3%、最大生成吞吐提高到 5.76 倍。

代价在计算和部署上。解码时用吸收后的形式,128 个头都直接在 576 维缓存上算点积、在 512 维上加权求和。单个请求解码时,每个历史位置、每层的账大约是:

text
吸收后的 MLA:2 × 128 头 × (576 + 512) ≈ 27.9 万 FLOPs,读 576 × 2 = 1,152 B,约 240 FLOPs/B
Llama-3.1-8B GQA:2 × 32 头 × (128 + 128) ≈ 1.6 万 FLOPs,读 8 × 256 × 2 = 4,096 B,4 FLOPs/B

240 已经接近 H800 这类 GPU 的算力与带宽之比(约 990 TFLOPS ÷ 3.35 TB/s ≈ 295)。MLA 把解码注意力从“等显存读数据”推到“快要等算力”,所以要专门的算子(如 DeepSeek 开源的 FlashMLA)才能跑出效果;用通用实现先把潜向量展开成完整的 K、V,省下的显存又花回去了。另一个代价在多卡部署:所有头共用同一个潜向量,按头切分的张量并行没法把缓存分到各张卡,每张卡都要存一份完整的,所以部署 DeepSeek 时注意力部分常改用数据并行。显存账和多卡并行见推理系列的第 04 篇和第 16 篇。

V3 的 MoE:256 个专家怎样选 8 个 ​

DeepSeek-V3(2024 年 12 月发布)把 V2 的骨架放大:隐藏维度 7168、61 层,前 3 层是密集 FFN(中间维度 18432),后 58 层是 MoE。每个 MoE 层有 256 个路由专家、1 个共享专家,每个 token 选 8 个,每个专家的中间维度 2048。路由方式也换了:V2 用 softmax 打分,V3 改成 sigmoid 打分,并引入无辅助损失的负载均衡偏置。

DeepSeek-V3 的路由:sigmoid 打分,加偏置后先按组分选出 4 组,再在 128 个专家里选 8 个,权重用不含偏置的原始分数

按 Transformers 里 DeepseekV3TopkRouter.forward 的逻辑,简化后是这样:

python
# x: [n, 7168],W: [256, 7168],bias: [256](e_score_correction_bias,不参与梯度)
s = sigmoid(x @ W.T)                          # [n, 256] 原始分数
c = s + bias                                  # 只用于“选谁”
group = c.view(n, 8, 32).topk(2).values.sum(-1)   # [n, 8] 每组取最高 2 个分相加
keep = group.topk(4).indices                  # 留下 4 组 = 128 个候选
c = c.masked_fill(不在 keep 组里, -inf)
idx = c.topk(8).indices                       # [n, 8] 选中的专家
w = s.gather(1, idx)                          # 权重用原始分数,不含 bias
w = w / w.sum(-1, keepdim=True) * 2.5         # routed_scaling_factor
y = Σ w_k · expert_k(x) + shared_expert(x)

这里有三个 DeepSeek 特有的取舍。

先选组,再选专家。 训练时 256 个路由专家分布在 8 个节点上,一组对应一个节点。每个 token 最多发往 4 个节点(论文里 M = 4),跨节点的通信量就被封顶了。这是为训练集群的网络拓扑设计的约束,n_group 和 topk_group 两个字段记录的就是它。推理部署不一定按这个方式摆放专家,但路由规则已经训练进模型,推理时仍要照做。

偏置只管选择,不管加权。 每个专家有一个偏置 b。训练中每一步统计各专家接到的 token 数,过载的 b 减去 γ,空闲的 b 加上 γ,γ 在前 14.3T token 取 0.001,最后 500B token 取 0。这个调整不经过梯度,也不往损失里加项,所以不会像辅助损失那样把“均衡”和“预测下一个 token”两个目标搅在一起。V3 只留了一项系数 α = 0.0001 的序列级辅助损失,防止单条序列内极端不均衡。论文的消融实验里,同样规模的模型改用无辅助损失方案后,多数评测好于纯辅助损失方案;另一组 1B 模型的对照中,验证损失是 2.253,序列级辅助损失方案是 2.258。这是 DeepSeek 自己的对照,差距不大,能说明“去掉主要的辅助损失不会更差”,不能说明它在所有规模、所有数据上都更好。

负载失衡怎样看出来。 均衡做不好时,少数专家接走大部分 token,其余专家几乎不训练,这就是路由坍缩:总参数还是 6710 亿,有效容量却小得多。训练中要监控每个专家每步接到的 token 比例,以及 e_score_correction_bias 是否持续朝一个方向漂移;推理时专家并行里总有一张卡最忙,往往也是少数专家过热的表现,需要按专家统计 token 数确认。

671B 和 37B 的参数账 ​

把 V3 的配置逐项代入(计算脚本按 config.json 字段写成,每个模块的形状来自 modeling_deepseek_v3.py):

text
每层 MLA:q_a 7168×1536 + q_b 1536×(128×192) + kv_a 7168×576
         + kv_b 512×(128×256) + o 16384×7168 + 两个小 norm = 187,107,328
每个专家:3 × 7168 × 2048 = 44,040,192(gate、up、down 三个矩阵)
密集 FFN:3 × 7168 × 18432 = 396,361,728,共 3 层
路由器:256 × 7168 = 1,835,008,共 58 层
词嵌入、输出层:各 129280 × 7168 = 926,679,040

总参数 = 61 × 注意力 + 3 × 密集 FFN + 58 × (路由器 + 257 × 专家) + 词嵌入 + 输出层 + norm
       = 671,026,404,352

每个 token 实际经过的部分把“257 个专家”换成“8 个路由专家 + 1 个共享专家”:

text
激活参数 = 61 × 187.1M + 3 × 396.4M + 58 × (1.8M + 9 × 44.0M) + 2 × 926.7M
        = 37,552,282,624 ≈ 37.6B

DeepSeek-V3 的 671B 参数中 97.4% 是路由专家;每个 token 用到的 37.6B 里,8 个路由专家占 20.4B,注意力占 11.4B

图里最显眼的是两个比例。第一,路由专家占了总参数的 97.4%,模型“大”几乎全大在专家上;注意力只有 114 亿,在总量里不到 2%。第二,到了每 token 的激活参数里,注意力占了三成。这和 Llama-3.1-8B 很不一样,那里 FFN 占 70%。MoE 把 FFN 的激活量压下来以后,注意力变成了不可忽视的计算来源,这也是 DeepSeek 后来在注意力上继续做稀疏化的背景。

官方的口径略有不同:技术报告写“671B 总参数、37B 激活”,权重说明文档写激活 36.7B(含 0.9B 词嵌入和 0.9B 输出头)。按配置复算的总数和官方一致;激活数差几亿,来自统计时是否把只做查表的输入词嵌入算进去等口径。Hugging Face 页面上显示的 685B,是 671B 主模型加上 MTP 模块,下一节就讲它。

MTP:训练时多看一步,推理时拿来起草 ​

配置里的 num_nextn_predict_layers = 1 表示 V3 带一个多 token 预测(Multi-Token Prediction,MTP)模块。普通语言模型在每个位置只学“下一个 token 是什么”,MTP 让它在每个位置额外学“再下一个是什么”。

MTP 模块把主模型的最后隐藏状态和下一个 token 的词嵌入拼接,经过一个 Transformer 块和共用输出头,预测再下一个 token

以资料助手为例:主模型读完“年假怎么申请?”,在“?”这个位置输出下一个 token“根据”。MTP 模块拿到两样东西:主模型在“?”位置的最后一层隐藏状态 [1, 7168],以及“根据”的词嵌入 [1, 7168]。两者各做一次 RMSNorm(权重里叫 hnorm、enorm),拼成 [1, 14336],经 eh_proj 投影回 7168 维,再过一个和主模型结构完全相同的 Transformer 块(MLA + MoE),最后用与主模型共用的输出头预测“根据”之后的 token。训练时“根据”是真实文本里的下一个词,推理时是主模型刚预测出来的词。

这个模块的参数约 116 亿(不含共用的词嵌入和输出头,官方文档写 11.5B),检查点里它存在 model.layers.61。Transformers 的 DeepseekV3PreTrainedModel 把 model.layers.61.* 列为加载时忽略的权重,用 Transformers 直接加载时只得到 61 层主模型。

MTP 在两个阶段各有用处:

  • 训练:每个位置多一个预测目标,总损失 = 主损失 + λ × MTP 损失,λ 在前 10T token 取 0.3,之后取 0.1。论文的消融实验显示加上 MTP 后多数评测有提升;MTP 只在训练时增加计算,训练完可以整块丢掉,不影响主模型的推理。
  • 推理:留下它当投机解码的草稿。主模型每一步出一个 token 的同时,MTP 顺手猜出再下一个;下一步主模型一次验证两个位置,猜对就一步前进两个 token。论文报告第二个 token 的接受率在 85%—90%,解码速度提高到约 1.8 倍。投机解码为什么不改变输出分布、什么情况下反而变慢,见推理系列第 15 篇。

MTP 的草稿只有一个 token 深,和 EAGLE 这类可以连猜好几个的方法比,单步收益有上限;好处是不用另外训练草稿网络,接受率也高。需要推理引擎专门支持加载 layers.61,没开启时它就只是磁盘上多出的 14B 左右的权重。

FP8 训练是训练配方,不是架构 ​

V3 的 config.json 里有一段 quantization_config:fmt: e4m3、weight_block_size: [128, 128]。这说明发布的权重以 FP8 存储,因为 V3 本来就是用 FP8 混合精度训练的:矩阵乘法的输入用 E4M3 格式,激活按 1 × 128 的小块、权重按 128 × 128 的块各配一个缩放因子,主权重、优化器状态和部分敏感算子仍用更高精度。全部训练(含预训练 14.8T token、上下文扩展和后训练)用了 278.8 万 H800 GPU 小时。

这些改动决定了训练的成本和数值稳定性,没有改变网络里有哪些层、每层什么形状。同一个结构用 BF16 训练,config.json 里除了 quantization_config 什么都不用改。V3.1 把缩放因子改成 UE8M0(只有指数位的 8 位格式),也是同一类变化。FP8 的格式和分块缩放见数值精度第 04 篇,训练显存见训练系列第 03 篇。

R1 和 V3.1:同一个架构,换训练 ​

DeepSeek-R1(2025 年 1 月 20 日发布,MIT 许可证)的 config.json 和 V3 逐项相同。它是在 DeepSeek-V3-Base 上做强化学习得到的:R1-Zero 直接用 GRPO 训练,奖励只看答案对错和格式;正式的 R1 先用少量长思维链样例做冷启动 SFT,再做推理强化学习、拒绝采样 SFT 和全场景强化学习。“会先想很久再回答”是训练出来的行为,不是某个新模块带来的。完整的训练过程见训练系列第 12 篇。

V3.1(2025 年 8 月 21 日发布)同样没改结构。它在 V3 基础检查点上做了更长的长上下文扩展训练(32K 阶段 630B token、128K 阶段 209B token),再做后训练,让同一个模型通过对话模板切换思考和非思考模式:非思考模式在助手开头直接放一个 </think>。所以,“思考模式”是数据和模板约定,不需要两套权重,也不需要额外的层。

V3.2:在 MLA 上加一个闪电索引器 ​

V3 解决了 KV Cache 存不下的问题,但没解决长上下文算得慢的问题:资料助手把 10 万 token 的手册放进来,每生成一个 token,61 层的 MLA 都要和全部 10 万个位置做点积。DeepSeek-V3.2-Exp(2025 年 9 月 29 日)和正式版 V3.2(2025 年 12 月 1 日)在每层 MLA 前面加了一个闪电索引器(lightning indexer),只挑出最相关的一部分位置交给主注意力,这套机制叫 DeepSeek Sparse Attention(DSA)。

V3.2 的闪电索引器给前面全部位置打分,只把分数最高的 2048 个位置交给 MLA;索引器仍是平方复杂度但单价很低

配置里新增的三个字段说明了索引器的规模:index_n_heads = 64、index_head_dim = 128、index_topk = 2048。对照 Transformers 的 DeepseekV32Indexer:

  • 查询:复用 MLA 查询侧的 1536 维压缩向量,经 wq_b 展开成 64 个头 × 128 维;
  • 键:每个 token 只有一个 128 维的键(wk 加 LayerNorm),64 个头共用,单独缓存;
  • 打分:分数 = Σ_h w_h · ReLU(q_h · k),每个头的权重 w_h 由当前 token 的隐藏状态经 weights_proj 算出;
  • 选择:取分数最高的 2048 个位置,其余位置在主注意力里屏蔽掉。

索引器本身仍然要给每一对位置打分,计算量随长度平方增长,但它只有 64 个头、128 维,没有 softmax,还能用 FP8 算,单价比 128 个头 × 576 维的 MLA 低得多。主注意力的计算则从和长度平方成正比,变成长度 × 2048。上下文不到 2048 时它没有任何效果,选中的就是全部位置;上下文越长收益越大。

DSA 省的是计算和读取,不是存储。KV Cache 仍要保存全部 10 万个位置的潜向量,因为下一个 token 可能挑中其中任何一个;而且每层每 token 还多存一个 128 维的索引键。

这套结构不是从头训练的。V3.2 从 V3.1-Terminus 的检查点继续训练,先冻结主模型单独训练索引器,再打开稀疏选择训练全部参数,两个阶段的做法和稀疏注意力“挑错”的失效方式见第 11 篇。索引器很敏感:官方在 2025 年 11 月 17 日更正过推理示例代码,索引器里的 RoPE 应使用非交错布局,而 MLA 里用交错布局,旧代码混用会降低模型表现。这类错误不会报错,只会在长上下文评测里掉分,所以接入新的稀疏注意力实现时,要拿官方参考实现在同一批长文本上对比输出。

V4:放弃潜向量,改用压缩注意力 ​

DeepSeek-V4 预览版在 2026 年 4 月 24 日发布,V4-Pro 在 8 月 13 日正式上线,权重为 MIT 许可证。它分两个尺寸:V4-Flash 总参数 2840 亿、激活 130 亿,V4-Pro 总参数 1.6 万亿、激活 490 亿,上下文都是 100 万 token。官方说明在 100 万 token 上下文时,V4-Pro 每生成一个 token 的计算量是 V3.2 的 27%,KV Cache 是 V3.2 的 10%。

V4 的注意力不再是 MLA。读 DeepseekV4Attention 可以看到四处变化:

  • 共享 KV 的 MQA:num_key_value_heads = 1、head_dim = 512,每个 token 只算一个 512 维向量,同时当 K 和 V 用,所有查询头共享。不再有潜向量展开这一步;
  • 部分 RoPE:只在每个头的最后 64 维上加旋转;因为 V 和 K 是同一个向量,V 也带上了旋转,输出端再按查询位置反向转回来;
  • 注意力汇聚:每个头一个可学习的 sink 参数,和 gpt-oss 的做法相同(第 16 篇细讲);
  • 分组输出投影:以 V4-Flash 为例,64 个头 × 512 维拼起来有 32768 维,直接投影到 4096 维太贵,V4 把头分成 8 组(o_groups),每组先投影到 1024 维(o_lora_rank),再合并到隐藏维度;V4-Pro 是 128 个头分 16 组。

真正支撑百万上下文的是 KV 的压缩方式。每一层都保留最近 128 个 token 的原样 KV(滑动窗口),更早的内容按层类型分两种处理:

DeepSeek-V4 的 CSA 层每 4 个 token 压成一个条目并由索引器挑选,HCA 层每 128 个 token 压成一个条目并全部参与注意力,两者都保留最近 128 个 token 原样

  • CSA(Compressed Sparse Attention):每 4 个 token 用可学习的门控加权合成一个 512 维条目,相邻窗口有重叠;再由一个和 V3.2 同类的闪电索引器从这些条目里挑 top-k(Flash 512 个、Pro 1024 个)。
  • HCA(Heavily Compressed Attention):每 128 个 token 合成一个条目,窗口不重叠,不做挑选,所有条目都参与注意力。

config.json 里的 compress_ratios 列出每层用哪种:0 表示只有滑动窗口,4 是 CSA,128 是 HCA。V4-Flash 的 43 层是“2 层纯滑动窗口 + CSA、HCA 交替”,共 21 层 CSA、20 层 HCA;V4-Pro 的 61 层是“2 层 HCA + CSA、HCA 交替”,共 30 层 CSA、31 层 HCA。

可以用每 token 新增的缓存量粗算一下为什么 KV 能降到一成。滑动窗口每层固定 128 个 token,不随上下文增长,百万 token 时可以忽略;随长度增长的部分(按元素个数估算,不考虑各部分存储精度的差别):

text
V3.2:61 层 × (576 + 128 索引键) = 42,944 个数 / token
V4-Pro:30 层 CSA × (512 ÷ 4 + 128 ÷ 4 索引键) + 31 层 HCA × (512 ÷ 128)
      = 30 × 160 + 31 × 4 = 4,924 个数 / token
比值 ≈ 11.5%

这个粗算和官方的 10% 在同一量级。代价也很直观:远处的内容只剩压缩后的摘要,HCA 层里 128 个 token 只剩一个向量,要靠 CSA 层的索引器和每层的滑动窗口去补细节。反过来,短对话里这些机制几乎用不上:128 个 token 以内,每层看到的就是全部原文;几千 token 时,压缩条目也只有几百(CSA)到几十个(HCA)。

FFN 和残差也有变化。V4 的每一层都是 MoE,没有密集层(V3 有 3 层);Flash 每层 256 个路由专家、Pro 384 个,都只选 6 个,外加 1 个共享专家。前 3 层改用哈希路由:选哪些专家由一张按 token 编号固定的表 tid2eid 决定,不再由路由器学习,路由器只负责给选中的专家算权重。其余层仍用无辅助损失偏置,打分函数从 sigmoid 换成 sqrtsoftplus(softplus 再开方),不再分组限制。残差连接换成 mHC(Manifold-Constrained Hyper-Connections):每个 token 的残差流从一条扩成 hc_mult = 4 条并行的流,进入注意力或 FFN 前加权合成一条,出来后再分回 4 条,流之间的混合矩阵用 Sinkhorn 迭代约束成双随机矩阵,防止信号在几十层里被放大。残差流的基本概念见第 06 篇。

按配置复算,V4-Flash 总参数约 2843 亿、激活约 138 亿(不含词嵌入和输出层约 127 亿),V4-Pro 总参数约 1.573 万亿、激活约 498 亿,和官方数字一致。发布的权重里路由专家用 FP4 存储、其余大部分用 FP8。V4 同样带 1 层 MTP,但 Transformers 的实现不实例化它(配置说明里写明“not instantiated here”)。训练上 V4 改用 Muon 优化器,这属于训练配方。

2026 年 9 月发布的 V4.1-Flash 在模型卡上描述了更多结构改动(因果编码器-解码器、跨层共享 KV、Engram 条件记忆等),但 Transformers 5.21.0 里还没有对应的模型实现,这里不展开。

各代规格 ​

V2V3(R1、V3.1 相同)V3.2V4-FlashV4-Pro
发布2024-052024-122025-09(Exp)/ 2025-122026-04(预览)2026-04(预览)/ 2026-08 正式
总参数 / 激活236B / 21B671B / 37B671B / 37B284B / 13B1.6T / 49B
层数 · 隐藏维度60 · 512061 · 716861 · 716843 · 409661 · 7168
注意力MLA,128 头MLA,128 头MLA + 索引器 top-2048共享 KV 的 MQA,64 头 × 512共享 KV 的 MQA,128 头 × 512
每层每 token 缓存576 个数576 个数576 + 128 索引键窗口 128 + CSA 128 或 HCA 4同左
路由专家 / 共享 / 每 token 选160 / 2 / 6256 / 1 / 8256 / 1 / 8256 / 1 / 6384 / 1 / 6
密集 FFN 层前 1 层前 3 层前 3 层无(前 3 层哈希路由)无(前 3 层哈希路由)
路由打分 · 均衡softmax · 辅助损失sigmoid · 偏置sigmoid · 偏置sqrtsoftplus · 偏置sqrtsoftplus · 偏置
MTP无1 层1 层1 层1 层
上下文128K128K128K1M1M
词表102,400129,280129,280129,280129,280
许可证DeepSeek 模型许可代码 MIT、模型许可协议(R1 起为 MIT)MITMITMIT

表里的参数量是官方公布的取整数,配置复算的精确值见正文。

DeepSeek 这几代的主线很清楚:V2 用 MLA 把 KV Cache 压到每层 576 个数,用细粒度专家加共享专家把 FFN 稀疏化;V3 把专家放大到 256 个、用分组路由封住通信量,用不经梯度的偏置代替辅助损失做均衡,再用 MTP 同时服务训练和投机解码;R1 和 V3.1 证明同一副骨架靠训练就能长出推理和混合思考能力;V3.2 和 V4 则在注意力的计算和存储上继续做减法,从“挑 2048 个位置”走到“远处只存压缩摘要”。读新的 DeepSeek 检查点时,先比 config.json 里的 kv_lora_rank、index_*、compress_ratios、n_routed_experts 这几组字段,就能判断它属于哪一代结构。下一篇换到 Mistral、Gemma、GLM、Kimi、gpt-oss 和 MiniMax,看其他开源模型在同样的问题上做了哪些不同的选择。

别急,先让缓存热一下。