← 论文沉淀 / 🧠 LLM通用 · ·arXiv (Tech Report)

On the Design of Qwen3.8-Next Architecture: Evaluation, Efficiency, and Training Stability

Zihan Qiu, Zekun Wang, Xiao Li, Yanpeng Li, Yang Xu et al.(Qwen Team,34 人)

Alibaba Qwen Team

Qwen3.8-Flash-Next 的架构消融报告:125B 总参 / 6B 激活的稀疏 MoE,另加 51B 放在 host memory 的 n-gram embedding 表。核心方法论主张是「loss、下游指标、训推成本、训练稳定性是同一个设计问题」——每个候选改动都必须沿这三条轴同时评估,而不是只看 loss。四个组件承担设计:GDN + 全注意力 3:1 层间混合、微块粒度压缩索引的 Qwen Sparse Attention、把残差流拓宽到 4 路并逐通道门控读取的 Gated Residual、以及 Layer 2 的单层 n-gram embedding。配 Muon 优化器与重新拟合的超参 scaling law,用 1/3 激活参数、1/3 训练 token、约 1/9 训练 FLOPs 追平上一代 397B-A17B 旗舰。

Hybrid Linear AttentionSparse AttentionResidual DesignMuon OptimizerTraining Stability
📝 我的备注
加载中…

核心思路

要解决的问题:上一代 Qwen3.7-Plus 是 397B 总参 / 17B 激活的稠密 MoE 旗舰。目标是在只花约 1/9 训练 FLOPs 的前提下把它的质量保住,同时把推理成本压下来。

关键 idea(这篇报告真正的贡献不是某一个模块,而是评估方法论):一个架构改动同时动三件事——下游能力、训推成本、以及「这个 run 还能不能稳」。所以每个候选改动都沿三条轴评估:

  1. loss 连同 downstream benchmark(不是只看 loss);
  2. 训练 / prefill / decode 三个阶段分开算成本(不是只报一个 FLOPs 数);
  3. 对最优超参和训练稳定性的影响。

报告反复强调「loss 与下游准确率不总是同向移动」,并且双向都有反例:

现象lossbenchmark
扩大 n-gram 词表单调下降饱和甚至波动
把 residual 读写权重做成数据相关只降 0.002+1.98 分
每 block 只读 gate 最高的 2 个 residual 分支几乎无损后训练阶段明显退化
全注意力层去掉位置编码(NoPE)预训练期不可区分后训练后大量不终止生成

后两条尤其关键:它们在预训练指标上完全看不出来,只在后训练/生成阶段暴露。作者的结论是——只看预训练 loss 会做出错误决策,而这类错误在生产规模上代价极高。

最终配置:125B 总参 / 6B 激活 MoE + 51B off-accelerator n-gram embedding 参数。


整体实现思路

Qwen3.8-Flash-Next 总体架构

端到端数据流:

Input tokens
  → Vocabulary Embedding
  → [ 每 4 层一个 block ]  ×  N
        3 × GDN Layer      (线性递归,固定大小状态)
        1 × QSA Layer      (全注意力,CPT 后换成稀疏注意力)
        每个 sublayer(token mixer / MoE) 都通过 GR Read/GR Write
        与 4 路加宽残差流交互
  → Layer 2 额外插入 N-gram Embedding Layer
        (表放 host memory,异步 prefetch,与 Layer 1 计算重叠)
  → 顶部 GR Read(与 LM head 前的最终归一化融合成一次门控读)
  → Prediction Head  /  MTP Modules(复用 QSA 的 top-k 索引)

训练分两个大阶段:

  • 预训练:全注意力层就是普通 softmax 注意力(带 RoPE),4K → 32K 逐步拉长;
  • 持续预训练 CPT:序列长度 256K,把所有全注意力层(含 MTP 模块内的)替换成 QSA,分 dense distillation → sparse training 两小阶段。

四个组件各自解决一个瓶颈:

组件解决的瓶颈代价
GDN / 全注意力 3:1 混合注意力二次复杂度 + KV cache 线性膨胀GDN 是有限状态记忆,无法精确复现 token 级检索 → 用 1/4 全注意力层兜底
QSA长上下文下 indexer 本身 的 O(n²) 开销需要一个 CPT 阶段来蒸馏 + 适配
Gated Residualpre-norm 衰减信号:每层读同一条流,早期写入的特征要和后面所有东西竞争加宽后多 n_r 倍残差状态的显存搬运
N-gram Embedding想加容量但不想加每 token FLOPs表巨大,必须放 host memory

子模块实现(可复现细节)

模块 A — Gated DeltaNet 混合层

输入/输出:归一化后的残差流输入 x_t ∈ R^d → token mixing 输出 o_t ∈ R^d。

递归状态:每个 head 维护 S_t ∈ R^{d_k × d_v}(注意这是原 GDN 论文状态约定的转置)。gated delta rule:

S̃_{t-1} = α_t · S_{t-1}                    # 全局衰减
e_t      = v_t − S̃_{t-1}ᵀ k_t              # 「已存的值」与目标值之差
S_t      = S̃_{t-1} + β_t · k_t e_tᵀ        # 只写残差误差
y_t      = S_tᵀ q_t

