← 返回 PaperDaily 大模型与智能体

仅用AdamW 2.6%状态!SkewAdam分层分配让67亿参数MoE单卡可训

还在为训练大模型时显存爆掉而烦恼?AdamW为671亿参数的MoE模型准备了50.6GB的优化器状态,比模型权重本身还大4倍!独立研究者Nuemaan Malik发现,MoE模型的不同部分(骨干网络、专家层、路由器)对优化器状态的需求截然不同。SkewAdam通过分层分配,将优化器状态压缩到1.29GB(仅占AdamW的2.6%),峰值内存降至31.3GB,

仅用AdamW 2.6%状态!SkewAdam分层分配让67亿参数MoE单卡可训

龙哥推荐理由:
还在为训练大模型时显存爆掉而烦恼?AdamW为671亿参数的MoE模型准备了50.6GB的优化器状态,比模型权重本身还大4倍!独立研究者Nuemaan Malik发现,MoE模型的不同部分(骨干网络、专家层、路由器)对优化器状态的需求截然不同。SkewAdam通过分层分配,将优化器状态压缩到1.29GB(仅占AdamW的2.6%),峰值内存降至31.3GB,单张40GB GPU就能训6.78B参数模型,且验证困惑度反而更低(108.4 vs 126.8)。这篇论文的价值不仅在于一个具体的优化器,更在于一个设计原则:让优化器状态各司其职,而非一视同仁。


原论文信息如下:
论文标题:
Where Should Optimizer State Live? Tiered State Allocation for Memory-Efficient Mixture-of-Experts Training
发表日期:
2026年07月

发表单位:
Independent Researcher (独立研究者)

原文链接:
https://arxiv.org/pdf/2607.19058v1.pdf

开源代码链接:
https://github.com/nuemaan/skewadam

优化器状态也有“偏科”?MoE训练的内存困境

训练大模型,显存是永远的痛。尤其是混合专家模型(MoE),虽然参数量大得吓人,但每个token只激活一小部分专家——比如一个6.78B参数的MoE,每token只激活约440M参数,计算量对应小模型。然而,优化器状态却“一视同仁”:AdamW为每个参数保存两个float32动量,总共8字节,而参数本身只有2字节(bfloat16)。所以,6.78B参数的MoE,权重只占12.6GB,优化器状态却要吃掉50.6GB!整个训练峰值内存高达81.4GB,直接告别单卡40GB的散热。
更苦的是,这50.6GB的状态主要是为专家层准备的——专家层占了95%的参数(6.4B)。但每个专家在top-2路由下,平均只处理约1/64的token。也就是说,你拿着float32的动量去平滑一个几乎没怎么见过的梯度,纯属浪费。路由器(gate)只有0.52M参数,虽然小,但它的梯度携带负载均衡信号,若像Lion那样直接丢掉梯度幅度信号,路由会乱套。
现有的内存高效优化器,比如Lion、Muon、Adafactor,都把网络当成一个均匀的块来处理。Lion只保留一个动量缓冲,用符号更新,在路由器那里丢掉了梯度幅度;Muon对专家矩阵进行牛顿-舒尔茨正交化,但计算量很大;Adafactor虽然分解了二阶矩,但要么在所有地方都丢弃动量,要么在所有地方都保留,没有区分对待。它们都没问一个问题:模型的不同部分,真的需要同等水平的优化器状态吗?

SkewAdam:为MoE量身定制的分层分配策略

SkewAdam的核心洞察简单粗暴:MoE模型有三个参数群体,它们的大小和梯度统计差异巨大,不该用同一种优化器状态配方。论文把参数分为三层:骨干网络(backbone)、专家层(experts)、路由器(router)。下面这张图直观展示了分层分配方案:
图1:6.78B参数MoE的分层状态分配。每个Adam组件只留在能挣回内存的地方:动量留在梯度密集的骨干网络,分解方差留在参数多但稀疏调用的专家层,精确方差留在路由器(仅2MB就能为每个logit提供适应性)。
图1:6.78B参数MoE的分层状态分配(m:动量缓冲,V:二阶矩估计)。每个Adam组件只留在能挣回内存的地方:动量留在梯度密集的骨干网络,分解方差留在参数多但稀疏调用的专家层,精确方差留在路由器(仅2MB就能为每个logit提供适应性)。
具体来说:

