我正在使用SLURM来使用一些计算集群,它有-ntasks或者-n.我显然已经阅读了它的文档(http://slurm.schedmd.com/sbatch.html):
sbatch不启动任务,它请求分配资源并提交批处理脚本.此选项建议Slurm控制器在分配中运行的作业步骤将启动最多数量的任务并提供足够的资源.默认值是每个节点一个任务,但请注意--cpus-per-task选项将更改此默认值.
具体部分我不明白它的含义是:
在分配内运行将启动最多数量的任务并提供足够的资源.
我有几个问题:
sbatch my_batch_job.sh.不确定任务意味着什么.-n, --ntasks=<number>.但是,我明明测试了它的集群中,跑了echo hello有--ntask=9和我预期的sbatch将回声你好9次到stdout(被收集在slurm-job_id.out,但让我惊讶的是,那里是我的回声你好脚本的单次执行那么,什么是这个甚至命令呢?似乎它什么也没做,或者至少我看不到假设要做什么.我知道-a, --array=<indexes>多个工作的选项存在.这是一个不同的主题.我只是想知道--ntasks想要做什么,理想情况下是一个例子,以便我可以在集群中测试它.
小智 14
"--ntasks"选项指定执行命令的实例数.对于常见的群集设置,如果使用"srun"启动命令,则这对应于MPI等级的数量.
相反,选项"--cpus-per-task"指定每个任务可以使用的CPU数量.
你的输出也让我感到惊讶.您是在脚本中还是通过srun启动了命令?你的脚本看起来像:
#!/bin/bash
#SBATCH --ntasks=8
## more options
echo hello
Run Code Online (Sandbox Code Playgroud)
这应始终只输出一行,因为脚本仅在提交节点而不是工作程序上执行.
如果您的脚本看起来像
#!/bin/bash
#SBATCH --ntasks=8
## more options
srun echo hello
Run Code Online (Sandbox Code Playgroud)
srun导致脚本在工作节点上运行命令,因此您应该获得8行hello.
Ale*_*ini 11
--ntasks如果您要在同一批处理脚本中并行运行命令,则此参数很有用。这可能是两个单独的命令,由&bash管道(|)中使用的一个或两个命令分隔。
例如
使用默认的ntasks = 1
#!/bin/bash
#SBATCH --ntasks=1
srun sleep 10 &
srun sleep 12 &
wait
Run Code Online (Sandbox Code Playgroud)
将抛出警告:
暂时禁用作业步骤创建,然后重试
默认情况下,任务数指定为一个,因此第二个任务要等到第一个任务完成后才能启动。这项工作将在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
Run Code Online (Sandbox Code Playgroud)
在这里,任务0开始和完成(在12秒内),然后是任务1(在10秒内)。使用户总时间为22秒。
要同时运行这两个命令:
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 sleep 10 &
srun --ntasks=1 sleep 12 &
wait
Run Code Online (Sandbox Code Playgroud)
运行与上面指定的相同的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
Run Code Online (Sandbox Code Playgroud)
在这里,整个工作耗时12秒。由于批处理脚本中已指定任务数量,因此作业没有等待资源的风险,因此作业具有立即运行许多命令的资源。
每个任务都继承为批处理脚本指定的参数。这就是为什么--ntasks=1需要为每个srun任务指定一个原因的原因,否则每个任务都会使用--ntasks=2,因此第二个命令要等到第一个任务完成后才能运行。
继承批处理参数的任务的另一个警告是将if --export=NONE指定为批处理参数。在这种情况下,--export=ALL应该为每个srun命令指定,否则srun命令不会继承sbatch脚本中设置的环境变量。
附加说明:
使用bash管道时,可能有必要指定--nodes = 1来防止命令在管道的任一侧在单独的节点上运行。
当&用于同时运行命令时,wait至关重要。在这种情况下,如果没有wait成功执行任务1,则任务0将自行取消。
任务是作业在一个或多个节点中并行执行的进程。sbatch为您的作业分配资源,但即使您为多个任务请求资源,它也只会在单个节点的单个进程中启动您的作业脚本。srun用于从批处理脚本启动作业步骤。--ntasks=N指示srun执行作业步骤的 N 个副本。
例如,
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=2
Run Code Online (Sandbox Code Playgroud)
意味着你想要并行运行两个进程,并且让每个进程访问两个CPU。sbatch将为您的作业分配四个 CPU,然后在单个进程中启动批处理脚本。在批处理脚本中,您可以使用以下命令创建并行作业步骤
srun --ntasks=2 --cpus-per-task=2 step.sh
Run Code Online (Sandbox Code Playgroud)
这将并行运行两个进程,它们都执行step.sh脚本。从同一份工作中,您还可以运行
srun --ntasks=1 --cpus-per-task=4 step.sh
Run Code Online (Sandbox Code Playgroud)
这将启动一个可以访问所有四个 GPU 的进程(尽管它会发出警告)。
值得注意的是,在分配的资源内,您的作业脚本可以自由地执行任何操作,并且不必用于srun创建作业步骤(但您需要srun在多个节点中启动作业步骤)。例如,以下脚本将并行运行这两个步骤:
#!/bin/bash
#SBATCH --ntasks=1
step1.sh &
step2.sh &
wait
Run Code Online (Sandbox Code Playgroud)
如果您想使用启动作业步骤srun并并行运行两个不同的步骤,那么您的作业需要分配两项任务,而您的作业步骤只需请求一项任务。您还需要向 提供--exclusive参数srun,以便作业步骤使用单独的资源。
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 --exclusive step1.sh &
srun --ntasks=1 --exclusive step2.sh &
wait
Run Code Online (Sandbox Code Playgroud)