等价紧凑形式:

S_t = (α_t·I − β_t·k_t k_tᵀ) S_{t-1} + β_t·k_t v_tᵀ

两个门分工不同:α_t ∈ (0,1) 控制既有状态的整体寿命,delta 项则先估计 k_t 已经关联到的值、只写入残差误差。因此重复或相似的 key 会去更新已有关联,而不是无界地累加外积——这是 GDN 区别于纯加性线性注意力的关键。

参数化(可直接照抄复现):

q_t = L2Norm(SiLU(ShortConv(W_q x_t)))     # 短因果深度卷积 → 局部归纳偏置
k_t = L2Norm(SiLU(ShortConv(W_k x_t)))     # L2 归一化界定 q/k 幅度,稳住 rank-1 delta 转移
v_t = SiLU(ShortConv(W_v x_t))

β_t = σ(W_β x_t)                                        # 写入强度
α_t = exp[ −exp(A) · softplus(W_α x_t + b_α) ]          # 数据相关衰减,A 为可学标量

o_t = W_o [ σ(W_z x_t) ⊙ RMSNorm(y_t) ]                 # 注意:sigmoid 输出门,不是原版的 SiLU

三处与原 GDN 不同的工程选择:

  • 输出门用有界 sigmoid 而非 SiLU,实验中一致更好(这与 GR、注意力模块的结论一致:有界正门 > tanh / SiLU,是全文反复出现的模式);
  • zero-centered RMSNorm(沿用 Qwen3-Next),约束 RMSNorm 权重增长,全模型所有 RMSNorm 统一用这个形式;
  • 全注意力层保留 RoPE。NoPE 变体在预训练期与 RoPE 几乎没有区别,但后训练后不终止生成(endless generation)的比例显著更高——典型的「预训练指标看不出来」的坑。

层间配比:每 4 层里 3 层 GDN + 1 层全注意力。周期性全注意力对长上下文尤其重要。

kernel:自研 FlashQLA(TileLang 融合线性注意力 kernel 库),相对 FLA Triton kernel 前向 2–3×、反向约 2×。已开源。

消融(28 层 25B-A3B MoE,400B tokens @4K + 80B tokens @32K,SWA 窗口 128):

架构MMLUMMLU-ProSuperGPQAMATHGSM8KBBHMMMLUEvalPlusMultiPL-EAvg.
Full attention62.6537.5921.7649.4075.1363.7847.7451.0139.7349.87
SWA hybrid66.3040.6722.4545.4874.2265.8851.3352.1241.9351.15
GDN hybrid66.2642.8223.4553.9877.0768.7254.8349.7147.4853.81

GDN hybrid 在 9 个 benchmark 中赢过 Transformer 8 个、赢过 SWA hybrid 7 个。


模块 B — Qwen Sparse Attention (QSA)

QSA 结构:压缩轻量 indexer + 微块稀疏核心注意力

动机:DSA 这类方法用轻量 indexer 生成 token 级稀疏 mask,推理确实快了,但 indexer 自身仍是 O(n²),序列一长它就成了新瓶颈。QSA 的做法是先把序列压缩再打分,让索引开销本身随序列长度下降。

压缩轻量 indexer(MQA 结构,H=4 个 query head + 1 个共享 key head):

q̂_i^h = RMSNorm(W_Q^h x_i)                # 每 head 独立轻量投影
k_i    = W_K x_i                          # 共享 key

key 按 r 个 token 一块非重叠切分,均值池化压缩(p_b = b·r 为块起始位置):

k̂_b = RMSNorm( AvgPool(k_{p_b : p_b+r-1}) ),    0 ≤ b < ⌊n/r⌋

顺序很关键:先压缩、后加位置编码。

q_i^h = PRoPE(q̂_i^h, i)        # query 保留自己的 token 位置 i
k̄_b   = PRoPE(k̂_b,  p_b)       # 压缩 key 用块起始位置

partial RoPE 只作用于 indexer head 128 维中的 64 维(与核心注意力的 rotary 维度对齐)。如果先加 RoPE 再池化,等于把不同旋转相位的 token 表示平均掉——这个 ordering 是设计要点。

块级重要度打分(block-causal,只对已完整观测到的块打分):

I_ib = Σ_{h=1..H} ReLU( ⟨q_i^h, k̄_b⟩ )     若 p_b + r − 1 ≤ i
     = −∞                                    否则

选块:给定 token 预算 K,块预算 K_B = ⌈K/r⌉,B_i = TopK_{K_B}({I_ib})。选中的块 expand 回原始 token 索引并截到预算 K,再并上最后一个不完整块里的 tail token(永远包含):

S_i = Expand(B_i) ∪ { r·⌊(i+1)/r⌋, ..., i }

生产配置:K = 2048,r = 4 → 每个 query 选最多 512 个完整块 + tail token。

