我想提交一个数组作业来处理 100 个任务,每个任务只使用一个 CPU。我可以访问具有 10 个节点和 24 个内核的集群,每个节点都激活了超线程。我通过--array=1-100%24尝试将所有作业保留在单个节点中并将集群的其余部分留给其他用户来限制并发作业的数量,但是这 24 个任务在任意数量的节点中执行。我已经尝试--nodes=1或--distribution=block:block覆盖循环分布,但都没有成功:24 个同时运行的任务在多个节点中运行。
在 stackoverflow 中浏览我看到了一个较旧的问题,它通过提供要排除的节点列表来解决它。它对我有用,但我认为它违背了使用作业调度程序来优化集群使用的想法。
这是我用来解决此问题的示例脚本。
非常感谢,巴勃罗
#!/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
Run Code Online (Sandbox Code Playgroud)
我假设其他用户也更喜欢拥有整个节点来完成他们的工作。因为大多数时候,管理员更喜欢作业阵列能够用单 CPU 作业来填补空白。
您可以尝试使用选项--exclusive=user。这样,slurm 将为阵列中要启动的第一个作业保留一个完整节点,然后将所有其他作业安排在同一台计算机上,因为那里只允许您的作业。
另一种选择是将 24 个作业打包成一个包含 24 个任务的作业,并请求--nodes=1和--tasks-per-node=24,并srun在提交脚本中使用来运行 24 个任务。