跳到正文
北京时间
原文
Hugging Face:Blog(RSS)·· 2026-06-25精选AI 评分66

NVIDIA NeMo AutoModel:一行代码加速Transformer MoE模型微调

Accelerating Transformers Fine-Tuning with NVIDIA NeMo AutoModel

AI 导读

NVIDIA NeMo AutoModel 是基于 Transformers v5 的开源库,添加 Expert Parallelism、DeepEP 融合 all-to-all 调度和 TransformerEngine 内核。在 MoE 模型微调中,相比原生 v5,训练吞吐量提升 3.4–3.7 倍,GPU 内存减少 29–32%,仅需改动一行 import。在 16 节点 128 张 H100 上全微调 Nemotron 3 Ultra 550B A55B 时,v5 因内存不足无法运行,而 AutoModel 凭借 EP=64 专家并行使训练可行。单节点 30B MoE 模型(如 Qwen3-30B-A3B)同样获得可量化的性能优势。

推荐理由

英伟达的 NeMo AutoModel 把 MoE 模型微调速度提高了三倍多,内存省了近三分之一,代码只需改一行 import,做训练的可以立刻升级。

正文 · AI 翻译

v5 带来了 MoE 基础能力:专家后端、动态权重加载以及分布式执行,使 MoE 具备可扩展性,并易于在其之上进行构建。

NVIDIA NeMo AutoModel 是 NVIDIA NeMo 框架 中的开源库,用于大规模构建自定义生成式 AI 模型。NeMo AutoModel 干净地构建在 v5 之上,新增了专家并行、DeepEP 融合 all-to-all 分发以及 TransformerEngine 内核,并依托 v5 的动态权重加载,将这些优化带给广泛且不断增长的模型系列。其收益是:在微调 MoE 模型时,相比原生 Transformers v5,训练吞吐量提升 3.4-3.7 倍,GPU 内存占用减少 29-32%,且使用相同的 from_pretrained() API:只需一行 import,无需其他代码改动。

本博客详细介绍了这一组合如何运作,以及用户如何在不改动 API 的情况下更快地微调 MoE 模型。

背景

MoE 模型的兴起为高效训练带来了新的挑战:在数百个专家之间路由 token、将专家矩阵乘法融合进单个内核、跨 GPU 分片权重,以及让通信与计算重叠,这些都需要通用库开箱即用能力之外的基础设施。

Transformers v5(“v5”)引入了一流的 MoE 支持,例如专家后端、动态权重加载,以及用于分布式执行的张量并行方案。此外,v5 通过将 PyTorch 的 DeviceMesh 直接集成到 from_pretrained() 中,使分布式训练成为一等公民。

NeMo AutoModel 构建在 v5 之上,通过继承 AutoModelForCausalLM,并加入专家并行(EP)、DeepEP 融合 all-to-all 分发以及 TransformerEngine 内核。DeepEP 是 v5 目前尚不具备的部分:它将通信与专家计算重叠。而且由于 NeMo AutoModel 借助 v5 的可逆权重转换来加载每个模型,它可以将工程精力集中在这些可复用的核心算子上,而不是为每个模型单独处理检查点管道,同时 save_pretrained() 仍会输出标准的 HF 检查点,供 vLLM 和 SGLang 等工具加载。

下一节将介绍两者如何协同工作,以及我们测得的性能提升,从跨 16 个节点对 NVIDIA Nemotron 3 Ultra 550B A55B 进行全量微调,一直到单节点模型,如 Qwen3-30B-A3B 和 Nemotron 3 Nano 30B A3B。

NeMo AutoModel:相同的 API,更强的性能

NeMo AutoModel 的目标之一是与 HuggingFace Transformers 实现 API 兼容,以赋能开源社区。NeMoAutoModelForCausalLM 继承自 AutoModelForCausalLM,因此任何适用于 HF 模型的代码也同样适用于 AutoModel。

下面是在两者中加载模型的样子。只有导入语句不同:

这一个导入语句做了很多工作。对于像 Qwen3、NVIDIA Nemotron、GPT-OSS 和 DeepSeek V3 这样的热门 MoE 架构,NeMo AutoModel 提供了手工调优的实现,包含 TransformerEngine 注意力、融合线性层和自定义专家 kernel。对于其他所有情况,它会回退到原版 HF,同时仍然应用诸如 Liger kernel 补丁等优化。而且无论走哪条路径,得到的模型都可以直接扩展:传入一个 device_mesh,你就能进行多 GPU 训练,无需进一步改写。

