第17章 Muon 优化器与 32T 预训练

“AdamW was the optimizer of the 2010s. Muon is one of the candidates for the 2020s.” —— 引自一位 ML systems 研究者

V4 的训练栈用 Muon 取代部分 AdamW——一个看似细节的选择,背后是 1.6T MoE 训练成本与稳定性的极致权衡。


17.1 引子:AdamW 在 1.6T 规模上的局限

AdamW(Adam with weight decay)从 2017 年问世后,统治了大模型训练近十年。它的工作原理是为每个参数维护两个 moment:

  • 一阶 moment(动量):梯度的指数移动平均
  • 二阶 moment(方差):梯度平方的指数移动平均

更新公式:

θt+1=θtηm^tv^t+ϵ\theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}

AdamW 在小模型上极稳定,但在 1.6T 规模上有几个问题:

问题 1:状态显存翻 2 倍

AdamW 的 m / v 与参数同形——对 1.6T 参数意味着多 3.2T 个 32-bit 状态 ≈ 12.8 TB(即便 8-bit 优化器如 bitsandbytes,也要约 3.2 TB)。这对训练集群的 host memory 是巨大压力。

问题 2:与 FP4 / FP8 weight 的不兼容

AdamW 的更新假设 weight 是连续浮点。V4 的 routed expert 是 FP4 e2m1——只有 16 个离散值。AdamW 的 weight - lr * m/sqrt(v) 计算后必须 round 回 FP4 grid,引入舍入误差。

问题 3:超参敏感

AdamW 的 β1 / β2 / ε / weight decay 在 1.6T 训练中非常敏感——一个错误的 ε 会让训练在某个 step 突然崩溃。这增加训练运维成本。

问题 4:对 spectral norm 的隐性约束弱

AdamW 通过 weight decay 间接控制 weight 范数。但在 MoE + HC + 稀疏 attention 这种”复杂结构”下,简单的 weight decay 不足以保证训练稳定。

Muon 通过完全不同的数学路径回应了这些问题。


17.2 Muon 的核心思想

Muon (Momentum Orthogonalized by Newton-Schulz) 是 Keller Jordan 在 2024 年通过 blog post + GitHub repo(github.com/KellerJordan/Muon)提出的优化器;后续 Moonshot AI 团队的扩展研究 “Muon is Scalable for LLM Training”(arXiv:2502.16982,2025-02)把它推到大模型规模的工业验证。它的核心思想:用矩阵的 spectral norm 约束代替简单的 weight decay

Muon 的更新规则可以简化成两步:

1. 算梯度的动量 m = β · m + g
2. 把 m 投影到 spectral norm = 1 的矩阵流形上:
   m_proj = newton_schulz(m)   # 用 Newton-Schulz 迭代算近似 SVD
3. 更新参数:θ_{t+1} = θ_t - lr · m_proj

Newton-Schulz 迭代可以快速逼近 m / ||m||_2(spectral 谱)—— 让动量始终保持单位 spectral norm。

这个看似奇怪的设计有几个好处:

  • 不需要二阶 moment:Muon 只需要一阶 m,状态显存少一半
  • 天然的 weight decay 替代品:spectral norm 约束防止 weight 范数失控
  • 对超参不敏感:lr 几乎是唯一关键超参
  • 与 FP4 / FP8 兼容:Newton-Schulz 在 FP32 中算,最后 round 到 weight 的 dtype

V4 是第一个把 Muon 推到 1.6T 工业化训练的开源模型。


17.2·补 Muon 单步更新的数据流

把 Muon 一次 step 的核心计算画清楚:

flowchart LR
  G["梯度 g: [out, in]<br/>BF16/FP32"] --> Mom["更新动量<br/>m = β·m + g"]
  Mom --> Norm["g_normalized = g / (norm+ε)<br/>(BF16, 防溢出)"]
  Norm --> NS["Newton-Schulz 5 步迭代<br/>近似 SVD 投影"]
  NS --> Spectral["m_spectral: spectral norm ≈ 1"]
  Spectral --> Update["weight ← weight − lr × m_spectral"]
  
  M_state["持久 momentum buffer<br/>(只保 m, 不保 v)"] -.每步读写.-> Mom
  
  classDef compute fill:#312e81,stroke:#a78bfa,color:#ede9fe
  classDef state fill:#1f2937,stroke:#475569,color:#cbd5e1
  class NS,Spectral compute
  class M_state state

