Transformers 生态下的 NeMo Automodel 微调实战:YAML 驱动的大规模分布式训练与并行策略
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
本文基于 Transformers 官方社区集成文档 nemo_automodel_finetuning.md 展开,讲解如何用 NVIDIA 的 NeMo Automodel 对 LLM/VLM 进行高效微调:你将掌握如何用一个 YAML 文件完整定义模型、数据集、PEFT(LoRA)与分布式并行策略,理解 EP、FSDP2 等并行维度的配置含义,以及 NeMo Automodel 与 TransformersAutoModel/AutoConfigAPI 的底层衔接方式,从而在保留 Hugging Face 生态兼容性的同时获得生产级训练吞吐。
NeMo Automodel 是什么
NeMo Automodel 是 NVIDIA 开源的、以 PyTorch DTensor 为原生基础(DTensor-native)的训练库,面向 LLM 与 VLM 的大规模与小规模预训练和微调,目标是支撑研究实验与生产环境中的快速迭代。它支持多种并行策略:
- FSDP2(Fully Sharded Data Parallel 第二代);
- 张量并行(TP)、流水线并行(PP)、专家并行(EP)、上下文并行(CP)。
为追求高吞吐,它集成了 DeepEP 与 TransformerEngine 的高性能 kernel。与 Transformers 的关系可以概括为:NeMo Automodel 构建在 Hugging Face 模型之上,以AutoModel.from_pretrained式的加载方式为底座,在此基础上做动态的高性能层替换(layer swaps)并支持更细粒度的并行切分(如专家并行),同时对 Transformers 的 API 保持“逐接口对齐”(drop-in compatibility),因此对已习惯 Transformers 工作流的用户是低迁移成本的。
用 YAML 定义一次微调运行
NeMo Automodel 的核心使用方式是:用一份 YAML 配置文件完整描述训练任务,然后由torchrun拉起分布式进程执行。文档给出的完整配置示例如下(以 Nemotron V3 Nano 模型 + HellaSwag 数据集上的 SFT + LoRA 为例):
# Instantiate a Nemotron V3 Nano model model: _target_: nemo_automodel.NeMoAutoModelForCausalLM.from_pretrained pretrained_model_name_or_path: nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16 # Run SFT on HellaSwag dataset: _target_: nemo_automodel.components.datasets.llm.hellaswag.HellaSwag path_or_dataset: rowan/hellaswag split: train # Train PEFT adapters peft: _target_: nemo_automodel.components._peft.lora.PeftConfig exclude_modules: ["*.out_proj"] # mamba layers use custom kernels that take in the out_proj.weight directly, thus lora doesn't work here. dim: 8 alpha: 32 use_triton: True # Use EP + FSDP2 for training distributed: strategy: fsdp2 dp_size: none tp_size: 1 cp_size: 1 ep_size: 4 # ... other parameters完整、参数更全的配置示例可以在 NeMo Automodel 仓库的examples/llm_finetune/nemotron/nemotron_nano_v3_hellaswag_peft.yaml中找到。
配置字段逐项解读
上面示例的每个顶层字段对应训练运行中一个关键决策点:
model段:通过_target_指定nemo_automodel.NeMoAutoModelForCausalLM.from_pretrained,即 NeMo 版的因果语言模型加载入口,pretrained_model_name_or_path指向 HF Hub 上的检查点(示例为nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16,一个 BF16 量化格式的 MoE 模型)。命名上与 Transformers 的AutoModelForCausalLM一一对应——这正是其“跟随 Transformers API”的体现。
dataset段:指定 NeMo 内置的 HellaSwag 数据集组件(nemo_automodel.components.datasets.llm.hellaswag.HellaSwag),数据源为rowan/hellaswag,取trainsplit 做监督微调。
peft段:训练 LoRA 适配器而非全参数,关键参数如下表:
| 参数 | 示例值 | 含义 |
|---|---|---|
dim | 8 | LoRA 低秩矩阵的秩(rank),决定适配器容量与显存/计算开销 |
alpha | 32 | LoRA 缩放系数,有效缩放为alpha / dim,示例中等价于 4 倍缩放 |
use_triton | True | 使用 Triton 实现的 LoRA kernel,提升融合计算效率 |
exclude_modules | ["*.out_proj"] | 排除 LoRA 注入的模块。配置注释给出了明确原因:Nemotron Nano V3 的 mamba 层使用自定义 kernel,该 kernel 直接接收out_proj.weight张量,因此 LoRA 在此处无法正常工作 |
distributed段:定义并行拓扑,详见下一节。
分布式并行策略的配置详解
distributed段的字段直接映射到 NeMo Automodel 支持的各并行维度:
distributed: strategy: fsdp2 # 使用 FSDP2 作为基础数据并行/分片策略 dp_size: none # 不显式分配数据并行度(由总进程数与其他维度推导) tp_size: 1 # 张量并行度为 1(不启用) cp_size: 1 # 上下文并行度为 1(不启用) ep_size: 4 # 专家并行度为 4,MoE 的专家组分布在 4 个 EP rank 上示例的意图(配置注释写明 “Use EP + FSDP2 for training”)是:以 FSDP2 承担权重分片,同时用 4 路专家并行切分 MoE 专家,而 TP/CP 保持 1。这对应了启动命令的进程数:
torchrun --nproc-per-node=4 examples/llm_finetune/finetune.py -c /path/to/yaml即单机 4 个 GPU 进程,恰好与ep_size: 4对齐——每个 rank 持有一部分专家,FSDP2 在其上做分片。需要注意:examples/llm_finetune/finetune.py是NeMo Automodel 仓库中的示例入口脚本,而非本 Transformers 仓库内的路径;使用时需克隆 NeMo Automodel 仓库,并把-c指向你自己准备的 YAML。
作为对照,本仓库的姊妹文档 nemo_automodel_pretraining.md 给出了纯 Python 的等价用法:先dist.init_process_group(backend="nccl"),再用create_distributed_setup_from_config({"strategy": "fsdp2", "ep_size": 8})构造分布式配置,最后调用NeMoAutoModelForCausalLM.from_pretrained(..., dtype=torch.bfloat16, distributed_setup=dist_setup)加载模型,并以torchrun --nproc-per-node=8启动。可以看到 YAML 中distributed段与 Python API 的distributed_setup配置是同构的,两种写法可以互相印证。
与 Transformers 集成的四点设计
文档 “Transformers integration” 一节明确了四个集成要点,它们决定了 NeMo Automodel 能否“无感”接入现有 HF 工作流:
- 覆盖面:Transformers 支持的 LLM/VLM 均可经由 NeMo Automodel 实例化,模型覆盖范围与 Transformers 模型库对齐(详见 NeMo 官方文档的模型覆盖清单);
- 构建方式:基于 HF 模型与
AutoModel.from_pretrained式加载,叠加动态高性能层替换,并支持 EP 等更细粒度的并行切分; - 架构自动识别:检测
AutoConfig.from_pretrained得到的architecture字段,自动加载自定义实现——例如 Nemotron Nano V3 这类在 Transformers 通用实现之外有专门优化的架构,无需用户手写分支; - API 对齐:严格跟随 Transformers 的 API 风格,实现 drop-in 兼容。
仓库内可以验证这种 API 对齐的“底座”:Transformers 侧的AutoModelForCausalLM定义于 modeling_auto.py,与 NeMo 的NeMoAutoModelForCausalLM构成同名概念的直接对应;对于多模态复合模型,Transformers 的AutoModelForCausalLM会自动解包(unwrap)文本子配置——这一点由 gemma3 测试 与 qwen3_5 测试 中的test_automodelforcausallm用例守护(后者还验证了显式dtype参数优先于检查点保存的 dtype 的行为)。换言之,NeMo Automodel 在加载 HF 检查点时依赖的正是这套 Auto 类映射与配置解析机制,因此两者的行为边界与 Transformers 的 Auto 类测试所约束的行为一致。
在 Transformers 生态中的位置与延伸阅读
从文档目录树 _toctree.yml 可以看到,官方将 NeMo Automodel 归入 “Ecosystem integrations” 下的两个小节:
- Pretraining:与 Nanotron、torchtitan 并列;
- Fine-tuning:与 Axolotl、TRL、Unsloth 并列。
如果你的场景是全参数或大规模 MoE 模型的预训练/继续训练,且需要 TP、PP、EP、CP 组合切分与 TransformerEngine/DeepEP kernel,NeMo Automodel 是该目录下的首选入口;若只需常规 PEFT 微调,可先评估 TRL / Unsloth 等更轻量的方案。预训练用法参见姊妹文档 nemo_automodel_pretraining.md,其中展示了 EP+FSDP2 加载 Nemotron V3 Nano 的完整 Python 示例。
实践注意事项
- 依赖前提:NeMo Automodel 是独立于 Transformers 的外部库,需单独安装并具备 CUDA 环境与对应 GPU(示例为单机 4/8 卡);YAML 与
finetune.py入口均来自 NeMo Automodel 仓库,不是本 Transformers 仓库的一部分; exclude_modules要随架构调整:示例中排除*.out_proj是 Nemotron Nano V3 mamba 层 kernel 的硬性限制,换用其他基础模型时应重新评估 LoRA 注入点,避免把 LoRA 挂到自定义 kernel 直接消费的权重上;- 并行维度与进程数要自洽:
torchrun --nproc-per-node=N的N需与distributed段各 size 的组合匹配(如示例中 N=4、ep_size: 4),配置不一致会导致进程组初始化或权重切分失败; - 模型覆盖以官方清单为准:某架构是否被 NeMo Automodel 覆盖、是否有专门的高性能实现(如架构字段自动识别路径),以 NeMo 官方文档的模型覆盖页与基准数据为准,本仓库文档不逐一列出支持矩阵。
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考