我在群集中使用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
答案 0 :(得分:1)
严格回答你的问题:用
#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个进程的作业,该节点将会过载,并且根据管理员设置的包含解决方案,您的进程可能会影响其他人。工作和减慢他们。