NeMo AutoModel 真正出彩的地方,是将 MoE 模型扩展到多 GPU 训练。要用专家并行在 8 个 GPU 上训练 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()

这通过 FSDP2、专家并行、TransformerEngine kernel 和 DeepEP 调度带来了速度、可扩展性和内存优化,全都来自一次 from_pretrained() 调用。

性能对比

我们在两种场景下评估了 NeMo AutoModel:在 16 个节点上对前沿规模的 550B 模型进行全量微调,以及在单个节点上训练两个 30B MoE 模型。550B 的结果表明为什么专家并行在大规模下至关重要;30B 的结果量化了相对 Transformers v5 的每 GPU 加速比。

Nemotron 3 Ultra 550B A55B(全量微调,多节点)

Nemotron 3 Ultra 550B A55B 是一个 550B 参数的混合模型,搭载 Mamba2、LatentMoE 和多 Token 预测(MTP)。我们对全量微调进行了基准测试:每个参数都会被更新,Adam 优化器状态也会被实际物化,在这一规模下需要16 个 H100 节点(128 块 GPU)。

方法:

参数 值
硬件 16x H100 80GB(128 块 GPU)
专家并行 EP=64
本地批大小 2
序列长度 4,096
特性 MTP、激活检查点、融合线性交叉熵
内核 DeepEP dispatch + torch_mm experts + TransformerEngine
指标 NeMo AutoModel(EP=64)
TPS/GPU(平均) 815
TFLOP/s/GPU ~293
峰值内存 58.2 GiB

为什么没有 Transformers v5 这一列。 Transformers v5 在此规模下会内存耗尽,因此这里没有 v5 的数据可报告。AutoModel 的专家并行(Expert Parallelism)将专家分片到多块 GPU 上,使内存占用控制在预算之内,这正是让完整微调得以运行的原因。下面的 30B 对比展示了在 v5 能够运行的场景下同样的优势。

单节点 30B MoE 基准测试

我们在单节点 8x H100 80GB GPU 上对三种方案进行了基准测试:HF Transformers v4(hub 代码)、HF Transformers v5(采用当前可用的最佳优化)以及 NeMo AutoModel(EP=8 + 自定义 kernel)。

方法说明:

参数 值
硬件 8x H100 80GB(单节点)
序列长度 4,096
本地批次大小 1

关于路由门控的说明。下面的 NeMo AutoModel 数据使用了均衡路由门控,它强制 token 在专家之间均匀分布。这模拟了 MoE 训练所趋向的理想工作点:一个训练良好的模型,其负载均衡损失会将专家利用率推向接近均匀,因此均衡路由反映了真实工作负载最终收敛到的稳态(并消除了随机 dummy token 否则会注入专家并行中的长尾噪声)。v4/v5 在相同的 dummy token 上运行其原生路由器。因此,均衡门控测量的是 NeMo AutoModel 在其目标 MoE 工作点上的表现,而 v4/v5 列则反映其开箱即用的行为。

Qwen3-30B-A3B

指标 v4 v5(FA2 + grouped_mm) NeMo AutoModel(EP=8) v5 → NeMo AutoModel
TPS/GPU(平均) 死锁 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

v4 为何会死锁:Transformers v4 将 Qwen3 MoE 专家存储为一个包含 128 个独立 MLP 模块的 ModuleList,每个模块都单独被 FSDP 包装。前向传播使用一个数据依赖的循环,只遍历接收到了 token 的专家。由于每个 rank 上的数据不同,不同 rank 会跳过不同的专家,导致 FSDP 的 AllGather/ReduceScatter 集合通信不匹配,从而无限期挂起。Transformers v5 通过将专家存储为融合的 3D 参数张量修复了这一问题(没有逐专家模块,也没有逐专家 FSDP 集合通信)。

Nemotron 3 Nano 30B A3B

指标 v4(hub 代码) 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 的建模代码)。hub 代码的专家循环是 FSDP 安全的(无论 token 如何分配都会遍历所有专家),因此不会像 Qwen3 v4 那样死锁。

加速从何而来

NeMo AutoModel 相比 Transformers v5 带来的 3.4-3.7x 加速来自三个方面:

  1. 专家并行可降低内存压力。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 将通信与计算融合。DeepEP 不再为专家路由使用单独的 AllGather/ReduceScatter 集合通信,而是将 token 分发与合并融合进优化后的 GPU kernel,使通信与专家计算相互重叠。

  3. TransformerEngine kernel 加速核心运算。TE 的融合注意力、线性层和 RMSNorm 实现,在所有层类型上都比对应的 PyTorch/Flash Attention 实现提供了一致的加速,而不仅仅是 MoE 层。

