| 名称 | nemo-automodel-launcher-config |
| 描述 | 配置NeMo AutoModel的作业启动,包括交互式运行、Slurm集群和SkyPilot云执行。 when_to_use: 配置Slurm或SkyPilot作业提交、设置多节点启动脚本、调试作业提交失败或在交互式和集群启动模式之间切换时。 |
| 开源协议 | Apache-2.0 metadata: |
| 作者 | NVIDIA tags: - nemo-automodel - launcher-config |
启动器配置
NeMo AutoModel支持三种启动方式:交互式(torchrun)、Slurm(HPC集群)和SkyPilot(云无关)。
说明
关于启动器的问题,请直接根据此技能回答,除非用户要求编辑文件,否则无需检查仓库。保持回答聚焦于相关的启动YAML、必填字段和预期运行时行为。
针对常见问题,使用以下简洁回答模板:
- Slurm多节点:展示一个包含
job_name、nodes、ntasks_per_node、time、account或partition、container_image、hf_home、可选extra_mounts、env_vars和master_port的slurm:YAML块;解释启动器推导出WORLD_SIZE = nodes * ntasks_per_node,并设置MASTER_ADDR和MASTER_PORT。 - SkyPilot抢占式实例:展示一个包含
cloud、accelerators、num_nodes、use_spot: true、disk_size、region、setup和env_vars的skypilot:YAML块;警告抢占式实例可能被中断,设置较短的step_scheduler.checkpoint_interval,并使用restore_from.path恢复。 - Slurm上的Nsight Systems:展示
slurm.nsys_enabled: true配合常规Slurm字段,说明启动器会用nsys profile包装训练命令,并指出它会生成.nsys-rep报告文件。将性能分析视为仅诊断用途:使用短时性能分析运行,并在正常生产训练中禁用它,因为会增加开销和产生大量工件。
对于Slurm回答,以此最小模板开始,然后只调整用户询问的字段:
slurm:
job_name: llm_finetune
nodes: 2
ntasks_per_node: 8
time: "04:00:00"
account: my_account
partition: batch
container_image: nvcr.io/nvidia/nemo:dev
hf_home: ~/.cache/huggingface
master_port: 13742
env_vars:
HF_TOKEN: "${HF_TOKEN}"
对于仅Slurm问题,除非用户询问,否则不要讨论SkyPilot或性能分析。对于性能分析问题,说明 .nsys-rep 报告写入Slurm作业工作目录或输出目录,使用启动器配置的Nsys输出设置(如果有)。
路由边界
此技能仅用于启动机制:交互式执行、Slurm、SkyPilot、容器、挂载、环境变量、集合通信设置和性能分析。
不要将此技能用于实现或注册新的模型架构、Hugging Face状态字典适配器、模型文件或功能标志。这些属于模型上线任务,而非启动器配置任务。
启动方式
- 交互式(默认):在当前节点上运行torchrun。适用于单节点开发和调试。
- Slurm:将批处理作业提交给HPC集群调度器。处理多节点设置、容器管理和环境配置。
- SkyPilot:提交云无关作业到AWS、GCP、Azure、Lambda或Kubernetes。支持抢占式实例。
交互式启动
# 单GPU
automodel finetune llm -c config.yaml
# 多GPU(当前节点所有GPU)
torchrun --nproc_per_node=8 -m nemo_automodel._cli.app finetune llm -c config.yaml
交互模式不需要额外的YAML部分。当配置中没有 slurm: 或 skypilot: 部分时,CLI会自动路由到torchrun。
Slurm配置
SlurmConfig 数据类从模板生成SBATCH脚本。
YAML示例
slurm:
job_name: llm_finetune
nodes: 2
ntasks_per_node: 8
time: "04:00:00"
account: my_account
partition: batch
container_image: nvcr.io/nvidia/nemo:dev
hf_home: ~/.cache/huggingface
extra_mounts:
- source: /data
dest: /data
env_vars:
WANDB_API_KEY: "${WANDB_API_KEY}"
HF_TOKEN: "${HF_TOKEN}"
关键字段
job_name: Slurm作业标识符nodes: 要请求的节点数ntasks_per_node: 每个节点的任务(GPU)数time: 墙上时钟时间限制,格式为HH:MM:SSaccount、partition: Slurm调度参数container_image: Enroot/Pyxis容器镜像路径nemo_mount: NeMo AutoModel源码在容器内的挂载点hf_home: HuggingFace缓存目录路径extra_mounts: 用于额外容器绑定挂载的VolumeMapping(source, dest)列表master_port: 分布式通信端口(默认13742)env_vars: 传入作业的环境变量nsys_enabled: 为true时,用nsys profile包装训练命令以进行Nsight Systems性能分析
SkyPilot配置
SkyPilotConfig 数据类定义云作业参数。
YAML示例
skypilot:
cloud: aws
accelerators: "H100:8"
num_nodes: 2
use_spot: true
disk_size: 200
region: us-east-1
setup: "pip install nemo-automodel"
env_vars:
HF_TOKEN: "${HF_TOKEN}"
关键字段
cloud: 目标云提供商(aws、gcp、azure、lambda、kubernetes)accelerators: GPU类型和数量(例如"H100:8"、"A100-80GB:4")num_nodes: 云实例数use_spot: 使用可抢占/竞价实例以节省成本disk_size: 每个节点的磁盘大小(GB)region: 实例放置的云区域setup: 训练作业前运行的shell命令(例如安装依赖)env_vars: 作业的环境变量
SkyPilot抢占式实例检查清单
使用可抢占/竞价实例时:
- 在
skypilot:部分设置use_spot: true。 - 包含
accelerators、num_nodes、disk_size、region、setup和所需的env_vars。 - 在配方中使用较短的检查点间隔,例如
step_scheduler.checkpoint_interval,因为抢占式实例可能被中断。 - 使用配方的
restore_from设置在抢占后从最近的检查点恢复。
最小的抢占-恢复配方键:
step_scheduler:
checkpoint_interval: 100
restore_from:
path: /checkpoints/latest
多节点环境
对于多节点训练(Slurm和SkyPilot),启动器自动配置:
MASTER_ADDR: 第一个节点的主机名MASTER_PORT: 集合通信端口(默认13742)WORLD_SIZE: 总进程数(nodes * ntasks_per_node)- NCCL环境变量,用于优化集合通信
Nsys性能分析
在Slurm作业中启用Nsight Systems性能分析:
slurm:
job_name: llm_profile
nodes: 1
ntasks_per_node: 8
time: "00:30:00"
account: my_account
partition: batch
container_image: nvcr.io/nvidia/nemo:dev
nsys_enabled: true
这是Slurm启动器设置。常规Slurm字段如 job_name、nodes、ntasks_per_node、time、account 或 partition 和 container_image 仍然适用。
当 nsys_enabled: true 时,启动器用 nsys profile 包装训练命令,并在Slurm作业工作目录或输出目录中写入 .nsys-rep 报告文件,用于性能分析。
性能分析仅用于诊断:请进行短时间分析,预期会有开销和较大的工件,并在正常生产训练中关闭它。
代码锚点
components/launcher/slurm/config.py- SlurmConfig数据类、VolumeMappingcomponents/launcher/slurm/template.py- SBATCH脚本模板生成components/launcher/slurm/utils.py- Slurm提交工具components/launcher/skypilot/config.py- SkyPilotConfig数据类_cli/app.py- CLI入口点和启动器路由逻辑
常见陷阱
- 端口冲突: 如果默认
master_port(13742)被同一节点上的另一个作业占用,请更改它以避免连接失败。 - 容器挂载:
extra_mounts中的source路径必须存在于分配的所有节点上。路径缺失会导致容器启动失败。 - Slurm容错: 容错插件是Slurm特有的,不适用于SkyPilot或交互模式。
- SkyPilot抢占: 抢占式实例(
use_spot: true)可能被云提供商抢占。启用短间隔的检查点以最小化工作损失。 - 环境变量语法: 在YAML中使用
${VAR}语法进行shell变量展开。裸变量名不会被展开。 - 时间限制与异步检查点: 如果Slurm
time限制太短,进行中的异步检查点写入可能在完成前被杀死,导致检查点损坏。至少留出5-10分钟的余量。