两阶段训练(在 CPT 阶段做,序列长度 256K):

  • Stage 1 — Dense Distillation:teacher 分布 = backbone 所有 head 的 softmax 注意力分布求和后 L1 归一化,得到 token 级 a_i ∈ R^n。用 MaxPool(不是 AvgPool)对齐到块级,避免显著 token 信号在聚合中被稀释:

    ā_ib = MaxPool(a_{i, p_b:p_b+r-1}),    â_i = ā_i / ‖ā_i‖₁
    L_KL = (1/N) Σ_i D_KL( â_{i,:} ‖ Softmax(I_{i,:}) )
    

    只训 indexer,1000 步,lr 1e-3,每步 8 条 256K 序列 ≈ 2B tokens。KL loss 只统计完整 key block。

  • Stage 2 — Sparse Training:backbone + indexer 联合训练,让骨干适配稀疏模式。KL 只在 top-K_B 块上算,且 teacher 概率在 B_i 内重归一化到和为 1:

    L_KL = (1/N) Σ_i D_KL( â_{i,B_i} ‖ Softmax(I_{i,B_i}) )
    

    8000 步,lr 2.5e-5,每步 96 条 256K 序列 ≈ 200B tokens。

工程实现:融合 QSA kernel 同时算稀疏注意力输出和 KL loss,不物化中间结果,显存大幅下降;多步 MTP 跨预测步复用 top-k 索引。

复杂度:压缩比 r 把 indexer 从 O(n²) 降到 O(n²/r)。

结果 — 通用能力(Qwen3.8-Flash-Next 全尺寸):

MethodMMLU-ProSuperGPQAMATHGSM8KBBHMMMLUEvalPlusMultiPL-EAvg.
Full Attn72.951.769.891.090.481.870.878.475.9
w/ QSA73.752.171.692.291.681.172.379.876.8

结果 — 长上下文检索(这是最有意思的部分:QSA 越长越赢):

MethodRULER ≤128K128–256K256–512K512K–1MMRCR 128K256K512K1MAvg.
Full Attn99.8499.8197.6590.0897.1494.2030.6620.7178.76
w/ QSA99.8999.6298.9593.0095.9893.0040.5326.4480.93

MRCR 512K 从 30.66 → 40.53,1M 从 20.71 → 26.44。稀疏不仅没有牺牲检索,反而在超长区间帮助了模型(可以理解为过滤掉了噪声上下文)。

MTP 复用索引无损(4 步投机解码平均接受长度):full attn 4.06 → QSA 4.07。

效率:1M 上下文下,注意力模块 prefill 7.6×、decode 4.9×(含 indexer 成本,dense 基线是 FlashInfer 的 paged GQA);单看 indexer 是 3.8× / 4.4×。从 64K 起就有加速,越长增益越大。

消融:

  • 压缩比:block=4 是最优点。QSA 在相对 indexer latency 0.25 时就追平全注意力,而跨层共享索引的 IndexShare 到 0.5 仍不及基线——因为混合架构里全注意力层被 3 层 GDN 隔开,层间相似度低,跨层共享索引不成立;层内压缩不依赖这个假设。
  • indexer head 数:4 个足够(远少于核心注意力)。注意 dense 蒸馏后直接上稀疏会明显掉点,必须有 Stage 2 的联合训练让骨干适配。

模块 C — Gated Residual (GR)

动机:pre-norm 保证了大规模训练稳定,但它衰减每层收到的信号——所有 block 读同一条流,早期写入的特征要和之后写入的所有东西竞争。已有工作分两派:一派让读写更有表达力(highway 系),一派把流本身加宽(AltUp / Hyper-Connections)。两者互补:加宽提供容量,读写机制决定容量怎么花。

先量化「只加宽」值多少:用适配 pre-norm 的简化 AltUp,残差状态是 R ∈ R^{n_r × d},每 block 持 n_r 个可学标量 h:

x     = Σ_i h_i · R_i                              # 读:加权和
R_i'  = R_i + 1[i = ℓ mod n_r] · y                 # 写:按深度 round-robin 写单支

只多 n_r 个参数、零矩阵乘,25B-A3B / 400B tokens 上 loss 就降了约 0.01。

GR 的具体设计(n_r = 4,注意力 block 和 MLP block 各有一个独立的 GR 模块):

  1. 每支独立归一化(各自 gain γ_i ∈ R^d):

    R̂_i = RMSNorm(R_i ; γ_i),    i = 1..n_r
    
  2. 逐通道门控读(从所有分支预测,低秩瓶颈 r = d/8):

    G = unvec( σ( W_u · SiLU( (1/n_r) · W_d · vec(R̂) ) ) ) ∈ R^{n_r × d}
    x = (1/n_r) Σ_i  G_i ⊙ R̂_i
    

    其中 vec 把 n_r 支堆成长度 n_r·d 的向量,W_d ∈ R^{r × n_r d},W_u ∈ R^{n_r d × r}。

  3. 每支一个数据相关标量写:

    s   = 2·σ( (1/n_r) · W_w · vec(R̂) ) ∈ R^{n_r},   W_w ∈ R^{n_r × n_r d}
    R_i' = R_i + s_i · y,    其中 y = F(x)
    
  4. 丢掉分支混合算子 H_res,并且 GR 直接取代 block 的 pre-normalization(读本身已经归一化+门控了),所以加宽没有引入任何额外的 norm 层。用标准随机初始化即可,不需要特殊初始化,static 项贡献可忽略。

