我想提交一个数组作业以包含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
答案 0 :(得分:0)
我假设其他用户也希望拥有整个节点来完成他们的工作。因为大多数时候,管理员会更喜欢作业数组,以便能够填补单CPU作业的空白。
您可以尝试使用选项--exclusive=user
。这样,slurm将为第一个作业保留一个完整的节点,以在阵列中开始该作业,然后将所有其他作业安排在同一台计算机上,因为只有您的作业才被允许在那儿。
另一种选择是将24个作业打包成一个包含24个任务的作业,并请求--nodes=1
和--tasks-per-node=24
,然后在提交脚本中使用srun
来运行24个任务。