如何在SLURM中让单作业多任务分配至不同类型节点
SLURM单作业多任务跨不同节点类型分配实现方法
针对你需要单作业拆分的两个任务分别跑在lpn和hpn节点的需求,以下是两种可行方案:
方案1:使用SLURM异构作业(Heterogeneous Jobs)
SLURM的异构作业特性专门用于单作业内的任务分配到不同配置/类型的节点,完全匹配你的需求。
提交命令示例:
sbatch --job-name=cross-node-task --ntasks=2 --nodes=2 --ntasks-per-node=1 --het-group=0:constraint=lpn --het-group=1:constraint=hpn your_task_script.sh
或者在SLURM脚本中配置:
#!/bin/bash #SBATCH --job-name=cross-node-task #SBATCH --ntasks=2 #SBATCH --nodes=2 #SBATCH --ntasks-per-node=1 # 定义第0个节点组使用lpn类型节点 #SBATCH --het-group=0:constraint=lpn # 定义第1个节点组使用hpn类型节点 #SBATCH --het-group=1:constraint=hpn # 此处执行你的任务逻辑,每个任务会自动分配到对应组的节点 srun --ntasks=1 task1.sh & srun --ntasks=1 task2.sh & wait
说明:--het-group参数明确指定每个节点组的约束条件,强制SLURM为每个组分配对应类型的节点,避免调度优化导致的同节点分配。
方案2:在作业脚本内用srun分别指定节点约束
如果你的集群使用较旧SLURM版本不支持异构作业,可以在主作业脚本内通过srun单独指定每个任务的节点约束,同时强制SLURM分配2个节点。
SLURM脚本示例:
#!/bin/bash #SBATCH --job-name=cross-node-task #SBATCH --ntasks=2 #SBATCH --nodes=2 # 允许调度lpn或hpn类型的节点 #SBATCH --constraint="lpn|hpn" # 启动第一个任务到lpn节点 srun --constraint=lpn --ntasks=1 task1.sh & # 启动第二个任务到hpn节点 srun --constraint=hpn --ntasks=1 task2.sh & wait
说明:--nodes=2强制SLURM分配两个独立节点,配合--constraint="lpn|hpn"确保节点覆盖两种类型,再通过srun的--constraint将每个任务绑定到对应类型节点。
为什么之前的方法无效
你之前尝试的nodelist或单一constraint参数无法生效,是因为SLURM默认调度策略会尽量将任务紧凑分配到同一节点以提高资源利用率。必须通过--nodes=2强制多节点分配,或用异构作业明确节点组约束,才能绕过这个优化逻辑。
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