这个「读」的形式其实就是作者另一篇工作里的 GatedNorm 作用在加宽流上:

GatedNorm(u) = RMSNorm(u) ⊙ σ( W₂ · SiLU( W₁ · RMSNorm(u) ) )

5 条消融结论(这是模块设计的全部依据):

  1. 有界正门:sigmoid 优于 tanh,loss 和稳定性都是(与 GDN / 注意力的结论一致)。
  2. 数据相关性:让 H_mix / H_combine 数据相关,loss 只降 0.002,但 benchmark 涨 1.98 分;而 static 加宽相对 pre-norm 是 loss 降 0.021、benchmark 涨 1.58。两者比例完全反过来——这是全文最有说服力的「不能只看 loss」证据。
  3. 读的粒度比写的粒度重要:把 H_mix 从「每支一个标量」细化到「每支每通道一个权重」有明显收益;对 H_combine 做同样细化几乎没用 → 读逐通道,写保持每支标量。
  4. 读所有分支:优于只读最后一支或先池化;再对每支单独归一化(group RMSNorm)还有额外收益。
  5. H_res 基本没用:读写足够有表达力后,n_r × n_r 混合算子无显著提升 → 直接砍掉,每 block 省一次残差状态的完整读(这正是加宽流的主要推理成本)。

消融数据(25B-A3B MoE,560B tokens,n_r = 4):

ResidualLossMMLUMMLU-ProSuperGPQAMATHGSM8KBBHMMMLUEvalPlusMultiPL-EAvg.
Pre-norm1.61764.2938.4021.7853.9277.4164.7351.2649.2537.1550.91
mHC (static)1.59664.6243.6922.2055.0878.0565.4252.7849.5940.9452.49
mHC (dynamic)1.59466.1145.8424.2059.5478.5166.0156.6152.1641.3054.47
GR1.59066.6946.0223.8061.1878.2066.5456.1951.3642.0054.66

与 Attention Residual 对比(28 层 = 56 sublayer,GN = GatedNorm):

Residual designLossLoss + GN
Pre-norm1.7891.787
Block AttnRes, S=41.7731.768
Block AttnRes, S=21.7701.766
Full AttnRes1.7621.758
GR (n_r=4)—1.762

GR 与最强的 Full AttnRes 打平;48 层时 GR 1.707 vs Block AttnRes(S=4) 1.711。GatedNorm 在每个设置上都降 loss,且读到的输入越复杂增益越大。

机制分析:这 4 条分支到底被拿去做什么了?

因为 GR 没有分支混合,每支就是过往输出的纯累加器,可以精确分解每个 block 读到了什么:

R_c^(v) = R_c^(0) + Σ_{u<v} s_c^(u) · y^(u)                      # 分支 c 在 block v 前的内容

a_{u→v} = (1/n_r) Σ_c  G_c^(v) ⊙ γ_c ⊙ [ s_c^(u) y^(u) / rms(R_c^(v)) ]    # block u 对 block v 输入的贡献

π_uv = ‖a_{u→v}‖ / Σ_{u'<v} ‖a_{u'→v}‖                          # 归一化份额(分解精确到 3e-8)

再与「除了没有 GR 之外完全相同」的参考模型对比 Δ_uv = π_uv^GR − π_uv^ref:

GR 新增的跨层通路:一支走长程,三支走局部

结论非常干净:

  • 恰好一支承担长程(典型 skip 10.9 层),另外三支保持局部(3.4–3.9 层)。5 个 GR checkpoint 全都是这个模式,哪一支无所谓(初始化时可交换)。
  • 长程支的机制直接来自公式:它在 layer 0 被重写入一次,之后几乎不再更新,于是 layer-0 的信息对之后所有层都保持可达。
  • 最主要读取 GR 分支的是 softmax 注意力层——全局注意力充当整合显式长程历史的枢纽,而这些历史正是 GDN 层压缩掉的那部分。
  • 具体数字:layer 0 GDN → layer 15 attention 的份额从参考模型的 0.020 涨到 0.138(layer 15 有 30 个 writer,均分是 0.03,所以 0.138 是均分的 4.6 倍),且在 layer 10–19 的每个 reader 上都保持 0.072–0.138 无下降趋势;layer 10 GDN → layer 11 attention 的 Δ_uv = 0.117(短程也在被加强);layer 0 MLP 同时在长程支上打到 layer 15(0.008→0.058)和在局部支上打到 layer 2(0.139→0.192)——同一个输出以不同强度到达远近两个 reader,这是单条残差流根本表达不了的(它对每个 writer 只有一个衰减率)。
  • 按 skip 分组求和:skip=1 的通路总共 +0.96,skip>12 的 +0.91,skip 2–12 的 −3.21;加权平均 skip 几乎不变(3.97 vs 3.91)。跨层信息总量没变,变的是分布——GR 挑出少数通路并放大,代价是中程通路。