Muon 与 AdamW 的核心差别一目了然:只维护一阶 m,没有二阶 v——状态显存减半。Newton-Schulz 取代二阶 moment 的”自适应学习率”作用。


17.3 Muon 与 AdamW 的对比

把 Muon 与 AdamW 在 V4 训练场景下对比:

维度AdamWMuon
状态显存2× 参数(m, v)1× 参数(仅 m)
关键超参lr, β1, β2, ε, wdlr (几乎只这一个)
spectral 约束间接(weight decay)直接(Newton-Schulz)
与 FP4/FP8 兼容需要适配天然兼容
收敛速度快(少 30-50% steps)
训练稳定性中(依赖超参)高(spectral 约束兜底)
数学复杂度简单中(Newton-Schulz 迭代)

V4 选 Muon 的工程账:

  • 显存节省:1.6T 参数 × 4 bytes = 6.4 TB 状态(FP32 m)—— 节省 6.4 TB host memory
  • 训练加速:少约 30-50% steps(Keller Jordan blog 在 NanoGPT 速跑 ≈ 33%,Moonshot 论文在更大规模上也有相近收益)—— 训练时间显著缩短
  • 超参鲁棒:减少调参成本——大规模训练里调参成本高昂

代价:Newton-Schulz 迭代的计算开销(每 step 多约 5-10% FLOPs)。在大规模训练里,FLOPs 不是瓶颈,时间和显存是——所以这个 trade-off 完全划算。


17.4 V4 训练中可能的混合优化器策略

V4 的具体训练源码不公开,但从 README 的”Muon optimizer”声明 + 一般训练实践推测:

策略一:纯 Muon 所有参数都用 Muon。简单但可能在某些参数(如 LayerNorm γ、bias)上不稳定——这些参数是向量而非矩阵,spectral norm 概念不适用。

策略二:Muon + AdamW 混合 矩阵参数(Q/K/V weight、Expert weight 等)用 Muon,向量参数(LayerNorm γ、bias)用 AdamW。这是更稳健的工程做法。

V4 大概率走策略二——inference/model.py 中的 RMSNorm 参数、bias、ape 等都是 vector 形状,Muon 不适合直接处理。

具体的混合规则(推测):

  • weight 矩阵(Linear、Conv 等):Muon
  • 1D 参数(norm γ、bias、ape):AdamW
  • 特殊参数(attn_sink、HC 系数等):AdamW + 较小 lr

17.5 32T tokens 预训练:数据规模的几何

V4 的 README 写:“Pre-training: 32T+ high-quality and diverse tokens”。32T 这个数字背后的几何含义:

维度32T 是什么
总数据量32 × 10^12 tokens
与 V3 对比V3 用 14.8T, V4 翻倍多
文本量假设平均 1.5 byte/token,约 48 TB 原始文本
训练时长1.6T 模型在数千卡上需要数月(具体不详)
数据成本至少几百万美元(爬取 + 清洗 + 标注)
单 token 单训练 GPU-second≈ 0.001 - 0.01 (with 1 epoch and FP4 expert)

V4 为什么需要 32T 而不是 V3 的 14.8T?三个原因(基于第 1 章 §1.8·补 的论证):

  1. 384 expert + top-6 比 256 + top-8 更稀疏:每个 expert 见到的 token 比例下降,需要更多总 token 让每个 expert 训练充分
  2. HC 让模型容量比简单”乘以 4”更接近真相:更大容量需要更多数据填充
  3. FP4 expert 训练的精度损失需要更长曲线补偿

这三个原因加在一起,把数据需求从 V3 的 14.8T 推到 V4 的 32T+。


