NVIDIA NeMo AutoModel 加速 Mixture-of-Experts 模型的微调

NVIDIA NeMo AutoModel 加速 Mixture-of-Experts 模型的微调

背景

Mixture-of-Experts 模型的兴起带来了训练挑战,Transformers v5 通过专家后端、动态权重加载和分布式执行来应对这些挑战,但仍缺少融合通信内核。

NeMo AutoModel:相同 API,更多性能

NeMo AutoModel 继承自 AutoModelForCausalLM,因此用户只需更改一行 import 即可从 Hugging Face Transformers 切换到 NeMo AutoModel,并在不修改训练代码的情况下获得 Expert Parallelism、DeepEP 融合 all‑to‑all 调度以及 TransformerEngine 内核。

加载模型时,NeMo AutoModel 与 Hugging Face 版本几乎相同,只是 import 不同:

from nemo_automodel import NeMoAutoModelForCausalLM
model = NeMoAutoModelForCausalLM.from_pretrained(
    "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16",
    dtype=torch.bfloat16,
)

对于 Qwen3、NVIDIA Nemotron、GPT‑OSS、DeepSeek V3 等流行的 MoE 架构,NeMo AutoModel 提供了使用 TransformerEngine attention、融合线性层和自定义专家内核的手工调优实现。对于其他模型,它回退到原生 Hugging Face,同时仍会应用诸如 Liger 内核打补丁等优化。通过传入 device_mesh,得到的模型可以扩展到多 GPU 训练。

要在 8 GPU 上使用 Expert Parallelism 训练 Nemotron 3 Nano 30B A3B,用户需要添加分布式 mesh 配置:

import os
import torch
import torch.distributed as dist
from nemo_automodel import NeMoAutoModelForCausalLM
from nemo_automodel.recipes._dist_utils import create_distributed_setup_from_config

dist.init_process_group(backend="nccl")
torch.manual_seed(0)
torch.cuda.set_device(int(os.environ.get("LOCAL_RANK", 0)))

dist_setup = create_distributed_setup_from_config({
    "strategy": "fsdp2",
    "ep_size": 8,
})

model = NeMoAutoModelForCausalLM.from_pretrained(
    "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16",
    dtype=torch.bfloat16,
    distributed_setup=dist_setup,
)

dist.destroy_process_group()

这一次性 from_pretrained() 调用即可获得来自 FSDP2、Expert Parallelism、TransformerEngine 内核和 DeepEP 调度的速度、可扩展性和内存优化。

性能比较

基准测试显示,NeMo AutoModel 在每 GPU 的 tokens‑per‑second 上提升 3.4‑3.7 倍,峰值内存降低 29‑32%,相较于最佳的 Transformers v5 配置,无论是在 16 节点的 550B 模型,还是单节点的两个 30B MoE 模型上均如此。

Nemotron 3 Ultra 550B A55B(完整微调,多节点)

Expert Parallelism 使得在 16 台 H100 节点上对 550B 参数的 Nemotron 3 Ultra 模型进行完整微调成为可能,而在该规模下 Transformers v5 会因内存不足而失败。

方法论:

  • 硬件:16× H100 80GB(128 GPU)
  • 专家并行:EP=64
  • 本地批大小:2
  • 序列长度:4,096
  • 特性:MTP、激活检查点、融合线性交叉熵
  • 内核:DeepEP 调度 + torch_mm 专家 + TransformerEngine

结果:

指标 NeMo AutoModel (EP=64)
TPS/GPU(平均) 815
TFLOP/s/GPU ~293
峰值内存 58.2 GiB

Transformers v5 在此规模下会因内存不足而无法运行,故未报告 v5 数据。

单节点 30B MoE 基准测试

在单个 8‑GPU H100 节点上,NeMo AutoModel 在吞吐量上比 Transformers v5 快 3.36‑3.69 倍,并将 Qwen3‑30B‑A3B 与 Nemotron 3 Nano 30B‑A3B 的峰值内存降低 29‑32%。

