使用 SLURM 上的所有 CPU

Make use of all CPUs on SLURM

我想运行集群上的作业。不同节点上有不同数量的 CPU,我不知道哪些节点会分配给我。什么是正确的选项,以便作业可以在所有节点上创建与 CPU 一样多的任务?

#!/bin/bash -l

#SBATCH -p normal
#SBATCH -N 4
#SBATCH -t 96:00:00

srun -n 128 ./run

实现 objective 的一个肮脏的 hack 是使用 SLURM 提供的环境变量。对于示例 sbatch 文件:

#!/bin/bash
#SBATCH --job-name=test
#SBATCH --output=res.txt
#SBATCH --time=10:00
#SBATCH --nodes=2
echo $SLURM_CPUS_ON_NODE
echo $SLURM_JOB_NUM_NODES   
num_core=$SLURM_CPUS_ON_NODE
num_node=$SLURM_JOB_NUM_NODES
let proc_num=$num_core*$num_node
echo $proc_num
srun -n $proc_num ./run

作业脚本中只请求了节点数。 $SLURM_CPUS_ON_NODE 将提供每个节点的 CPU 数量。您可以将它与其他环境变量(例如:$SLURM_JOB_NUM_NODES)一起使用,以了解可能的任务数。在上面的脚本中,动态任务计算是在假设节点是同质的(即 $SLURM_CPUS_ON_NODE 将只给出单个数字)的情况下完成的。

对于异构节点,$SLURM_CPUS_ON_NODE 将给出多个值(例如:如果分配的节点有 2 个和 3 个 cpu,则为 2,3)。在这种情况下,可以使用 $SLURM_JOB_NODELIST 来找出与分配的节点对应的 cpu 数量,并以此计算所需的任务。