17.6 数据组成的”五大支柱”

虽然 V4 没公开具体数据配比,但从 V3 报告 + 公开惯例可以推测预训练数据由 5 个支柱组成:

支柱一:通用网页 (Common Crawl + 清洗) 占比通常 50-70%。提供”日常语言”语料,让模型学到广泛的世界知识。V4 的高质量数据需求意味着 Common Crawl 经过严格清洗——质量过滤 + 去重 + 安全过滤。

支柱二:代码 (GitHub + Stack Overflow) 占比 15-25%。代码是逻辑训练的最佳样本——结构清晰、有”对错”、长上下文需求高。V4 在 SWE-bench 类任务的进步暗示这部分数据被加权。

支柱三:数学与推理 (arXiv / 书籍 / 数学网站) 占比 5-10%。给 Think Max 模式的”推理边界”训练数据。

支柱四:多语言 占比 10-20%。V4 的中英文同等强表现意味着中英文权重相当 + 一些其他主流语言。

支柱五:合成数据 (synthetic data) 占比 5-15%。V3 / V3.2 已经大量使用合成数据,V4 沿用——用大模型自身生成训练数据补充薄弱领域。

这 5 个支柱的具体配比是 V4 团队的”训练秘方”——不公开,需要等社区独立复现 / 论文 ablation 才能揭晓。


17.7 学习率与训练阶段

V4 的训练曲线(基于 V3 的公开模式 + V4 README 描述)大致分为 3 个阶段:

flowchart LR
  S1["阶段 1: warm-up<br/>~1% steps<br/>lr 线性升到 max"] --> S2["阶段 2: stable<br/>~80% steps<br/>lr 在 max 附近"]
  S2 --> S3["阶段 3: cooldown<br/>~19% steps<br/>lr 衰减到 min"]

阶段 1 (warm-up):从 0 升到 max lr。这是为了避免训练初期的不稳定(随机初始化 + 大 lr = 灾难)。

阶段 2 (stable):lr 保持在 max 附近,做主要训练。这是最长的阶段——大部分参数学习发生在这里。

阶段 3 (cooldown):lr 衰减到一个小值(典型 max 的 1/10)。这个阶段让模型在”低 lr 下精修”——loss 进一步下降。

V4 的 max lr 不公开,但可以从公开 V3 数据推测约在 4e-4 到 1e-3 之间。Muon 优化器对 lr 的敏感度低,这给 V4 的训练 lr 选择留了更大空间。


17.8 训练监控的关键指标

大规模 LLM 训练需要监控的关键指标(基于 DeepSeek 公开报告 + 通用训练经验):

指标目的危险信号
Per-token loss主优化目标上升 / 不收敛
Gradient norm训练稳定性爆炸(>1.0)/ 消失(<1e-5)
Per-layer activation norm检测层间数值稳定某层异常大 / 小
Expert load (per-layer MoE)检测路由均衡某 expert 长期 0 load
Routing entropygate 是否塌陷接近 0 (塌陷) 或 ln(n_experts) (退化)
KV cache hit rate (eval)长上下文外推效果1M context 下骤降
MTP acceptance rateMTP head 与主 head 一致度低于 70% 说明 MTP 训练有问题
HC pre/post weightsHC 是否正常学comb 矩阵不接近双随机
FP4 quant error (proxy)QAT 是否有效量化误差大幅增长

V4 的训练运维必须持续监控这些指标——任何一个异常都需要介入。这是 1.6T 训练的工程复杂度的真实来源。


17.9 动手实验:Muon 的 mini 实现

import torch

def newton_schulz_5(G, steps=5):
    """5 步 Newton-Schulz 迭代逼近 G 的正交化"""
    a, b, c = (3.4445, -4.7750, 2.0315)  # Keller Jordan 原始 Muon 给的 NS 系数
    X = G.bfloat16() / (G.norm() + 1e-7)
    for _ in range(steps):
        A = X @ X.transpose(-2, -1)
        B = b * A + c * (A @ A)
        X = a * X + B @ X
    return X.float()

