我在单个分区具有不同节点的群集上使用slurm。具体而言,节点具有不同的#cpu。我的代码是用于参数扫描的单核应用程序,因此我想通过发送32个作业来完全使用(例如(32 CPU节点。
如何选择具有指定数量的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用于插座,核心计数(,有助于确定达米安的出色答案解决的问题
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个过程作业,则该节点将被超载,并取决于管理员设置的遏制解决方案,您的流程可能会影响他人的作业并减慢它们的速度。