我使用SLURM来使用某些计算群集,它有-ntasks
或-n
。我显然已经阅读了它的文档(http://slurm.schedmd.com/sbatch.html):
sbatch不会启动任务,它会请求分配资源 并提交批处理脚本。此选项建议Slurm控制器 在分配中运行的作业步骤将最多启动 编号任务并提供足够的资源。默认是 每个节点一个任务,但请注意--cpus-per-task选项将 更改此默认值。
具体部分我不明白它的含义是:
在分配内运行将启动最多的任务数和 提供充足的资源。
我有几个问题:
sbatch my_batch_job.sh
下在sbatch下运行bash脚本。不确定任务意味着什么。-n, --ntasks=<number>
的参数多次运行相同的相同bash脚本。但是,我显然在群集中测试了它,用echo hello
运行--ntask=9
并且我预计sbatch将向stdout回调你好9次(这是在slurm-job_id.out
中收集的,但令我惊讶的是,有一次执行我的echo hello脚本然后这个命令甚至做了什么?它似乎什么也没做,或者至少我看不到假设要做什么。我知道多个作业存在-a, --array=<indexes>
选项。这是一个不同的主题。我只是想知道--ntasks
假设要做什么,理想情况下是一个例子,以便我可以在集群中测试它。
答案 0 :(得分:13)
&#34; - ntasks&#34; options指定执行命令的实例数。 对于常见的群集设置,如果您使用&#34; srun&#34;这相当于MPI排名的数量。
相比之下,选项&#34; - cpus-per-task&#34;指定每个任务可以使用的CPU数量。
你的输出也让我感到惊讶。您是在脚本中还是通过srun启动了命令? 你的脚本看起来像:
#!/bin/bash
#SBATCH --ntasks=8
## more options
echo hello
这应该始终只输出一行,因为脚本只在提交节点而不是工作者上执行。
如果您的脚本看起来像
#!/bin/bash
#SBATCH --ntasks=8
## more options
srun echo hello
srun导致脚本在工作节点上运行命令,因此你应该得到8行问候。
答案 1 :(得分:5)
如果您要在同一批处理脚本中并行运行命令,则--ntasks
参数很有用。
这可能是由&
分隔的两个独立命令,也可能是bash管道(|
)中使用的两个命令。
例如
使用默认的ntasks = 1
#!/bin/bash
#SBATCH --ntasks=1
srun sleep 10 &
srun sleep 12 &
wait
会抛出警告:
作业步骤创建暂时被禁用,重试
默认情况下,任务数被指定为一个,因此第二个任务要等到第一个任务完成后才能启动。 这项工作将在22秒钟左右完成。要对此进行细分:
sacct -j515058 --format=JobID,Start,End,Elapsed,NCPUS
JobID Start End Elapsed NCPUS
------------ ------------------- ------------------- ---------- ----------
515058 2018-12-13T20:51:44 2018-12-13T20:52:06 00:00:22 1
515058.batch 2018-12-13T20:51:44 2018-12-13T20:52:06 00:00:22 1
515058.0 2018-12-13T20:51:44 2018-12-13T20:51:56 00:00:12 1
515058.1 2018-12-13T20:51:56 2018-12-13T20:52:06 00:00:10 1
在这里,任务0开始和完成(在12秒内),然后是任务1(在10秒内)。使用户总时间为22秒。
要同时运行这两个命令:
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 sleep 10 &
srun --ntasks=1 sleep 12 &
wait
运行与上面指定的相同的sacct命令
sacct -j 515064 --format=JobID,Start,End,Elapsed,NCPUS
JobID Start End Elapsed NCPUS
------------ ------------------- ------------------- ---------- ----------
515064 2018-12-13T21:34:08 2018-12-13T21:34:20 00:00:12 2
515064.batch 2018-12-13T21:34:08 2018-12-13T21:34:20 00:00:12 2
515064.0 2018-12-13T21:34:08 2018-12-13T21:34:20 00:00:12 1
515064.1 2018-12-13T21:34:08 2018-12-13T21:34:18 00:00:10 1
这里的全部工作需要12秒。由于批处理脚本中已指定任务数量,因此作业没有等待资源的风险,因此作业具有立即运行这么多命令的资源。
每个任务都继承为批处理脚本指定的参数。这就是为什么需要为每个srun任务指定--ntasks=1
的原因,否则每个任务都使用--ntasks=2
,因此第二个命令要等到第一个任务完成后才能运行。
继承批处理参数的任务的另一个警告是,如果将--export=NONE
指定为批处理参数。在这种情况下,应为每个srun命令指定--export=ALL
,否则srun命令不会继承sbatch脚本中设置的环境变量。
附加说明:
使用bash管道时,可能有必要指定--nodes = 1来防止在管道的任一侧运行在单独节点上的命令。
使用&
同时运行命令时,wait
是至关重要的。在这种情况下,如果没有wait
命令,则任务0将自动取消,前提是任务1成功完成。