class MuonOptimizer(torch.optim.Optimizer):
    def __init__(self, params, lr=0.01, momentum=0.95):
        defaults = dict(lr=lr, momentum=momentum)
        super().__init__(params, defaults)

    def step(self):
        for group in self.param_groups:
            for p in group['params']:
                if p.grad is None:
                    continue
                state = self.state[p]
                if 'momentum_buffer' not in state:
                    state['momentum_buffer'] = torch.zeros_like(p.data)

                buf = state['momentum_buffer']
                buf.mul_(group['momentum']).add_(p.grad)

                # 仅对 2D weight 做 Newton-Schulz(向量参数走普通 SGD)
                if p.dim() == 2:
                    update = newton_schulz_5(buf)
                else:
                    update = buf

                p.data.add_(update, alpha=-group['lr'])


# 测试:用 Muon 训练一个简单 Linear 拟合
torch.manual_seed(0)
W_target = torch.randn(64, 32)
data_x = torch.randn(1000, 32)
data_y = data_x @ W_target.T

model = torch.nn.Linear(32, 64, bias=False)
opt = MuonOptimizer(model.parameters(), lr=0.05)

for step in range(50):
    opt.zero_grad()
    pred = model(data_x)
    loss = (pred - data_y).pow(2).mean()
    loss.backward()
    opt.step()
    if step % 10 == 0:
        print(f"Step {step}: loss = {loss.item():.4f}")

跑通后会看到 Muon 在简单回归任务上比同样 lr 的 SGD 收敛更快——这是 Newton-Schulz 正交化的”加速”效果。


17.9·补 Muon 在 1.6T 规模的工程挑战

Muon 最早是 Keller Jordan 在 2024 年发布的 blog + GitHub repo,主要在小规模(< 1B,如 NanoGPT 速跑)上验证;Moonshot 2025-02 的扩展论文也只覆盖到几十 B 级别。V4 把它推到 1.6T 规模面临几个工程挑战:

挑战 1:Newton-Schulz 在大矩阵上的数值稳定

Newton-Schulz 迭代在 BF16 上跑——大矩阵(如 expert weight 7168×3072)的 spectral norm 计算可能出现 overflow。V4 的应对是 5 步迭代(Muon 默认)+ 严格的输入归一化(G / (G.norm() + 1e-7))+ 系数选择(3.4445, -4.7750, 2.0315)保证收敛。

挑战 2:Muon 与 ZeRO 优化器分片的协调

ZeRO-2 / ZeRO-3 把优化器状态分片到不同 rank。Muon 的动量是矩阵——如果分片到不同 rank,Newton-Schulz 必须在分片状态下做。V4 团队大概率定制了 ZeRO-Muon 的协同实现——把 Muon 状态在 rank 间分片,Newton-Schulz 在通信前的本地步骤里完成。

挑战 3:FP4 expert 的特殊处理

FP4 weight 只有 16 个离散值,Muon 的更新 w - lr × m_proj 计算后必须 round 到 FP4 网格。简单 round 会让小更新”被吸收”——V4 大概率用了 stochastic round(按概率 round 到上下相邻值),让小更新有概率”逃出”网格吸收。

挑战 4:与 QAT 的协同

QAT 让 weight 在训练中保持 BF16(仅 forward 时 fake quantize),优化器更新用 BF16 weight。Muon 的 spectral 投影也作用于 BF16 weight——保证更新方向准确。最后训练完成时再把 BF16 round 到 FP4 存储。这种”训练 BF16 + 存储 FP4” 的策略让 Muon 与 FP4 兼容。

挑战 5:与 HC / Sinkhorn 的协同

HC 的 Sinkhorn 内部参数(hc_sinkhorn_iters 控制的迭代)已经是个 spectral-like 操作。Muon 的 spectral 约束作用在 weight 上——两者叠加后是否有”过约束”?V4 的实测表明没有——HC 的 Sinkhorn 是 token-level 自适应,Muon 的 spectral 是 weight-level 全局约束,两者作用层级不同、不冲突。