方法论:

  • 硬件:8× H100 80GB(单节点)
  • 序列长度:4,096
  • 本地批大小:1

Qwen3-30B-A3B

指标 v4 v5 (FA2 + grouped_mm) NeMo AutoModel (EP=8) v5 → NeMo AutoModel
TPS/GPU(平均) deadlock 3,075 11,340 3.69x
峰值内存 68.2 GiB 48.1 GiB -29%
平均前向+损失 582 ms 194 ms 3.00x
平均反向 758 ms 178 ms 4.26x

Transformers v4 因将 Qwen3 MoE 专家存为 128 个单独的 MLP 模块的 ModuleList,每个模块单独进行 FSDP 包装,导致集合操作不匹配而死锁。Transformers v5 通过将专家存为融合的 3D 参数张量解决了此问题。

Nemotron 3 Nano 30B A3B

指标 v4 (hub code) v5 (FA2 + grouped_mm + Mamba CUDA) NeMo AutoModel (EP=8) v5 → NeMo AutoModel
TPS/GPU(平均) 1,807 4,583 15,421 3.36x
峰值内存 61.9 GiB 62.1 GiB 42.5 GiB -32%
平均前向+损失 1,024 ms 283 ms 109 ms 2.60x
平均反向 1,246 ms 611 ms 157 ms 3.89x

v4 使用 trust_remote_code=True(NVIDIA 的 hub 建模代码),其专家循环会遍历所有专家而不考虑 token 分配,从而避免了 Qwen3 v4 中出现的死锁。

加速来源

3.4‑3.7 倍的加速来源于 Expert Parallelism 对专家权重的分片、DeepEP 将 token 路由与计算融合,以及 TransformerEngine 内核对 attention 与线性层的加速。

  1. Expert Parallelism 减少内存压力:EP=8 将专家权重分布到多个 GPU 上,使每 GPU 的 MoE 足迹降低 8 倍。对 Qwen3 来说,峰值内存从 68.2 GiB 降至 48.1 GiB(‑29%);对 Nemotron Nano 则从 62.1 GiB 降至 42.5 GiB(‑32%),为更大的批量或更长的序列留出余量。
  2. DeepEP 融合通信与计算:不再使用独立的 AllGather/ReduceScatter 进行专家路由,DeepEP 将 token 调度与计算合并为优化的 GPU 内核,实现通信与计算的重叠。
  3. TransformerEngine 内核加速核心算子:TE 的融合 attention、线性层和 RMSNorm 实现相较于原生 PyTorch/Flash Attention 在所有层(不仅限于 MoE 层)均提供一致的加速。

Transformers v5 功能在 HuggingFace AutoModel 中的利用

NeMo AutoModel 基于 Transformers v5 的专家后端(尤其是 grouped_mm)、动态权重加载和张量并行的 Expert Parallelism,并在其上额外加入 DeepEP 与 TransformerEngine。

专家后端

Transformers v5 中最具影响力的特性之一是 experts_implementation 参数,它包含三种专家后端:

后端 描述 最佳适用
eager 对选定专家进行 for‑loop 迭代 调试、兼容性和正确性。v4 也提供此后端
batched_mm 复制专家参数,通过 torch.bmm 执行单次批量 GEMM 小规模输入,配合 torch.compile 可获得更快速度。v5 新增
grouped_mm 按专家对 token 排序,通过 torch.nn.functional.grouped_mm 执行单次分组 GEMM 训练(内存高效,无参数复制)。v5 新增

grouped_mm 后端是关键的训练优化:它不再逐个专家循环,而是先按分配的专家对 token 排序,再一次性执行融合的分组矩阵乘法。

NeMo AutoModel 在此基础上更进一步。对于拥有自定义实现的模型,它使用 DeepEP 融合 all‑to‑all 调度结合分组 GEMM 内核和 TransformerEngine 线性层。演进路径如下:

