有没有一种方法可以在使用Slurm的群集中单独使用CPU?

问题描述

我一直在使用由200个节点组成的集群,每个集群具有32个核心,以模拟随机过程。

我必须对同一个系统进行大约10,000个仿真,因此我将在一个节点的32个核心中运行相同的仿真(具有不同的RNG种子),直到它完成所有10,000个仿真为止。 (每个模拟完全独立于其他模拟)

这样做的时候,根据种子的不同,一些仿真要比其他仿真花费更多的时间,一段时间后,我通常会分配给我整个节点,但只运行一个内核(因此,我不必要地占用了31个内核)。

在我的委托脚本中,我有这个:

# Specify the number of nodes(nodes=) and the number of cores per nodes(tasks-pernode=) to be used
#SBATCH -N 1
#SBATCH --ntasks-per-node=32

...

cat list.dat | parallel --colsep '\t' -j 32 ./main{}  > "Results/A.out"

它一次在同一节点中运行32个./main,直到使用了list.dat的所有行(10000行)。

是否有办法将未使用的内核释放给其他工作? 我是否有办法将这32个作业发送到随机节点,即一个作业提交使用(可能)不同节点中的最多32个核心(目前是免费的)?

谢谢!

解决方法

如果将群集配置为在作业之间共享计算节点,则一种选择是提交10000个作业job array。提交脚本如下所示(未试用):

#SBATCH -N 1
#SBATCH --ntasks-per-node=1
#SBATCH --array=1-10000

cat list.dat | sed -n "${SLURM_ARRAY_TASK_ID} p" | xargs -I{} ./main{}  > "Results/A.out_${SLURM_ARRAY_TASK_ID}"

然后,每个模拟将彼此独立地进行调度,并使用群集中的所有空闲核心,而不会留下已分配但未使用的核心。

与提交1万个独立作业相反,作业数组将使您可以使用单个命令来管理所有作业。而且,作业阵列比单个作业对调度程序的负担要少得多。

如果作业阵列中允许的作业数量受到限制,则可以像现在一样,将多个模拟顺序或并行打包到同一作业中,但是最多可以有8个核心或12。

#SBATCH -N 1
#SBATCH --ntasks-per-node=12
#SBATCH --array=1-10000:100

cat list.dat | sed -n "${SLURM_ARRAY_TASK_ID},$((SLURM_ARRAY_TASK_ID+99)) p" | parallel --colsep '\t' -j 12 ./main{}  > "Results/A.out_${SLURM_ARRAY_TASK_ID}"