骨干网络(~5%参数)包括嵌入层、注意力投影、稠密前馈块、LayerNorm。这些参数每个token都参与,梯度密集,所以float32动量在这里很值;同时保留一个分解的二阶矩(row/column统计)。这5%的参数占用了1.27GB的动量(加上二阶矩共约1.3GB,占优化器状态的主体)。

专家层(~95%参数)128个专家,每个专家矩阵4096x4096x3(SwiGLU有3个权重矩阵)。在top-2-of-128路由下,每个专家平均只处理约1/64的token,梯度稀疏且方差大。在这里保留float32动量需要24GB,但大部分梯度更新非常稀疏,动量平滑作用微弱。因此SkewAdam只保留分解的二阶矩(row和column统计),完全丢弃动量。Adafactor的前期工作表明,在有二阶矩自适应学习率的情况下,可以安全移除动量而不会明显损失效果。专家层的分解二阶矩仅需12MB(每个矩阵n+m个float32,共128个专家矩阵)。

路由器(<0.01%参数)128x4096的权重,仅0.52M参数。路由器决定了每个token去哪两个专家,其梯度的相对幅度携带负载均衡信号。如果像Adafactor那样分解二阶矩,会将不同logit的方差混在一起,破坏路由决策。所以SkewAdam保留完整的、非分解的float32二阶矩,仅占2MB。这2MB买来了每个logit的独立自适应学习率,是路由稳定性的关键。

注意,路由器不使用权重衰减(weight decay),因为权重衰减会干扰路由偏向。此外,所有参数都使用bfloat16主权重,更新通过带抖动随机舍入(dithered rounding)的float32计算后写入。这种低精度策略对所有优化器一视同仁,公平比较。
分解二阶矩的公式如下:对于矩阵W,梯度G,保持行统计R和列统计C,指数移动平均,然后重建二阶矩估计为 R*C^T / mean(R)。这种做法与Adafactor完全一致,但只用于专家层和骨干网络。
验证困惑度随训练步数的变化,显示SkewAdam最终达到最低的验证困惑度(108.4),显著优于AdamW、Muon和Lion。
图:验证困惑度随训练步数的变化,SkewAdam(红色)最终达到108.4,明显低于AdamW(蓝色,126.8)、Muon(绿色,120.2)和Lion(紫色,393.7)。注意Lion在后期反而变差。

实验效果:用1/40的状态超越AdamW

论文在6.78B参数的MoE模型上进行对比实验,所有优化器从相同初始化开始,使用相同的数据顺序,训练82M token。下面这张表格和内存对比图直接展示差距:
对比不同优化器的峰值显存和优化器状态大小,直观展示SkewAdam在内存上的巨大优势。
图:峰值显存对比,SkewAdam(31.3GB)是唯一在40GB线以下的优化器,而AdamW需要81.4GB,Lion和Muon也需约57GB。
图2:收敛曲线和内存对比。AdamW和Muon在前3000步领先,但SkewAdam在4000步后反超,最终困惑度比AdamW低14.5%。只有SkewAdam的内存低于40GB线。
图2:收敛曲线和内存对比。AdamW和Muon在前3000步领先,但SkewAdam在4000步后反超,最终困惑度比AdamW低14.5%。只有SkewAdam的内存低于40GB线。
表1给出了详细的量化结果:
表1:6.78B参数MoE,10,000步从共享初始化的结果。状态大小为理论计算(附录B),内存和吞吐量为最终步测量。负载均衡损失在均匀路由下理论上限为0.05。
从表中可以看到,SkewAdam以1.29GB的优化器状态(仅占AdamW的2.6%)实现了最好困惑度108.4,同时负载均衡损失0.0505,几乎达到了均匀分配的下限(0.05)。AdamW虽然也保持很好的负载均衡(0.0502),但内存是SkewAdam的39倍,困惑度却差了18.4。Lion彻底扑街,困惑度393.7,说明丢弃梯度幅度信号在MoE路由中是不可取的。Muon在后期负载均衡损失上升(0.0608),比SkewAdam高出22%,困惑度120.2也落后约12个点。
吞吐量方面,SkewAdam每秒处理5000个token,比AdamW快6.6%,比Lion略慢1.5%(Lion只有一个缓冲,更新开销最小),比Muon快47%。Muon因为要对6.4B的专家参数做牛顿-舒尔茨迭代,计算开销明显。

