1

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

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

在这样做时,根据种子的不同,一些模拟需要比其他模拟更多的时间,一段时间后,我通常会分配给我的完整节点,但只有一个核心在运行(所以我不必要地占用了 31 个核心)。

在我的 sbatch 脚本中,我有这个:

# 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 的所有行(10 000 行)。

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

谢谢!

4

1 回答 1

1

如果集群配置为在作业之间共享计算节点,一种选择是提交 10 000-jobs作业数组。提交脚本看起来像这样(未经测试):

#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}"

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

与提交 10 000 个独立作业相比,作业数组将允许您使用单个命令管理所有作业。此外,与单个作业相比,作业数组对调度程序的负担要小得多。

如果作业数组中允许的作业数量受到限制,您可以简单地将多个模拟打包在同一个作业中,可以按顺序或像您目前所做的那样并行,但可能有 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}"
于 2020-10-23T18:06:45.760 回答