The --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 秒。不存在作业等待资源的风险,因为批处理脚本中已指定任务数量,因此作业具有同时运行这么多命令的资源。
每个任务都会继承为批处理脚本指定的参数。这就是为什么--ntasks=1
需要为每个srun任务指定,否则每个任务都使用--ntasks=2
因此,在第一个任务完成之前,第二个命令不会运行。
继承批处理参数的任务的另一个警告是如果--export=NONE
被指定为批处理参数。在这种情况下--export=ALL
应为每个 srun 命令指定,否则 sbatch 脚本中设置的环境变量不会被 srun 命令继承。
补充笔记:
使用 bash 管道时,可能需要指定 --nodes=1 以防止管道两侧的命令在单独的节点上运行。
使用时&
要同时运行命令,wait
至关重要。在这种情况下,如果没有wait
命令,任务 0 将自行取消,前提是任务 1 成功完成。