将 slurm 阵列任务限制在单个节点中

Keep slurm array tasks confined in a single node

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

在 Whosebug 中浏览我看到 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

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

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

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