实战验证:非均匀分配带来内存与性能双赢

内存省了97.4%,那效果会不会崩?别急,论文设计了一整套精密的实验,从多个维度验证了SkewAdam不仅没崩,还反超了AdamW。
实验设置:论文训练一个6.78B参数的decoder-only transformer,有两个块:第一个块是dense SwiGLU前馈层,第二个块是MoE层(128个专家,宽度4096,top-2路由)。模型总参数量6.78B,但每token只激活约440M参数。所有优化器从相同的初始化出发,使用相同的数据顺序,训练82M token(10,000步)。数据来自OpenWebText,按95/5比例切分训练/验证集,验证集使用相同的64个批次。
所有优化器都使用bfloat16主权重和带抖动随机舍入(dithered rounding)的更新路径,保证公平。学习率使用cosine调度,3% warmup。AdamW和SkewAdam的学习率3e-4,Lion为1e-4(其作者推荐低3-10倍),Muon矩阵为0.02、嵌入/路由器/向量参数为内部Adam的1e-3。运行在单张NVIDIA H200 GPU上(141GB显存,只为了让AdamW跑起来)。
下面这张表和内存对比图直观展示了差距:
表1:6.78B参数MoE优化器对比。SkewAdam状态1.29GB,峰值31.3GB,验证困惑度108.4,负载均衡损失0.0505。AdamW状态50.55GB,峰值81.4GB,困惑度126.8。Lion状态25.27GB,峰值56.6GB,困惑度393.7。Muon状态25.27GB,峰值57.6GB,困惑度120.2。
表1:6.78B参数MoE,10,000步从共享初始化的结果。状态大小为理论计算,内存和吞吐量为最终步测量。负载均衡损失在均匀路由下理论上限为0.05。
从表中可以清晰看到:SkewAdam以1.29GB的优化器状态(仅占AdamW的2.6%)实现了最好困惑度108.4,同时负载均衡损失0.0505,几乎达到了均匀分配的理论下限(0.05)。AdamW虽然也保持很好的负载均衡(0.0502),但内存是SkewAdam的39倍,困惑度却差了18.4。Lion彻底扑街,困惑度393.7,几乎是随机猜的水平。Muon在后期负载均衡损失上升(0.0608),困惑度120.2也落后约12个点。
图2:收敛曲线和内存对比。AdamW和Muon在前3000步领先,但SkewAdam在4000步后反超,最终困惑度比AdamW低14.5%。只有SkewAdam的内存低于40GB线。
从收敛曲线看,AdamW和Muon在前3000步领先(step 1000时SkewAdam落后AdamW 114点困惑度),但SkewAdam在4000步后反超,最终困惑度108.4,比AdamW低14.5%。这背后的原因,作者认为是专家的梯度非常稀疏(每个专家每步只处理约128个token),Adam的逐坐标二阶矩估计数据不足,而分解二阶矩(Factored Second Moment)在4096个坐标上汇总统计,加上RMS clipping,反而形成了更好的条件数。
吞吐量方面,SkewAdam每秒处理5000个token,比AdamW快6.6%,比Lion略慢1.5%(Lion只有一个缓冲,更新开销最小),比Muon快47%。Muon因为要对6.4B的专家参数做牛顿-舒尔茨迭代(Newton-Schulz iteration),计算开销明显。
再看路由稳定性:
图3:每评估步的负载均衡损失。虚线为完美均匀路由下的值(α=0.05)。SkewAdam和AdamW从4000步后就在理想值1%以内波动;Muon在最后1000步跳高22%。
图3:每评估步的负载均衡损失。虚线为完美均匀路由下的值(α=0.05)。SkewAdam和AdamW从4000步后就在理想值1%以内波动;Muon在最后1000步跳高22%。
负载均衡损失函数是Switch Transformer引入的辅助损失(Auxiliary loss),等于α * E * sum(p_i * f_i),当路由完全均匀时等于α=0.05。从图3看,SkewAdam和AdamW从4000步后就在0.05附近(0.0505和0.0502),非常稳定。Lion始终偏高7-9%,说明负载均衡还行但模型没学语言。Muon在最后1000步突然跳高22%到0.0608,这可能是不稳定性的开始,因为它的困惑度也在那段时间进入平台期。
公平性验证:正面硬刚Adafactor
SkewAdam最需要回答的比较对象是Adafactor——它的分解二阶矩就是从Adafactor来的。论文在获得更多计算资源后,在H100 MIG切片上重新运行了比较:
表2:同一协议下(相同模型、数据、种子、初始化)的分解和低秩基线对比,运行在NVIDIA H100 NVL 47 GB MIG切片上。吞吐量与表1不可比(不同硬件)。Adafactor状态为理论值;GaLore实现的状态未统计。
表2:同一协议下的分解和低秩基线对比。GaLore-style为论文自己实现,rank=128。
SkewAdam在H100上复现为109.0(H200上是108.4,机器间差异仅0.5%),说明协议跨硬件可迁移。Adafactor状态仅12MB(不含动量),但困惑度卡在149.5,最后1000步提升不到0.1,比SkewAdam差了40个点!两者共享相同的rank-one二阶矩估计器和更新clipping,唯一的区别是SkewAdam保留了动量而Adafactor完全丢弃了动量(并使用了另一种衰减调度)。这说明动量在MoE训练中是不可或缺的——即便只在骨干网络上保留,也能带来巨大的困惑度改善。
GaLore-style(rank 128)则彻底失败(困惑度1839.9),路由负载均衡倒是很好(0.0510),但完全没学会语言模型。作者谨慎地表示这可能是自己实现的配置不当,但至少说明把稀疏专家梯度投影到低秩子空间需要非常小心。
分层消融实验:哪个层级贡献了性能?
论文在MI300X GPU上做了一组关键的消融实验,逐层切换策略:
表3:MI300X上的分层消融实验,相同协议,每个变体一个种子。每行切换策略的一个决策。困惑度和负载均衡在所有四个变体中几乎相同;优化器状态和峰值内存则不然。
表3:MI300X上的分层消融实验。每行切换策略的一个决策。困惑度和负载均衡在所有变体中几乎相同;但优化器状态和峰值内存差异巨大。
结果非常惊人:四种配置的困惑度都在108.2-108.9之间(单种子噪声范围内),负载均衡都约0.0505。但优化器状态从1.29GB到25.29GB,差了二十倍!具体细节:

给专家加动量:状态从1.29GB飙升到25.29GB,峰值从31.4GB到55.4GB,困惑度只变了0.2(108.7 vs 108.9)——专家动量的确是完全的浪费。

分解路由器二阶矩:状态从1.29GB降到1.28GB,困惑度和负载均衡几乎不变(108.2 vs 108.9)——精确路由器二阶矩的2MB开销是无害的,但不做也不会明显变差。

均匀配置(所有层都加动量+分解二阶矩):困惑度108.3,状态25.29GB——这就是"满配"但浪费的状态,性能与SkewAdam相同。

这个消融实验完美回答了"哪个层级贡献了性能":贡献主要来自骨干网络上的动量,而专家层动量完全是死重。这也证明了分层策略的贡献是内存而非更好的优化质量——策略用1/20的状态达到了与满配相同的效果。
学习率扫描(Learning Rate Sweep):打不过就是打不过
消融实验后,剩下一个可能的质疑:SkewAdam领先AdamW是否只是因为AdamW的学习率没调好?论文对两个最强基线做了学习率扫描:
表4:两个最强基线的学习率扫描。SkewAdam故意不调优。AdamW最佳LR为1e-4,困惑度118.5±0.5(3种子);Adafactor最佳LR为1e-4,困惑度139.7(2种子)。SkewAdam未调优的困惑度为108.4-109.0(3 GPU)。
表4:学习率扫描结果。SkewAdam故意不调优。
调优确实帮AdamW从126.8降到了118.5,Adafactor从149.5降到了139.7。但SkewAdam(未调优)的108.4-109.0,领先最佳AdamW(118.5)约10个点(20倍种子级标准差),领先最佳Adafactor(139.7)约31个点。调优缩小了差距,但差距并没有消失。这再次印证:动量在MoE训练中的价值,以及分层分配在内存上的结构性优势。
有趣的是,AdamW和Adafactor的最佳学习率都是1e-4,而SkewAdam默认3e-4。AdamW-Aafactor之间约21个点的差距(118.5 vs 139.7)与表3消融实验的动量故事一致:Adafactor完全丢弃了动量。
零样本评估(Zero-shot Evaluation)
为了完整性,论文用LM Evaluation Harness在PIQA、WinoGrande、HellaSwag、ARC-Challenge上评估了最终checkpoint。
表9:零样本准确率(%)及标准误差。PIQA和WinoGrande报告准确率;HellaSwag和ARC-Challenge报告长度归一化准确率。前两个随机基线50%,后两个25%。
表9:零样本评估结果。经过82M token(现代预算的几千分之一)训练,所有模型在四个任务中三个接近随机,只有PIQA在53.5-55.9%,优化器间差异在1-2标准误差内。这说明82M token的困惑度提升并不能直接转化为下游能力,作者对此坦诚以告。