推理效率优化(加宽流的成本就是残差状态的显存搬运,所以目标是少搬字节):

  • ❌ 稀疏读:训练好的模型里每层 GR 的写通常由 2 支主导,于是尝试只读 gate 最高的 2 支(从头训 / 训练中途切都试了)。预训练 loss 和 benchmark 几乎无影响,但后训练之后质量明显退化;逐层变化稀疏度等更复杂变体也没解决。报告明确写:这是一个只看预训练指标就会做出错误决策的案例。
  • ✅ FP8 存残差状态:GR、gated attention、GDN 里的门都界定了写入流的幅度,残差值范围窄,天然适配低精度。相对 BF16 搬运字节减半,质量几乎无损。
  • ✅ kernel 融合:读(公式 30–32)和写(公式 33–34)各融成一个 kernel,group RMSNorm 折进读里,每 block 每方向只遍历一次加宽流。

模块 D — N-gram Embedding

思路:以每个 token 结尾的短 n-gram 作为 key 去查嵌入表,取回的向量增强对应 token 表示。相比 unigram 查表,它把记忆检索条件在局部上下文而非只看 token 身份。用 multi-head hashing 查表,通过 contextual gating 注入残差流。因为寻址是确定性的,表可以放 host memory 并异步 prefetch,参数量涨而每 token FLOPs 和延迟几乎不涨。全部实验用 300 TPP(tokens per active parameter)。

放置消融(固定 n-gram 参数总量):

Layer IndexLossMMLUMMLU-ProMATHGSM8KBBHAvg.
w/o N-gram emb.1.58562.7833.4332.5259.2153.4045.44
1st1.54164.1935.2536.2065.7356.0047.30
2nd1.54164.7135.8037.3264.0057.5647.94
15th1.54365.0734.9536.1263.5057.1547.37
25th1.54164.7035.1536.2663.3155.7347.40
2nd + 25th1.54064.9435.4037.4064.3357.7947.75

结论:没有哪个深度区间稳定占优;把同样预算分散到多层没有一致收益;单层就够。放置选择对注意力机制类型也不敏感(full attn 和 GDN 下相对排序相似)。最终选 Layer 2,让 host-memory prefetch 与 Layer 1 的计算重叠。

词表规模消融 A — 固定总参数预算(扩 n-gram 就减 MoE expert,V = 基础 tokenizer 词表 250K):

Vocab Scale (Param Ratio)LossUncheatable PPLMMLUMMLU-ProMATHGSM8KC-Eval
None (0%)1.2025.5568.2544.3846.0274.7970.78
5× (10%)1.2005.5468.1544.4945.6472.8670.93
10× (25%)1.1975.5567.7144.6646.5673.6570.71
30× (50%)1.2015.5967.7542.6144.6274.4572.49

loss 在 10× 处非单调取到最低,但这个最优点在其他评测上完全看不到:out-of-domain uncheatable PPL 基本不动,下游 benchmark 相对纯 MoE 基线没有明显提升。作者由此判断 n-gram embedding 与 MoE expert 在扩容量上扮演的是不同角色,不该互换预算,后续实验改为固定 MoE 预算。

词表规模消融 B — 额外加参数:

Vocab ScaleLossMMLUMMLU-ProMATHGSM8KBBHC-EvalCMMLU
None1.58562.7833.4332.5259.2153.4066.9168.10
20×1.55364.1434.4637.3865.0957.1371.7572.29
50×1.54164.7135.8037.3264.0057.5672.1272.48
100×1.53464.7035.8736.9863.0856.0373.7572.73
200×1.52664.8535.2135.3462.9656.2374.9473.24

loss 随词表单调下降(1.585 → 1.526),但下游在 50× 之后就饱和甚至波动——这是摘要里点名的第一个「loss 与 benchmark 不同向」案例。唯一一个跟着单调涨的是中文 benchmark(C-Eval 66.91 → 74.94,CMMLU 68.10 → 73.24),这个信号本身值得注意。

其他尝试(token 归一化压词表、按 n-gram 阶非均匀分配、按频率划分 slot)在他们的训练配方下都没有一致收益。

最终生产配置:51B n-gram embedding 参数,全部放在加速器之外。


模块 E — Muon 优化器的工程细节

正交化:对 Nesterov 加速动量(μ=0.95)做 Newton–Schulz 迭代,结果按 γ(A,B) = 0.2·√(max(A,B))(形状 A×B)缩放,使更新的 RMS 与矩阵形状无关。NS 系数用 Polar Express 的逐步 schedule(给定步数预算下 minimax 最优),迭代步数设 8(比更少步正交化更准,并且在压测里降低了梯度范数尖峰的幅度和频率),NS 前 Frobenius 归一化的数值稳定常数取 1e-14。

哪些参数用 Muon(只给真正充当线性映射的二维权重):

