将Slurm数组任务限制在单个节点中

时间:2018-09-18 09:29:48

标签: slurm

我想提交一个数组作业以包含100个任务,每个任务仅使用一个cpu。我可以访问一个群集,该群集具有10个节点和24个核心,每个节点均已激活超线程。我用--array=1-100%24限制了并发作业的数量,试图将所有作业保留在单个节点中,并让集群的其余部分留给其他用户使用,但是这24个任务在任意数量的节点中执行。我尝试使用--nodes=1--distribution=block:block来覆盖循环分布,但都失败了:24个同时执行的任务在一个以上的节点上运行。

浏览stackoverflow我看到一个older question通过给出要排除的节点列表来解决它。它对我有用,但我认为这与使用作业调度程序优化集群使用的想法不符。

这是我用来解决此问题的示例脚本。

非常感谢, 巴勃罗

#!/bin/sh  
#SBATCH --cpus-per-task=1 
#SBATCH --ntasks=1
#SBATCH --output=output/test.log_%A_%a.out
#SBATCH --error=output/test.log_%A_%a.err 
#SBATCH --array=1-100%48
#SBATCH --distribution=block:block
#SBATCH --nodes=1

# Display all variables set by slurm
env | grep "^SLURM" | sort

# Print hostname job executed on.
echo
echo "My hostname is: $(hostname -s)"
echo

sleep 30

1 个答案:

答案 0 :(得分:0)

我假设其他用户也希望拥有整个节点来完成他们的工作。因为大多数时候,管理员会更喜欢作业数组,以便能够填补单CPU作业的空白。

您可以尝试使用选项--exclusive=user。这样,slurm将为第一个作业保留一个完整的节点,以在阵列中开始该作业,然后将所有其他作业安排在同一台计算机上,因为只有您的作业才被允许在那儿。

另一种选择是将24个作业打包成一个包含24个任务的作业,并请求--nodes=1--tasks-per-node=24,然后在提交脚本中使用srun来运行24个任务。