启示:设计原则比具体算法更重要

SkewAdam的贡献,论文自己定性得很清楚:不是发明了更好的优化器,而是提出了一种设计原则(Design Principle)—— 优化器状态应该在模型的哪些层级上、以什么精度存在,应该根据各层级的梯度统计特征来分配。
这个原则的泛化能力很强:

对于更深的多层MoE模型(如Mixtral 8x7B或DeepSeekMoE),分层分配策略可以直接应用,可能效果更显著(因为专家层更多,状态浪费更大)。

与其他内存压缩技术正交:SkewAdam的分层原则可以和8-bit优化器、ZeRO分片、梯度检查点等技术叠加,节省更多内存。

对于非MoE模型(如Dense模型):虽然分层分配的最大受益者可能是MoE,但对Dense模型中的不同层级(如底层、中层、顶层,或者Embedding与其他层)也可以考虑差异化分配。

不过,论文也坦诚地列出了局限性:
模型只有两个块,95%的参数集中在一个专家bank中,虽然适合压力测试,但多层MoE的情况未验证。大多数实验是单种子运行(主对比除外)。82M token和128上下文非常小,与生产环境差距巨大。权重衰减在所有运行中无效(因为学习率cosine+3e-4+80M token下权重衰减几乎无影响),扩展到更长训练时必须重新引入权重衰减并确保它在bfloat16更新中存活。零样本评估接近随机,不需要过度解读。
总的来说,这篇论文的价值不在于一个具体的优化器实现,而在于一个非常务实的洞察:你的模型不是均匀的,为什么你的优化器是?给每个部分分配它最需要的状态精度,可以大幅节省内存,而性能只升不降。
对于普通研究者,这个思路最直接的启发是:不要盲目套用AdamW的默认配置,想想你的模型哪些部分是梯度密集的、哪些是稀疏的,然后可对优化器状态做一些精细化分配。可能不需要做到SkewAdam这么极端,但骨干网络保留动量、专家层用AdaFactor、路由器用精确二阶矩这种"混搭"思路,绝对值得一试。
最后,代码已开源(MIT协议),单文件实现,无额外依赖,可以直接集成到你的训练脚本中体验一下。

龙迷三问

下面是龙哥对于大家可能的一些问题的解答:

SkewAdam 和 Adafactor 到底有什么区别?SkewAdam用在哪里?SkewAdam 和 Adafactor 共享相同的分解二阶矩估计方法(rank-one factorization),但有两个关键区别。第一,SkewAdam 在骨干网络(backbone)保留了完整的 float32 动量,而 Adafactor 在论文的对比中完全丢弃了动量(并使用了不同的衰减调度)。第二,SkewAdam 根据参数角色(骨干网络、专家、路由器)分配不同的状态组合,而 Adafactor 对所有参数一视同仁(要么全动量要么全无)。在 MoE 的训练中,骨干网络的动量非常重要(实验证明骨干网络的动量贡献了与满配状态相同的性能),而专家层的动量是浪费的。所以 SkewAdam 是用在混合专家模型训练中的精细化优化器,特别适合 GPU 显存有限(如单张 40GB A100/H200)又想训练几十亿参数 MoE 的场景。