用 Muon用 AdamW理由
注意力 q/k/v/o 投影input embedding、output head正交化不适用/无益
GDN 输入/输出投影MoE routerMuon 加剧早期波动并破坏 router 稳定;中后期加也无收益。可能解释:router 每个输出维对应一个 expert 的分数,各维基本独立,没有可供正交化利用的共享线性结构
routed + shared expert 的 fc1/fc2GR 的两个低秩投影形状过于扁长
n-gram embedding 的 key/value 投影GDN 的 decay / beta 投影每 head 出一个标量,本质是向量,正交化无意义
—输出门(注意力输出门、GDN 的 z 投影)消融显示 AdamW 持平或略好
—n-gram embedding 表(Adam,关掉 weight decay)—

拆分融合参数(关键正确性问题):Megatron-LM 里 attention qkv 投影、SwiGLU fc1、GDN 输入投影各存成一个融合矩阵,但语义上是沿输出维拼接的独立线性算子。直接正交化融合矩阵错两次:(1) 迭代会跨不相关子块混合奇异方向;(2) γ(A,B) 用的是拼接后的形状而非真实算子形状。

做法:正交化前拆开融合梯度 → 每个子矩阵独立跑 NS → 结果 gather 回原布局再 apply。

  • qkv 和 GDN 输入投影按 per-head 粒度拆 → loss 和 benchmark 都改善;
  • fc1 拆成 gate / up 两半 → loss 基本不变,benchmark 略涨;
  • 拆分还顺便提供了把个别子矩阵排除出 Muon 的天然粒度。

分布式实现(两个真实痛点):

  1. NS 迭代需要对完整参数矩阵做整体更新(K 步约 4K·max(A,B)·min(A,B)² FLOPs),与 Megatron 分片冲突:TP 下没有任何 rank 持有完整权重;DP 下开销是短边的三次方,Megatron 的等元素数划分会造成严重长尾。 → 自研 Canzona:把逻辑上的 optimizer 归属与物理参数布局解耦。α-balanced 静态分区器以整个参数为单位重新分配(不切进张量内部),按估计的 NS FLOPs 均衡各 DP rank;异步 Micro-Group 流水通过融合 All-to-All 跨 TP rank 重建每个 Muon 拥有的矩阵。每个 owner 跑的这一步在数学上等价于单卡 Muon;ZeRO-1 的 bucket 几何保持不变,因此 Megatron 的 Reduce-Scatter / backward overlap 仍然生效。
  2. 拆分之后一层贡献上百个子矩阵,optimizer step 变成一长串极小 kernel,瓶颈是 launch overhead 而非算术。 → 整个 step 用 CUDA graph 捕获。

模块 F — 超参 scaling law 重拟合

为什么要重拟合:最优 lr 和 batch size 同时依赖架构与优化器,两者都换了,上一代的配方就不再最优。而且新组合训练明显更稳,说明有空间往更激进的方向调。

新拟合的结论:更大的 batch size、更大的 learning rate,且 lr 随模型规模衰减更慢。作者分开验证两个预测,各自选一个能把该效应放大的场景:

验证 1 — batch size(小模型 + 大 token 预算,过大 batch 最容易露馅):20 层 10.8B-A0.89B MoE,4T tokens,每个配置用 scaling law 给它自己的 lr,同 token 预算即同算力。

Batch size最后 20B tokens 平均 loss
B = 12.6M(上一代配方)1.5774
B = 25.2M(新拟合预测最优)1.5702
B = 37.7M(预测的 1.5×)1.5707

新拟合比旧配方好 7.2e-3;再放大 1.5× 只有 4.3e-4 的惩罚(不显著)。loss 在预测值以下陡升、以上近乎持平——说明预测值贴近最优且足够大。

验证 2 — batch size warmup 不再需要:常规做法是早期 ramp batch(临界 batch size 早期小、后期增长)。但用 Muon 时观察到:低于预测最优的惩罚远大于高于,且 Muon 在 AdamW 会退化的大 batch 上仍保持数据效率;稀疏 MoE 的大 batch 还能保证每个 expert 每步收到足够多样的 token 信号。于是重测 ramp:从 6.3M 每次 +6.3M,524B tokens 达到 25.2M,两个变体(保持峰值 lr / 按小 batch 调低峰值 lr)分别比恒定 batch 差 2.5e-4 / 3.5e-4,且同 token 预算多花 18.8% 的 optimizer step。稳定性也没有差别(无 loss spike,p99.9 pre-clip 梯度范数 0.088–0.190,远低于 0.5 阈值)。

机制解释也很清楚:warmup 期小 batch 在同 lr 下梯度噪声更大 → loss 更高;刚到目标 batch 时因为累积了更多步会有短暂优势;但随着 lr 衰减、模型接近收敛,这个步数优势被抵消,恒定 batch 最终反超。结论:生产 run 不用 batch warmup。

验证 3 — learning rate(大模型 + 有限 token 预算,不稳定风险最大):48 层 156B-A7B MoE,419B tokens。

