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
我发现了一些非常相似的问题,这些问题帮助我得出了一个似乎有效的脚本,但是我仍然不确定我是否完全理解为什么,因此提出了这个问题..
我的问题(示例):在 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