文中提到的“分解二阶矩”(Factored Second Moment)是什么意思?为什么能节省那么多内存?传统的 AdamW 优化器对每个参数都保存一个 float32 的二阶矩估计(variance),对于一个 n×m 的权重矩阵,需要存储 n×m 个 float32 值(例如 4096×4096=16.8M 个,约 64MB)。分解二阶矩(来自 Adafactor)的思路是:分别计算每一行的平均值和每一列的平均值作为统计,然后通过外积重建出 rank-one 的二阶矩估计。这样存储量从 n×m 降到了 n+m(例如 4096+4096=8192 个,约 32KB)。对于 128 个专家矩阵,传统 AdamW 需要 128×64MB=8.2GB,而分解版本只需 128×32KB=4.1MB,节省了 2000 倍!但需要注意,这种分解对路由器(gate)不适用,因为路由器中不同 logit 的相对大小对路由决策至关重要,分解会破坏这种信号。

论文中 SkewAdam 的困惑度比 AdamW 还低(108.4 vs 126.8),这是否说明 SkewAdam 本身就是一个更好的优化器?这是一个非常重要的判断。论文自己给出了清晰的回答:分层策略的贡献是内存,而不是更好的优化质量。从表 3 的消融实验可以看到,如果给所有层都加上动量(Uniform with momentum),困惑度也是 108.3,和 SkewAdam 的 108.9 在种子噪声内相同。所以 SkewAdam 之所以困惑度低,是因为它保留了骨干网络的动量(dense梯度),而它的分层分配策略节省了 20 倍的内存。这个差距在扫过学习率后仍然存在(AdamW 调优后 118.5 vs SkewAdam 108.4),说明在 MoE 场景下,均匀的动量分配确实不如骨干网络加分解专家的组合。但你必须清楚:这个好成绩是在 82M token 的小数据规模下获得的,在更大的 token 预算下,AdamW 是否能反超还需要验证。论文的第十行结论说得很谦虚:"The contribution is memory, not a better optimizer",这个定位非常精准。

如果你还有哪些想要了解的,欢迎在评论区留言或者讨论~

龙哥点评

论文创新性分数:★★★★✰

思路新颖实用,把优化器状态按参数角色分层分配,但分解二阶矩和更新clipping来自Adafactor,创新在于分配策略。

实验合理度:★★★★★

实验设计严谨:相同初始化、数据顺序、bfloat16更新路径。设置Adafactor对照、分层消融、学习率扫描、三种GPU复现、零样本评估。不足是大多数实验单种子运行,小规模训练验证空间有限。

学术研究价值:★★★★★

“分层分配”设计原则打破“优化器应对所有参数一视同仁”的隐含假设,对MoE训练、混合精度训练、内存高效优化等领域有启发。

稳定性:★★★★✰

82M token下负载均衡稳定(0.0505,理论下限1%内),但未在多层MoE上验证,更大规模和更长训练表现未知。

适应性以及泛化能力:★★★★✰

主要验证MoE场景(单MoE层),对dense模型、多层MoE、更大模型的适用性不清楚。分层原则泛化可能强,但具体配置需调整。

硬件需求及成本:★★★★★

峰值31.3GB内存(含权重、梯度、激活、状态)在40GB显存上有余量。状态仅1.29GB,节省是结构性的,不增加额外计算开销。

复现难度:★★★★★

代码已开源(MIT协议),单文件实现,无额外依赖。附录提供完整配置表和组件级状态分解,复现条件好。

产品化成熟度:★★★✰✰

集成难度低(改一行优化器名),但只验证82M token单MoE层场景,与产品级百B token、多层MoE差距巨大。零样本评估显示下游能力无竞争力。

可能的问题:论文自信展示困惑度领先,但只经82M token训练,零样本评估接近随机。消融实验单种子运行,无法确认细微差异。逐层策略泛化性未验证。作者建议生产规模需重新验证权重衰减兼容性和bfloat16数值稳定性。


主要参考文献

转发文章 微博 X LinkedIn Facebook
龙哥读论文 · PaperDaily

本文基于龙哥读论文 PaperDaily 数据库整理,结合论文原文与工程视角进行解读。

LONGGE AI COMMUNITY

把每天读到的论文,变成长期积累

加入「龙哥读论文」知识星球,持续获取 AI 论文、资讯、开源项目、招聘与研究思路。

加入龙哥读论文微信群:添加微信 kangjinlonghelper,备注“研究方向 + 地点 + 学校/公司 + 昵称”。

龙哥读论文知识星球二维码 微信扫码加入知识星球