SettingBηMMLUMMLU-ProSuperGPQAMATHGSM8KBBHMMMLUAvg.
新拟合,预测最优8.4M1.76e-373.8448.3529.3149.9880.8973.2568.2360.55
新拟合,η ÷ √28.4M1.24e-373.5947.0028.1048.9277.4872.0066.8859.14
新拟合,η × √28.4M2.49e-373.8446.9228.0449.5880.0673.8268.4660.10
新拟合,B × 1.2510.5M2.01e-373.7348.5128.5249.3280.0672.5867.7260.06
Qwen3.5 配方4.2M6.8e-471.2345.3525.6745.5474.3269.5463.1956.41

旧配方比预测最优高 7.8e-3 loss;预测最优附近四个设置彼此在 7e-4 以内(噪声水平)——最优点位于一个平底盆的底部,lr 上下 √2 倍、batch +25% 都在盆内。稳定性:预测最优的最大 pre-clip 梯度范数只到 clip 阈值的 28%,旧配方 51%(小 batch 梯度更噪);warmup 之后 5 个 run 全程没有触发过梯度裁剪。


模块 G — 稳定性压测

动机:万亿参数 / 数十万亿 token 的规模才会出现的不稳定,在小规模实验里完全看不到。要在中等规模高效迭代又能暴露生产规模的失效模式,就需要放大压力。

设计:跟随 Wortsman et al. (2023) 的观察——大规模不稳定可以在小模型上通过抬高 lr 复现。做法是把 lr 恒定在最优值的某个倍数(绕过标准衰减 schedule),模拟生产 run 长期停留在峰值 lr 的情形。28 层 MoE,2× 和 4× 最优 lr,所有 run 同 batch,梯度裁剪阈值 0.5。

判据(写得很克制,值得学):新配方必须在同等压力下至少与它所替代的那一代一样稳(Qwen3.5 结构 + AdamW,已被成功放大过)。

测三个量:loss spike(超过 201 步滚动中位数 0.1 的步)、pre-clip 梯度范数的 p99.9 与越阈次数、每 block 最大激活。

压测:恒定 2×/4× 最优 lr 下的训练 loss

结果:

压力AdamW + Qwen3.5 结构Muon + Qwen3.5 结构Muon + GR
2× 最优 lr4.3 spikes / 10k steps0.2 / 10k0.2 / 10k
4× 最优 lr183 / 10k,19,932 步中 213 步越阈(裁剪器持续工作)从不越阈从不越阈,零 loss spike

机制隔离(单变量对照):固定 AdamW + 结构 + 数据顺序,只开关 GatedNorm,3× 最优 lr:spike 率 32.0 → 3.2 per 10k,越阈次数 256 → 20。再做一个 lr 阶梯(不开 gate):激活离群值随 lr 近似线性增长,而 spike 率增长快得多;开 gate 后即使在最高 lr 下,离群值也低于不开 gate 时最低 lr 的水平。

作者给出的解释很关键:高 lr 训练需要某种 rescaling 机制。没有显式门时,网络靠把激活离群值养大来实现它,因而脆弱;乘性门直接提供这个 rescaling,训练就稳了。

生产 run 验证(前 276B tokens,同数据顺序 / lr schedule / 优化器):

配置276B tokens 处 loss 相对改善median 梯度范数p99.91000 步窗口 std
Qwen3.5 结构 + Muon基线0.0970.298(唯一越过裁剪阈值的)基线
+ GR−0.0260.0530.071低 4.3–4.7×
完整 Flash-Next−0.058(再降 0.032)0.0430.066低 4.3–4.7×

在 8 倍模型规模、生产 lr 下复现了压测结论。把残差读与 LM head 前的最终归一化融合成一次门控读,进一步降低了梯度范数,很可能是 Flash-Next 与 Muon+GR 之间差距的主因。加 GR 后残差最大值在每个探测深度上都显著下降。

最终结果:全量训练全程没有一次 loss spike、没有异常梯度范数波动,也不需要 qk-clip 或 SwiGLU-clip 这类显式激活控制手段。


实验设置与结果

最终基座评测(14 个 benchmark:MMLU/MMLU-Redux/MMLU-Pro/BBH/SuperGPQA 5-shot 或 CoT;GPQA/GSM8K/MATH;EvalPlus/MultiPL-E/SWEBench-Pretrain;MGSM/MMMLU/INCLUDE):

Qwen3.8-Flash-Next-BaseQwen3.8-27B-BaseQwen3.7-Plus-Base
# Params125B27B397B
# Activated Params6B27B17B
# N-gram Embedding Params51B––
MMLU90.3687.5190.43
MMLU-Redux90.6887.2691.47
MMLU-Pro73.2368.6070.90
SuperGPQA51.3644.8648.42
BBH90.8789.5689.41
GPQA51.4245.0151.52
GSM8K93.2993.1892.95
MATH72.7860.5474.38
EvalPlus78.7676.0578.06
MultiPL-E79.0974.5081.68
SWEBench-Pretrain50.9941.6649.24
MGSM89.3386.3785.42
MMMLU84.8679.7484.53
INCLUDE78.4074.3778.90
  • 对 Qwen3.8-27B-Base:14/14 全胜。
  • 对大得多的 Qwen3.7-Plus-Base:8/14 领先,落后的 6 项最多差 2.6 分,而它只用约 1/3 激活参数、1/3 训练 token、≈1/9 训练 FLOPs。