这 5 个挑战的解决方案大部分不公开,但它们的存在本身让 V4 的训练栈成为业界第一个”1.6T + Muon + FP4 + HC”的工业实证——任何后续模型想复制这条路线,都要重新解决这 5 个问题。


17.9·补·补 32T tokens 的硬件投入估算

把 32T tokens 训练 V4 Pro 的硬件投入做个粗略估算(基于公开数据 + 工程惯例):

单 token 训练 FLOPs:1.6T 总参 × 49B 激活 × 6(forward + backward + optimizer)≈ 300G FLOPs / token(粗略)

总 FLOPs:32 × 10^12 × 300 × 10^9 = 9.6 × 10^24 = 9.6 ZettaFLOPs

硬件:H100 的 FP8 峰值 ~1300 TFlops,实际利用率 ~50%(混合精度训练 + 通信 + 反向)= ~650 TFlops 有效。

总 GPU-hour:9.6 × 10^24 / (650 × 10^12) / 3600 ≈ 400 万 GPU-hour

集群规模:如果用 5000 张 H100 持续训:400 万 / 5000 = 800 小时 ≈ 33 天。如果 10000 张:~17 天。

电费:每张 H100 ~700W,5000 张 × 800 小时 = 280 万 kWh,约 280 万元人民币电费(按 1 元/kWh)。

硬件折旧:5000 张 H100 总价约 15 亿元,按 3 年折旧、训练 33 天占用:~5000 万元折旧成本。

总训练成本估算:硬件折旧 + 电费 + 数据处理 + 工程师工资 ≈ 5000 万 - 1 亿元人民币

这个数字与公开报道的 V3 训练成本(约 600 万美元)量级一致——V4 训练规模 2x V3,成本也 ~2x。这是全球能负担起这种规模训练的公司不超过 20 家的真实门槛。

V4 把训练栈开源(Muon / GRPO / 蒸馏方法),但这种规模的算力 + 数据是大多数公司复制不了的。这是为什么”V4 即便开源,也不会让小公司从零训练 V4 类模型”——开源的最大价值是 fine-tune 与部署,不是 from-scratch 复刻。


17.10 延伸阅读


17.10·补 Muon 在社区中的现状与争议

Muon 是 2024 年提出的新优化器,社区对它的接受度还在演化中。把当前现状梳理一下(截至 2026 年 4 月):

支持方观点

  • 收敛快、状态显存少(V4 的实测验证)
  • 与低精度训练兼容性好(V4 的 FP4 expert 实证)
  • Newton-Schulz 数学优雅,spectral 约束有理论基础
  • Keller Jordan 的 blog 与 Moonshot 扩展论文对 Newton-Schulz 系数与收敛性都有详细推导

反对方观点

  • Newton-Schulz 系数(3.4445, -4.7750, 2.0315)对不同矩阵形状的鲁棒性未充分验证
  • spectral 约束可能让某些任务(如 fine-tune)不灵活
  • 社区可复现实验还不够多——大多数实验在小规模上
  • 与 ZeRO / FSDP 等优化器分片框架的协同机制不成熟

中立观察

V4 是 Muon 在 1.6T 规模的第一次工业级使用——它的成功 / 失败都会被社区作为重要 data point。如果 V4 GA 后社区独立复现实验显示 Muon 在多个任务上稳定,Muon 会取代 AdamW 成为新标准;如果出现 V4 训练曲线后期问题归因到 Muon,Muon 的接受度会停滞。

对工程师的建议

如果你做的是 < 100B 规模的训练,AdamW 仍然是稳妥选择——成熟、社区支持广。Muon 适合 100B+ 规模 + 显存敏感 + 可承担”踩坑成本”的场景。等 6-12 个月看 V4 GA 后的社区反馈,再决定是否切换。


17.10·补·补 Muon 与”超大 batch size” 训练的关系

V4 的训练 batch size 没有公开,但合理推测在几千到几万 token 量级。把 Muon 与超大 batch 的关系梳理一下。

经典训练理论(Adam / AdamW)

