为什么我的 slurm 作业步骤没有并行启动?
Why are my slurm job steps not launching in parallel?
我想弄清楚“任务”的概念在 SLURM 中的含义。我发现 this answer on SO 向我建议了以下工作脚本:
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 sleep 10 &
srun --ntasks=1 sleep 12 &
wait
作者说这个工作运行给他总共用了12秒,因为sleep 10
和sleep 12
运行两个步骤是并行的,但我做不到重现那个。
如果我将上面的文件保存为slurm-test
和运行
sbatch -o slurm.out slurm-test,
我看到我的作业 运行s 持续了 23 秒。
这是sacct --format=JobID,Start,End,Elapsed,NCPUS -S now-2minutes
的输出:
JobID Start End Elapsed NCPUS
------------ ------------------- ------------------- ---------- ----------
645514 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.batch 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.exte+ 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.0 2021-06-30T11:05:38 2021-06-30T11:05:48 00:00:10 2
645514.1 2021-06-30T11:05:48 2021-06-30T11:06:00 00:00:12 2
我的slurm.out
输出是
srun: Job 645514 step creation temporarily disabled, retrying (Requested nodes are busy)
srun: Step created for job 645514
在 sbatch
调用中明确包含 -n 2
不会更改结果。我究竟做错了什么?如何让我的作业文件中的两个调用同时调用 运行?
根据 Slurm 版本,您可能必须将 --exclusive
参数添加到 srun(其语义与 sbatch
不同):
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 --exclusive -c 1 sleep 10 &
srun --ntasks=1 --exclusive -c 1 sleep 12 &
wait
另外添加 -c 1
以使其更明确可能会有所帮助,同样取决于 Slurm 版本。
对我来说,step creation temporarily disabled, retrying (Requested nodes are busy)
的原因是,第一个执行的srun
命令分配了所有内存。要解决这个问题,首先可以选择(?)在 sbatch
:
中指定总内存分配
#SBATCH --ntasks=2
#SBATCH --mem=[XXXX]MB
然后指定每个 srun
任务的内存使用:
srun --exclusive --ntasks=1 --mem-per-cpu [XXXX/2]MB sleep 10 &
srun --exclusive --ntasks=1 --mem-per-cpu [XXXX/2]MB sleep 12 &
wait
我没有为 srun
指定 cpu 计数,因为在我的 sbatch
脚本中我有 #SBATCH --cpus-per-task=1
。出于同样的原因,我怀疑当您的作业不是串行作业时,您应该在 srun
命令中使用 --mem
而不是 --mem-per-cpu
,但我还没有测试过此配置。
我想弄清楚“任务”的概念在 SLURM 中的含义。我发现 this answer on SO 向我建议了以下工作脚本:
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 sleep 10 &
srun --ntasks=1 sleep 12 &
wait
作者说这个工作运行给他总共用了12秒,因为sleep 10
和sleep 12
运行两个步骤是并行的,但我做不到重现那个。
如果我将上面的文件保存为slurm-test
和运行
sbatch -o slurm.out slurm-test,
我看到我的作业 运行s 持续了 23 秒。
这是sacct --format=JobID,Start,End,Elapsed,NCPUS -S now-2minutes
的输出:
JobID Start End Elapsed NCPUS
------------ ------------------- ------------------- ---------- ----------
645514 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.batch 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.exte+ 2021-06-30T11:05:38 2021-06-30T11:06:00 00:00:22 2
645514.0 2021-06-30T11:05:38 2021-06-30T11:05:48 00:00:10 2
645514.1 2021-06-30T11:05:48 2021-06-30T11:06:00 00:00:12 2
我的slurm.out
输出是
srun: Job 645514 step creation temporarily disabled, retrying (Requested nodes are busy)
srun: Step created for job 645514
在 sbatch
调用中明确包含 -n 2
不会更改结果。我究竟做错了什么?如何让我的作业文件中的两个调用同时调用 运行?
根据 Slurm 版本,您可能必须将 --exclusive
参数添加到 srun(其语义与 sbatch
不同):
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 --exclusive -c 1 sleep 10 &
srun --ntasks=1 --exclusive -c 1 sleep 12 &
wait
另外添加 -c 1
以使其更明确可能会有所帮助,同样取决于 Slurm 版本。
对我来说,step creation temporarily disabled, retrying (Requested nodes are busy)
的原因是,第一个执行的srun
命令分配了所有内存。要解决这个问题,首先可以选择(?)在 sbatch
:
#SBATCH --ntasks=2
#SBATCH --mem=[XXXX]MB
然后指定每个 srun
任务的内存使用:
srun --exclusive --ntasks=1 --mem-per-cpu [XXXX/2]MB sleep 10 &
srun --exclusive --ntasks=1 --mem-per-cpu [XXXX/2]MB sleep 12 &
wait
我没有为 srun
指定 cpu 计数,因为在我的 sbatch
脚本中我有 #SBATCH --cpus-per-task=1
。出于同样的原因,我怀疑当您的作业不是串行作业时,您应该在 srun
命令中使用 --mem
而不是 --mem-per-cpu
,但我还没有测试过此配置。