SWEBench-Pretrain 是他们自建的预训练版 SWE-bench:给基座模型问题描述 + 相关代码文件,让它直接产出 diff patch,用与 golden patch 的序列相似度打分。


思考与可参考价值

这篇报告最有价值的地方不是模块,是方法论

一份架构报告最容易写成「我们试了 A、B、C,选了 C」。这篇不同的是它系统性地记录了三条评估轴什么时候会互相矛盾,并且四个反例里有两个是只在后训练阶段才暴露的(稀疏 read、NoPE)。这对任何自己训模型 / 做架构改动的团队都是可直接复用的检查清单:

不要用预训练 loss 单独做架构决策,尤其是那些「几乎不掉 loss」的省成本改动——它们恰恰是最危险的一类,因为看起来免费。

局限

  • 每一条结论都绑在他们自己的训练配方上。n-gram embedding 那节里 “no consistent gains in our training recipe” 出现了不止一次——换数据、换 TPP、换 tokenizer,很多结论未必成立。
  • 消融规模与生产规模的 gap。绝大部分消融在 25B-A3B / 35B-A3B 上做,然后外推到 125B-A6B。作者自己在结论里点名最紧的瓶颈是评估吞吐:他们缺一个便宜的中等规模探针来可靠预测后训练之后的排序,这正是稀疏 read 那个坑的根源。
  • Canzona 只有描述没有开源(FlashQLA 开源了)。想复现 Muon 在 Megatron 上的分布式实现,α-balanced 分区器 + Micro-Group All-to-All 流水这块要自己造。
  • Table 10 的排序作者自己标注为”观察性”——单次评测、top 设置之间差距在噪声内。这个诚实度值得肯定,但也意味着不能拿这张表去论证”更大 lr 一定更好”。
  • QSA 需要专门的 CPT 阶段(约 202B tokens)才能装上,不是一个可以在已有 checkpoint 上零成本插入的推理优化。

对电商 / 搜推 / Agent 方向的可借鉴点

  1. 「压缩后打分」优于「跨层共享」——这是稀疏检索的通用结论。QSA vs IndexShare 的对比说明:当各层表示差异大时,跨层复用索引会失效,而层内先压缩再打分不依赖任何跨层假设。这对长行为序列建模是直接可迁移的:把用户历史按微块(如每 4 个行为)AvgPool 成块表示、块级打分选 top-K 块、再展开回行为粒度做精细注意力——比在 token 级建索引便宜 r 倍,且长序列越长增益越大。“先压缩再加位置编码”这个 ordering 也要照抄,否则会把不同相位的行为平均掉。

  2. 有界正门(sigmoid)在三个不相关模块上一致胜出,且机制解释很有说服力:高 lr 训练需要一个 rescaling 机制,没有显式门时网络会靠养大激活离群值来实现,因而脆弱。任何自己训 ranking / retrieval 塔并且遇到过训练尖峰的团队,这是个成本极低的改动——比事后加各种 clip 干净得多(他们全程没用 qk-clip / SwiGLU-clip)。

  3. GR 的分支分析给出了”多路残差到底在干什么”的第一个精确答案:一支专门保存 layer-0 的输入信息并送给全局注意力层,其余三支走局部;同一个输出能以不同强度到达远近两个 reader——单条残差流做不到,因为它对每个 writer 只有一个衰减率。这对多塔 / 多任务架构有直接启发:如果你的网络需要把原始特征同时以不同强度送到浅层和深层,加宽残差比加 skip connection 更自然。而且这个分析方法(π_uv 分解 + 与无 GR 参考模型作差)本身就是一个可复用的诊断工具。

  4. n-gram embedding 那节的负面结果比正面结果更有价值:固定参数预算下拿 MoE expert 换 n-gram slot 在下游上没有收益——两者扩的是不同维度的容量,不该互换预算。同时中文 benchmark 是唯一随词表单调提升的,说明 n-gram 记忆对形态学/分词更复杂的语言帮助更大。做多语种电商(东南亚小语种、阿拉伯语)的话,这条线值得单独验证。

  5. 「压力测试」这个做法本身可以直接搬:把 lr 恒定在最优的 2–4 倍来在小规模复现大规模不稳定,判据定成”新配方必须至少与已被成功放大过的那一代一样稳”——这是一个廉价、可自动化、判据明确的 gate,比”跑到 X% 再看”实用得多。同样可用在推荐模型的大规模训练上。

  6. Muon 的两条工程教训与模型无关:(a) 融合参数必须在正交化前拆开,否则跨不相关子块混合奇异方向、缩放因子还用错形状——这是一个纯 bug 级别的正确性问题,任何要在 Megatron 上接 Muon 的人都会踩;(b) router 用 AdamW(各输出维独立,无共享线性结构可供正交化利用)。这两条省下的调试时间,可能比论文里任何一个架构模块都值钱。