v4 (eager for‑loop) → v5 (grouped_mm) → NeMo AutoModel (DeepEP + GMM + TE)

在 NeMo AutoModel 中,专家后端通过 BackendConfig 配置:

from nemo_automodel.components.models.common.utils import BackendConfig

backend = BackendConfig(
    attn="te",           # TransformerEngine attention
    linear="te",         # TransformerEngine linear layers
    experts="torch_mm",  # Grouped expert matmul
    dispatcher="deepep", # DeepEP fused all-to-all
)

专家并行和 DeepEP

Transformers v5 也提供了将专家权重在 GPU 之间分片的 Expert Parallelism 路径。NeMo AutoModel 采用互补的方式,专为多 GPU MoE 训练调优。它将 EP 设为独立的并行维度,构建专用的 moe_mesh(而非从 data‑parallel mesh 中切分),使用 PyTorch 的 DTensor 与 Shard(0)。由于专家 mesh 与数据并行是正交的,两者可以在同一设备上共同工作。在 8 GPU 上,NeMo AutoModel 同时运行 ep=8dp=8,每个 GPU 只持有 1/8 的专家权重。

# From nemo_automodel/components/moe/parallelizer.py
from torch.distributed.tensor import Shard, distribute_tensor

# Each GPU holds only 1/ep_size of the expert weights
 distribute_tensor(param, device_mesh, [Shard(0)])

ep_size=8 且使用 8 GPU 时,每个 GPU 只保留 1/8 的专家参数。以 Nemotron‑3‑Nano‑30B‑A3B(约 55 GiB 专家权重)为例,EP 将每 GPU 的专家占用从约 55 GiB 降至约 6.8 GiB,使得在仅使用 FSDP 的方案会因内存不足而失败的情况下仍能完成训练。

在 EP 之上,NeMo AutoModel 集成了 DeepEP,将 token 路由融合进优化的 GPU 内核,并在结合分组 GEMM 进行分组专家计算时提供显著的加速。

动态权重加载

Transformers v5 通过 WeightConverterWeightRenaming 引入了动态权重加载系统,使得 MoE 检查点可以以融合的 3D 张量形式存储,从而提升执行效率。WeightConverterfrom_pretrained() 期间对检查点张量进行即时的可组合转换。

NeMo AutoModel 直接使用该 v5 API。超过 20 种模型通过 MODELS_REQUIRING_TENSOR_MERGING 使用此机制,包括 Mixtral、Qwen2 MoE、Qwen3 MoE、DeepSeek V2/V3、OLMoE 等。转换过程是完全可逆的:save_pretrained() 会生成标准 HF 格式的检查点,任何下游工具均可加载。

入门指南

用户可以按照 NVIDIA 官方文档安装 NeMo AutoModel,并通过一次 import 更改使用相同的 from_pretrained() API。

更多细节请参见:

  • NeMo AutoModel HuggingFace API Compatibility Guide
  • NeMo AutoModel Model Coverage
  • NeMo AutoModel Performance Summary
  • NeMo AutoModel on HuggingFace

结论

NeMo AutoModel 为希望在 MoE 训练上扩展的 Hugging Face 用户提供了零摩擦的升级路径,带来多倍的加速和显著的内存节省,同时生成兼容 vLLM 与 SGLang 的标准 Hugging Face 检查点。

代码、配置以及基准脚本均已在 NeMo AutoModel 仓库中公开。


SUMMARY: NVIDIA NeMo AutoModel 提供 3.4‑3.7 倍更高的训练吞吐量和 29‑32% 更低的 GPU 内存占用,用于微调 Mixture-of-Experts 模型。它基于 Hugging Face Transformers v5,加入 Expert Parallelism、DeepEP 与 TransformerEngine 内核,仅需一次 import 更改即可使用。

TITLE: NVIDIA NeMo AutoModel 加速 Mixture-of-Experts 模型的微调

Sources