HuggingFace AutoModel 所利用的 Transformers v5 特性

专家后端

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

后端 描述 最适合
eager 对选中的专家进行 for 循环 调试、兼容性与正确性。同样适用于 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",           
    linear="te",         
    experts="torch_mm",  
    dispatcher="deepep", 
)

专家并行与 DeepEP

Transformers v5 还提供了 专家并行路径。它将专家权重分片到多块 GPU 上。GroupedGemmParallel 风格只加载每块设备的本地专家,而 RouterParallel 则负责路由 token 并通过 all_reduce 合并结果。它巧妙地构建在 v5 现有的张量并行机制之上。启用它后,模型的 tp_plan 会返回其 专家计划,因此专家并行与数据并行共享设备预算(ep × dp = world_size)。对于此处单节点 30B 的基准测试,我们发现普通的数据并行 v5(dp=8,ep=1)是最快的 v5 配置,因此这就是我们报告的 v5 设置。

NeMo AutoModel 采取了一种互补的方法,专为多 GPU MoE 训练而调优。它将 EP 作为独立的并行维度,一个专用的 moe_mesh 与数据并行 mesh 并列(而非从中划分),使用 PyTorch 的 DTensor 配合 Shard(0)。由于专家 mesh 与数据并行正交,二者可以组合在同一批设备上。在 8 块 GPU 上,NeMo AutoModel 同时运行 ep=8 和 dp=8,因此每块 GPU 都在自己的数据分片上训练,同时只持有 1/8 的专家。专家权重沿专家维度在物理上分片到各块 GPU 上。


from torch.distributed.tensor import Shard, distribute_tensor


distribute_tensor(param, device_mesh, [Shard(0)])

在 8 块 GPU 上使用 ep_size=8 时,每块 GPU 只持有 1/8 的专家参数。对于像 Nemotron-3-Nano-30B-A3B 这样拥有约 55 GiB 专家权重的模型,EP 将每块 GPU 的专家占用从约 55 GiB 降至约 6.8 GiB,使得在仅用 FSDP 的方法会耗尽内存的情况下训练成为可能。

在 EP 之上,NeMo AutoModel 集成了 DeepEP,将 token 路由融合进经过优化的 GPU kernel,并与分组 GEMM 结合用于分组专家计算,从而带来显著的加速。在我们的 大规模 MoE 基准测试中,与 all-gather + 循环专家基线相比,DeepEP + 分组 GEMM 在完整的 DeepSeek V3 671B 模型上将每次迭代的成本降低了 47%。

动态权重加载

Transformers v5 还通过 WeightConverter 和 WeightRenaming 引入了 动态权重加载系统。这使得 MoE checkpoint 可以以融合的 3D 张量形式存储,从而实现更高效的执行。WeightConverter 会在 from_pretrained() 期间对 checkpoint 张量即时应用可组合的操作进行转换。

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

快速上手

如需试用 NeMo AutoModel,请访问我们的官方文档页面。

更多详情,请参阅:

结论

对于希望扩大模型训练规模的 HuggingFace 用户来说,NVIDIA NeMo AutoModel 是顺理成章的下一步。AutoModel 直接构建在 Transformers v5 之上,提供了一条零阻力的升级路径:只需改动一行 import,就能获得一个速度提升三倍以上的模型实例。

在 Qwen3-30B-A3B 和 Nemotron 3 Nano 30B-A3B 上,与最佳的 Transformers v5 配置相比,这带来了 3.4-3.7 倍的训练吞吐量提升,同时 GPU 内存占用减少 29-32%。而且,由于真正的专家并行(Expert Parallelism)将专家分片到多块 GPU 上,同一条路径可以扩展到跨 16 个节点对 Nemotron 3 Ultra 这样的 550B 模型进行全量微调——这正是专家并行成为将模型装入内存所必不可少的场景。由于 NeMo AutoModel 的检查点是标准 HF 格式的 safetensors,你可以将它们部署到 vLLM 和 SGLang 等推理框架上。

代码、配置和基准测试脚本均可在 NeMo AutoModel 仓库中获取。

致谢

本工作的核心贡献者,按姓氏字母顺序排列:Adil Asif、Hemil Desai、Alexandros Koumparoulis 和 Huiying Li。

来源:Hugging Face:Blog(RSS) · huggingface.co