SLURM 每个节点提交多个任务?

SLURM Submit multiple tasks per node?

我发现了一些非常相似的问题,这些问题帮助我得出了一个似乎有效的脚本,但是我仍然不确定我是否完全理解为什么,因此提出了这个问题..

我的问题(示例):在 3 个节点上,我想在每个节点上 运行 12 个任务(总共 36 个任务)。此外,每个任务都使用 OpenMP,并且应该使用 2 个 CPU。在我的例子中,一个节点有 24 个 CPU 和 64GB 内存。我的脚本是:

#SBATCH --nodes=3
#SBATCH --ntasks=36
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=2000

export OMP_NUM_THREADS=2

for i in {1..36}; do
    srun -N 1 -n 1 ./program input${i} >& out${i} &
done

wait

这似乎按我的要求工作,连续 运行 在一个节点上执行任务,直到该节点上的所有 CPU 都在使用中,然后继续 运行 在下一个节点上执行进一步的任务,直到再次使用所有 CPU,等等。

我的问题..我不确定这是否真的是它的作用(?),因为我没有完全理解 s运行 的手册页关于 -n 的内容,而且我还没有使用过s运行 之前。 我的困惑主要来自“-n”:在 -n 的手册页中它说 "The default is one task per node, ..",所以我预计如果我使用 "srun -n 1" 每个节点上只有一个任务 运行 ,这似乎并非如此。 此外,当我尝试例如"srun -n 2 ./program" 它似乎只是 运行 完全相同的程序两次作为两个不同的任务,无法使用不同的输入文件..我想不出为什么它会有用?

除了必须使用 srun 的 --exclusive 选项外,您的设置是正确的(在本例中与 sbatch 的含义不同)。

至于您关于 srun 有用性的评论,程序的行为可以根据环境变量 $SLURM_TASK_ID 或 MPI 程序的等级来更改。您的困惑源于这样一个事实,即您的程序不是并行编写的(来自 2 个 OMP 线程),而 srun 是为了启动并行程序,大部分时间基于 MPI.

另一种方法是 运行 一次完成所有任务。 由于输入和输出文件取决于排名,因此需要包装器

您的 SLURM 脚本将是

#SBATCH --nodes=3
#SBATCH --ntasks=36
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=2000

export OMP_NUM_THREADS=2

srun -n 36 ./program.sh

你的包装器 program.sh 将是

#!/bin/sh

exec ./program input${SLURM_PROCID} > out${SLURM_PROCID} 2>&1