batch size 大 → 梯度估计准 → 可以用更大 lr。但 lr 不能无限大,因为 Adam 的 ε 在大 lr 下会失效(变成”effectively normalized SGD”)。所以经典 AdamW 训练在 batch > 几百 万 token 时会饱和——增加 batch 不再带来收敛加速。

Muon 的特点

Muon 的 spectral norm 投影让”动量方向” 在大 batch 下更准——更准的梯度方向更能利用 spectral 投影。理论上 Muon 在大 batch 下比 AdamW 表现更好。

V4 的实战暗示

V4 用 32T tokens 训练。如果用 AdamW 的 batch 上限(几百万 token),需要训练步数极多。Muon 让 batch 上限提高,每步处理更多 token——总训练 wall time 缩短。

对工程师的意义

如果你做的是大模型训练(10B+),切到 Muon 后不要忘了同步增大 batch size——否则只享受了”显存节省”的红利、没享受”大 batch 加速”的红利。Moonshot 的扩展论文(arXiv:2502.16982)中有具体的 batch size × lr 实验曲线——根据模型规模套用。

如果你做的是 fine-tune(小数据),batch size 受限于数据量——Muon 的大 batch 优势用不上。这种场景下 Muon 与 AdamW 的差异不大。

理解这个关系让你正确使用 Muon——不是”换个优化器” 那么简单,是”换一套训练 hyperparameters”。


17.10·延展 Muon 与”训练稳定性”的工程指标

V4 用 Muon 训练 1.6T 模型,训练稳定性是工程纪律的核心指标。把训练时实际监控的稳定性指标列出来。

指标 1:gradient norm

每 step 算梯度的 L2 norm。Muon 的 spectral 投影让梯度方向稳定——norm 应该在一个相对窄的区间波动(如 0.5-2.0)。如果 norm 突然 > 5 或 < 0.1,说明训练出现异常(可能是学习率太大或某个 layer 数值崩溃)。

指标 2:Newton-Schulz 迭代误差

Muon 内部的 NS 迭代逼近 spectral norm = 1。如果输入梯度过大,NS 5 步可能收敛不到——误差 > 1e-3 时需要警觉。可以增加 NS 步数或 clip 输入。

指标 3:weight 范数稳定性

每层 weight 的 L2 norm 在训练中应该缓慢变化。如果某层 weight norm 突跳(如某 step 内增加 50%),说明 spectral 约束被破坏。

指标 4:每层 activation 范数

forward 过程中每层 activation 的 norm 应该稳定(V4 的 Sinkhorn / RMSNorm 保证这一点)。某层 activation norm 异常(变成预期 10x 或 0.1x),说明该层数值出现问题。

指标 5:bias 漂移率

V4 的 noaux_tc bias 在每个 step 微调。如果某 step 的 bias 调整幅度 > 0.1(典型应该 < 0.01),说明 routing 不均衡——需要检查输入数据分布。

这些指标的实时监控

V4 的训练栈大概率有 wandb 或类似工具实时追踪这些指标。任何一个异常都会触发自动 checkpoint + 暂停训练 + alert ML 团队。

理解这些指标让你在自己的项目里部署”Muon 友好的训练监控”——避免在长训练(数周到数月)后期才发现问题,浪费几百万 GPU-hour。


17.11 本章小结

  • V4 用 Muon 优化器(部分参数)取代 AdamW——节省状态显存约 50%
  • Muon 通过 Newton-Schulz 迭代把动量投影到 spectral norm = 1 的流形——隐式正则化
  • 矩阵参数走 Muon、向量参数走 AdamW 的混合策略最稳健
  • 32T tokens 预训练:384 expert + HC 容量 + FP4 训练精度需求三者共同推动
  • 数据由 5 大支柱构成:网页 / 代码 / 数学 / 多语言 / 合成数据
  • 学习率分 3 阶段:warm-up / stable / cooldown
  • 训练监控 9 大关键指标——任何异常都需要介入

第 18 章:两阶段后训练——领域专家培养 + on-policy 蒸馏。

评论 0