我正在尝试设置多个步骤的作业,本质上是每次在单个核心上运行同一程序的许多独立副本。我决定使用这种方法而不是作业数组,因为我访问的集群上每个用户的作业限制为 20 个,而每个作业的最大步骤设置为默认的 40000。示例批处理脚本如下所示:
#!/bin/sh
#SBATCH --partition parallel
#SBATCH --ntasks=100
#SBATCH --cpus-per-task=1
#SBATCH --mem=1000M
#SBATCH --job-name test
#SBATCH --output test.out
for ((i=0; i<$SLURM_NTASKS; i++))
do
srun -N1 -n1 --mem-per-cpu=10M --exact -u sleep 1200 &
done
wait
根据我的理解,上述脚本的预期行为是在分配资源后,将并行启动 100 个作业步骤,每个作业步骤占用一个 CPU。我还包括了显式内存分配和
--exact
标志,如类似帖子中所建议的那样,以防止第一次 srun 占用整个分配的内存:并行但不同的 Slurm srun 作业步骤调用不起作用
尽管如此,在几个(10-20)作业步骤开始运行后,我仍然收到消息
Step creation temporarily disabled, retrying (Requested nodes are busy)
。由于所有必要的资源都已分配并且内存均匀分布(通过检查sacct
进行验证),什么可能阻止所有作业同时运行?
PS。我在下面添加了一个典型的
sacct
输出。一切似乎都遵循预期的行为。我唯一不清楚的是:
.batch
步骤似乎占用了许多CPU和比实际分配给它更多的内存 JobID MaxRSS AllocTRES NodeList
--------------- ---------- ---------------------------------------- --------------------
624245 billing=441,cpu=100,mem=1500M,node=5 ibiscohpc-wn[26-30]
624245.batch 408612K cpu=22,mem=330M,node=1 ibiscohpc-wn26
624245.0 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.1 632K cpu=1,mem=10M,node=1 ibiscohpc-wn27
624245.2 628K cpu=1,mem=10M,node=1 ibiscohpc-wn28
624245.3 632K cpu=1,mem=10M,node=1 ibiscohpc-wn29
624245.4 632K cpu=1,mem=10M,node=1 ibiscohpc-wn30
624245.5 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.6 636K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.7 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.8 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.9 636K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.10 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.11 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.12 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.13 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.14 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.15 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.16 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.17 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.18 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.19 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.20 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.21 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.22 636K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.23 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.24 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
624245.25 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
我一直无法找到使用作业步骤在多个节点上提交任务的令人满意的答案。然而,我发现在我的情况(多次相同的运行)中,真正有效的方法是在许多任务中只提交一个作业步骤。批处理脚本将如下所示:
#!/bin/sh
#SBATCH --partition parallel
#SBATCH --ntasks=100
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=100M
#SBATCH --job-name test
#SBATCH --output test.out
srun -n100 -u exec.sh
使用可执行脚本
exec.sh
,其中包含带有变量 $SLURM_PROCID
的表达式,以区分任务。例如:
#!/bin/sh
echo $SLURM_PROCID
sleep 1200
这将导致所需的行为,但据我了解,在独立控制每个任务时,与提交单独的作业步骤相比,它有一些缺点。然而,在找到更好的替代方案之前,这似乎是适用于此用例的唯一方法。