DeepSeek-V4.1 模型结构(4):深度维度,Single-Pass mHC

DeepSeek-V4.1 模型结构(4):深度维度,Single-Pass mHC

💡 原文中文,约14300字,阅读约需34分钟。
📝

内容提要

文章分析 DeepSeek-V4.1 的 Single-Pass mHC 优化:mHC 开销主要在访存而非计算,下界为 (2n+2)d,V4 实现达两倍。V4.1 让读算子改用上一子层算好的权重,将残差更新、输入混合、系数预测合并为一遍,访存量从 20d 降至 10d,减半。代码有三处变化,训练需从头使用新式,部署用 Mega-mHC kernel。

🔎

延伸解读

访存优化:从计算瓶颈到带宽瓶颈

mHC 的额外操作计算量很小,但需要反复读写残差流,成为显存带宽瓶颈。文章通过分析子层边界上的最少读写次数,得出访存量下界为 (2n+2)d。V4 的实现因 kernel 拆分导致重复读写,访存量达到 (4n+4)d,是下界的两倍。这提醒我们,在模型优化中,访存效率往往比计算量更关键,尤其是当操作涉及大规模激活值时。

Single-Pass mHC 的核心:权重延迟一拍

V4.1 将读算子使用的权重从本子层改为上一子层提前算好的权重,从而将残差更新、输入混合和系数预测合并为一遍,访存量降至 (2n+2)d,达到理论下界。这一改动仅调整了权重来源的下标,却消除了对当前子层系数预测的依赖,使 kernel 融合成为可能。代价是读权重基于旧状态,但文章指出静态部分无损,动态部分仅少看一个子层输出,影响有限。

训练与部署的差异:模型改变与 kernel 支持

Single-Pass mHC 改变了模型计算方式,因此必须从头训练,不能直接加载 V4 权重。训练时仍可使用原多 kernel 实现,因为每个 kernel 的功能未变。部署时则依赖 Mega-MHC kernel 实现融合,将访存量减半。参考实现未做融合,访存量与 V4 相同,实际收益需在部署环境中体现。这提示读者区分模型结构改动与工程优化。

代码实现的三处关键调整

官方代码中,读权重通过参数在子层间传递:注意力算出的权重给同层 MoE 用,MoE 算出的权重传给下一层注意力。第 0 层注意力使用固定权重 (1,0,0,0),因初始四条流相同,不损失信息。输出头不再单独预测系数,直接复用第 39 层 MoE 留下的读权重。这些改动在论文中未提及,但体现了权重复用的一致逻辑。

❓

Q&A

DeepSeek-V4.1 的 Single-Pass mHC 优化主要解决了什么问题?

Single-Pass mHC 优化主要解决了 mHC 中访存量过高的问题。通过让读算子改用上一个子层算好的权重,将残差更新、输入混合、系数预测合并为一遍,访存量从 20d 降至 10d,减半。

mHC 的访存量下界是多少?V4 的实现为什么是下界的两倍?

访存量下界是 (2n+2)d,n=4 时为 10d。V4 的实现将操作拆成三个 kernel 加 pre-norm,导致残差流被多次读写,总访存量为 (4n+4)d,即 20d,是下界的两倍。

Single-Pass mHC 如何将访存量从 20d 降低到 10d?

Single-Pass mHC 让读算子使用上一个子层算好的权重 Al-1,使得每个 tile 的 Xl 一算出来就能同时进行输入混合和系数预测累加,从而将残差更新、输入混合、系数预测和 pre-norm 合并为一遍,读写各一次,总访存量等于下界 (2n+2)d。

Single-Pass mHC 在代码实现上有哪三处变化?

代码中有三处变化:1) 读权重沿着子层往后传,hc_pre 拆分为 hc_mixes 和 hc_pre;2) 第 0 层注意力使用固定权重 (1,0,0,0);3) 输出头不再有自己的系数预测,直接使用第 39 层 MoE 留下的 ffn_pre。

Single-Pass mHC 对模型效果有什么影响?

论文称性能损失可以忽略。静态部分没有损失,动态部分少看了一个子层的输出,但读权重初始化时 α 很小,动态部分影响有限,因此整体效果损失很小。

部署时 Mega-mHC kernel 的作用是什么?

Mega-mHC 是部署时的一个融合 kernel,将残差更新、输入混合、系数预测合并成一个 kernel,放在 DeepGEMM 中。它支持两种模式:跑 V4 的 mHC 时访存量 (3n+2)d,跑 Single-Pass mHC 时访存量 (2n+2)d。

🏷️

标签

➡️

继续阅读