【问题标题】:Is there a way to use CPUs individually on a cluster with slurm?有没有办法在带有 slurm 的集群上单独使用 CPU?
【发布时间】:2020-10-23 15:35:02
【问题描述】:

我一直在使用一个由 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 个核心(无论目前是免费的)?

谢谢!

【问题讨论】:

    标签: slurm gnu-parallel


    【解决方案1】:

    如果集群配置为在作业之间共享计算节点,一种选择是提交 10 000-jobs 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}"
    

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

    与提交 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}"
    

    【讨论】:

    • 首先,感谢您的快速回答!是的,但是这将创建一个 loooong 队列,因为我为多组参数运行了这 10000 次模拟......有没有一种方法,只有一个工作,要求 32 个独立的核心?
    • 作业数组被设计成实际上并没有很长的队列。从调度器的角度来看,一个作业数组中的所有作业都是一个作业。在单个作业中,所有资源都被同时安排。然后您可以使用scontrol update jobid=... nnodes=...“释放”单个节点(而不是单个内核)。但是您需要自己实现逻辑并确保释放正确的节点。
    猜你喜欢
    • 2019-12-19
    • 2023-03-30
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多