You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Slurm中为不同节点设置不同任务数?异构作业遇阻

解决Slurm异构节点任务精确分配问题

场景

现有两个计算节点:

  • node1:64核
  • node2:48核
    需实现:node1运行63个任务,node2运行1个任务,此前尝试的多种配置均失败,以下是可行解决方案。

可行方案

1. 直接使用--ntasks-per-node的节点映射语法

Slurm支持通过逗号分隔的数值对,与--nodelist配合精确指定每个节点的任务数,这是最直接的异构分配方式:

# 命令行提交
sbatch --nodes=2 --ntasks-per-node=63,1 --nodelist=node1,node2 your_job.sh

或者在作业脚本中配置:

#!/bin/bash
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=63,1
#SBATCH --nodelist=node1,node2

# 执行任务
srun your_task_executable

注意:--ntasks-per-node的数值顺序必须与--nodelist的节点顺序完全对应,第一个数值对应node1,第二个对应node2。

2. 拆分srun任务实现节点绑定

如果上述方法因集群配置限制无法生效,可以在独占节点后,通过多个srun分别指定节点和任务数:

#!/bin/bash
#SBATCH --exclusive
#SBATCH --nodelist=node1,node2
#SBATCH --ntasks=64
#SBATCH --cpus-per-task=1

# 在node1启动63个任务,后台运行
srun --nodes=1 --ntasks=63 --nodelist=node1 your_task_executable &

# 在node2启动1个任务,后台运行
srun --nodes=1 --ntasks=1 --nodelist=node2 your_task_executable &

# 等待所有任务完成
wait

这种方式通过独立的srun指令控制每个节点的任务数,避免Slurm自动调度的均分逻辑。

3. 自定义hostfile配合全局任务数指定

创建自定义hostfile(比如命名为custom_hosts.txt),格式为每行节点名 slots=任务数:

node1 slots=63
node2 slots=1

然后提交作业时指定该hostfile并设置总任务数:

sbatch --ntasks=64 --hostfile=./custom_hosts.txt your_job.sh

或者直接用srun执行任务:

srun --ntasks=64 --hostfile=./custom_hosts.txt your_task_executable

注意:部分集群可能禁用自定义hostfile功能,需确认集群权限配置。

4. 作业数组拆分节点任务

如果任务是独立可拆分的,可以用作业数组实现节点分配:

#!/bin/bash
#SBATCH --array=1-64
#SBATCH --nodelist=node1,node2
#SBATCH --cpus-per-task=1

# 根据数组ID分配节点
if [ $SLURM_ARRAY_TASK_ID -le 63 ]; then
    srun --nodelist=node1 your_task_executable
else
    srun --nodelist=node2 your_task_executable
fi

这种方式适合批量独立任务,通过数组ID区分任务运行节点,需确保集群调度器不会强制均分任务。

注意事项

  • 所有配置的任务数不能超过节点的可用核数(node1≤64,node2≤48),否则会触发分配错误。
  • 避免在同一个作业中同时设置冲突的参数(如同时指定--ntasks和--ntasks-per-node的全局值)。
  • 若集群有节点任务数上限,需联系管理员确认或调整配置。

内容的提问来源于stack exchange,提问作者amdnim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:19:57