Slurm:具有指定 CPU 数量的 select 个节点

Slurm: select nodes with specified number of CPUs

我在单个分区具有不同节点的集群上使用 slurm。具体来说,节点有不同的#CPUs。我的代码是一个用于参数扫描的单核应用程序,因此我想通过向它发送 32 个作业来充分使用(例如)32 CPU 节点。

如何 select 具有指定数量 CPU 的节点(在命名分区内)?

我通过

知道我的分区配置
 sinfo -e -p <partition_name> -o "%9P %3c %.5D %6t " -t idle,mix

PARTITION          CPU   NODES  STATE  
<partition_name>    16     63    mix    
<partition_name>    32     164   mix

但是如果我使用像

这样的提交脚本
[snip preamble]

#SBATCH --partition <partition_name> # resource to be used
#SBATCH --nodes 1 # Num nodes
#SBATCH -N 1 # Num cores per job
#SBATCH --cores-per-socket=32 # Cores per node

slurm 调度程序说

sbatch: error: Socket, core and/or thread specification can not be satisfied

PS。一个小的更正:我获取分区信息的代码不是最好的。以防万一以后有人查找这个问题,这里有一个更好的查询(使用 X、Y 表示套接字、核心计数),它有助于确定 damien 的出色答案解决的问题

sinfo -e -p <partition_name> -o "%9P %3c %.3D %6t %2X %2Y %N" -t idle,mix

严格回答你的问题:用

#SBATCH --cores-per-socket=32

您请求每个插槽 32 个核心,这是每个物理 CPU。我猜这些机器有两个 CPU,所以你应该请求像

这样的东西
#SBATCH --sockets-per-node=2
#SBATCH --cores-per-socket=16

另一种请求方式是请求

#SBATCH --nodes 1
#SBATCH --tasks-per-node 32

但请注意,如果您的集群允许节点共享,您所做的似乎更适合作业数组:

#SBATCH --ntasks 1
#SBATCH --arrays 1-32
IDS=($(seq RUN_ID_FIRST RUN_ID_LAST))
RUN_ID=${IDS[$SLURM_ARRAY_TASK_ID]}
matlab -nojvm -singleCompThread -r "try myscript(${RUN_ID}); catch me; disp(' *** error'); end; exit" > ./result_${RUN_ID}

这将启动 32 个独立作业,每个作业负责 运行 Matlab 脚本以获取参数扫描的一个值。

回答您的附加问题;如果在 16-CPU 节点上安排 32 个进程的作业,该节点将超载,并且根据管理员设置的遏制解决方案,您的进程可能会影响其他人的作业并减慢它们的速度。