| 名称 | tao-run-on-slurm |
| 描述 | 通过SSH在远程SLURM GPU集群上执行作业,使用sbatch/srun、Pyxis/Enroot容器以及Lustre存储。适用于在本地或DGX SLURM集群上运行TAO训练/评估/推理任务。触发短语包括“在SLURM上运行”、“提交sbatch”、“DGX SLURM集群”、“Pyxis/Enroot容器”、“Lustre数据集”。 |
| 开源协议 | Apache-2.0 compatibility: 需要SSH访问SLURM登录节点(基于密钥的免密认证)以及SLURM_USER和SLURM_HOSTNAME环境变量。只有当需要作业句柄、S3 I/O封装或通过ActionWorkflow实现运行目录持久性时,才需要安装带slurm扩展的TAO SDK(pip install ‘nvidia-tao-sdk[slurm]’)。 metadata: |
| 作者 | NVIDIA Corporation |
| 版本 | “0.1.0” allowed-tools: Read Bash tags: - platform - slurm |
SLURM
独立安装? 如果此会话未由TAO技能库插件初始化,请首先运行tao-setup技能(主机预检、凭据、跨技能发现)。
由SLURM管理的集群的远程GPU计算平台。作业从TAO服务或SDK主机通过SSH提交到登录节点,在共享文件系统上暂存,使用sbatch提交,并通过srun容器支持执行。
使用时机
当用户拥有受管GPU集群、共享Lustre存储和调度器拥有的GPU分配时使用SLURM。不要将SLURM用于仅存在于代理机器上的本地文件;数据和输出必须可从集群访问。
预检与SSH
在生成任何启动器或提交任何作业之前,按顺序执行全部五个步骤:
- SSH连接——确认SLURM_USER和SLURM_HOSTNAME已设置,且到登录主机的免密SSH可工作(ssh -o BatchMode=yes)。
- SDK安装——可选安装用于作业句柄和S3包装的TAO SDK包装器(公开PyPI上的nvidia-tao-sdk[slurm])。
- SLURM账户——生成任何脚本前始终通过sacctmgr show associations解析SLURM_ACCOUNT。若未设置且用户只有一个账户,则自动选择。若存在多个账户,则列出并让用户导出一个。账户未验证绝不提交作业——无效账户会在SQSH转换已经运行后导致“无效账户或账户/分区组合”。
- GPU分区——通过sinfo验证SLURM_PARTITION中至少有一个分区存在。打包默认值polar,polar3,polar4,grizzly在CS-OCI-ORD上有效,但其他集群可能不支持。
- Enroot凭据——对于私有nvcr.io镜像,在集群上为每个(集群,用户)安装~/.config/enroot/.credentials。Pyxis/Enroot不从作业环境读取NGC_KEY;没有持久凭据时,受认证保护的拉取会失败并显示“无法处理JSON输入”。使用printf | ssh heredoc,使NGC_KEY值永不落入shell历史、中间文件或聊天输出;绝不cat/echo该值。
如果预检失败,代理提示用户通过Bash授权安装/修复。可pip安装的Python需求例外:自动安装它们,然后重新预检。
参见references/slurm-ssh-credentials.md获取完整预检脚本、账户/分区发现命令、enroot凭据heredoc、前置密钥设置(密钥对、ssh-copy-id、known_hosts、容器密钥挂载、2FA处理)以及SSH失败修复提示。
存储
使用共享文件系统URI而非本地路径或file://路径;tao-core拒绝远程后端的本地/文件路径。
- lustre:///absolute/path 用于Lustre上用户提供的数据集。
- slurm://路径可能出现在微服务元数据中,在容器启动前转换为Lustre路径。
接受数据集根目录(模型技能映射到所需文件)或直接的spec键路径。SSH成功后、生成脚本前,从登录主机test -e每个必需数据集路径;若失败则停止并询问修正或分阶段数据,而不生成会在首个训练任务中失败的脚本。参见references/slurm-ssh-credentials.md了解根目录vs直接spec模式、后端详细信息和results-dir默认值。
容器执行
tao-core通过Pyxis/Enroot运行TAO容器:
- 在<job_dir>/specs、<job_dir>/env和<job_dir>/meta下暂存specs、环境和云元数据的紧凑JSON文件。
- 可选地用srun -n1 -p <conversion_partition> enroot import将Docker镜像转为缓存的SQSH镜像。不要为此步骤使用cpu分区——cpu约30分钟墙钟限制,短于大型TAO镜像的转换时间(9层以上,>30分钟)。使用cpu_long(或≥2小时限制的其他分区),并在构造SlurmSDK前设置SLURM_CONVERSION_PARTITION=cpu_long和SLURM_CONVERSION_TIMEOUT_MINUTES=120。SDK在重用前通过SquashFS魔数验证SQSH,因此失败转换的部分文件会自动拒绝并重新转换,无需手动清理。参见references/slurm-container-execution.md中的“SQSH转换与缓存”章节获取完整环境旋钮表(SLURM_ENROOT_TEMP_PATH用于xattr受限文件系统、内存、force-reconvert)、缓存/去重语义、实时监控命令和手动预暂存。
- 在<job_dir>/sbatch/job_<job_id>.sbatch下写sbatch脚本。
- 提交sbatch --export=ALL <script>。
- 用srun --container-image=<image> --container-mounts=/lustre运行容器。
可接受的镜像格式:/path/to/image.sqsh、registry#image:tag、docker://registry#image:tag和普通registry/image:tag(需要时转为Pyxis形式)。SQSH转换按镜像名缓存;对:latest镜像,除非启用force_reconvert_latest,否则重用缓存SQSH。
监控与取消
调度状态来自通过squeue/sacct保存的SLURM作业ID;TAO终态来自共享结果文件夹中的status.json。启用聊天监控时,按请求间隔持续轮询任何非终态作业(PENDING、RUNNING等)。不要在固定时长(如30分钟)后停止;共享GPU分区长时间排队正常。启用聊天监控时,不要给非终态SLURM作业发送最终响应;最终响应是分离动作,仅当用户要求分离/停止或作业达到终态时使用。日志通过SSH从<job_dir>/slurm-logs/<slurm_job_name>-<slurm_job_id>/main.out和.err读取。取消通过查找backend_details.slurm_metadata.slurm_job_id并在SSH上运行scancel <slurm_job_id>;缺失或已终止作业视为取消成功。
状态映射:PENDING→Pending;RUNNING或COMPLETING→Running;COMPLETED→检查status.json;FAILED、BOOT_FAIL、DEADLINE、OUT_OF_MEMORY、NODE_FAIL→若日志匹配可重试基础设施模式则重试,否则Error;CANCELLED、PREEMPTED、REVOKED→Canceled;TIMEOUT→Error;SUSPENDED、STOPPED→Paused。
必需输入
在SLURM采集时询问;完整凭据列表、微服务schema键和默认值见references/slurm-ssh-credentials.md。
- SLURM_USER(必填):登录节点SSH用户名。
- SLURM_HOSTNAME(必填):逗号分隔的登录主机名用于故障转移。
- SLURM_PARTITION(必填):GPU提交的分区列表。打包默认polar,polar3,polar4,grizzly按4小时队列处理。
- SSH_KEY_PATH(首选,启动前预期):用于非交互式公钥认证的私钥。修复时先问此项,优先于SSH_AUTH_SOCK代理套接字回退。
- SLURM_BASE_RESULTS_DIR(可选):基础共享文件系统路径;默认/lustre/fsw/portfolios/edgeai/users/<your-dir>。
- SLURM_ACCOUNT(预检时解析而非初始采集):用于#SBATCH --account的账户。预检第3步通过sacctmgr自动发现;仅当发现多个账户时才问用户。
除非用户要自定义结果根目录,否则不要在初始采集时询问SLURM_BASE_RESULTS_DIR。
资源默认值
来自tao-core的默认值:num_nodes:1;num_gpus:4;max_num_gpus_per_node:8;cpus_per_task:16;time_hours:4;timeout_hours:3.8;max_time_hours:4;container_mounts:/lustre;use_requeue:true;use_sqsh:true。
为SLURM生成启动器或包装脚本时,按打包的平台资源默认值显式设置墙钟默认值:
export SLURM_TIME_HOURS=“${SLURM_TIME_HOURS:-4}” export SLURM_TIMEOUT_HOURS=“${SLURM_TIMEOUT_HOURS:-3.8}”
不要在SLURM上默认12小时。若用户提供更长SLURM_TIME_HOURS,提交前验证所选分区支持。对打包默认分区列表polar,polar3,polar4,grizzly,拒绝超过4小时的请求;仅当用户确实要更长墙钟时才要求不同分区。
当num_gpus >= max_num_gpus_per_node时,处理器按每节点独占处理,并在必要时根据GPU总数计算额外节点。
多节点、SDK与重试
多节点作业(num_nodes>1)时,SDK构建sbatch指令并自动导出PyTorch分布式集合环境变量:WORLD_SIZE、NUM_GPU_PER_NODE、NODE_RANK、MASTER_ADDR、MASTER_PORT(29500)。TAO入口读取WORLD_SIZE+NUM_GPU_PER_NODE并在内部构建torchrun。Cosmos-RL对controller、policy、rollout worker有专门多节点角色处理。
对SLURM作业输入使用Lustre而非S3。GPU分配在作业派发时立即开始,因此脚本顶部长时间s3://下载会烧掉分配、可能因GPU空闲被杀且仍计费。先在共享文件系统暂存训练数据并引用为lustre:///…。S3/HF/NGC预取适合小型辅助输入(checkpoint、config),不适合训练数据集。K8s/Brev没有此调度器空闲约束。
基础设施故障(NODE_FAIL、BOOT_FAIL、NCCL传输超时、CUDA驱动初始化失败、GPU/IB链路断、OOM-killer节点回收、Xid错误)的自动重试在SDK中自动发生,并在重试间保持稳定用户可见Job.id。纯训练失败立即暴露,因此坏spec不会消耗重试预算。默认通过SLURM_USE_REQUEUE=true启用#SBATCH --requeue。
完整多节点环境变量/sbatch指令细节和表格、集群要求、可选TAO SDK路径(SlurmSDK、build_entrypoint、ActionWorkflow)及代码、Lustre非S3规则和故障模式清单见references/slurm-container-execution.md;references/slurm-execution-sdk.md涵盖MAX_JOB_RETRIES重试预算。SDK范围内时读tao-skill-bank:tao-run-platform获取SlurmSDK kwarg参考。
参考资料
- references/slurm-ssh-credentials.md — 预检脚本、SSH/密钥设置、enroot凭据、完整凭据列表、后端详情、存储规则、SSH修复提示。
- references/slurm-container-execution.md — 容器执行步骤、监控、状态映射、取消、多节点细节、SDK使用、Lustre-not-S3、自动重试、故障模式。
- references/slurm-preflight-storage.md — 扩展预检/存储注释。
- references/slurm-execution-sdk.md — 扩展执行/SDK注释。
- references/detailed-guide.md — 拆分参考导航图。