Job Arrays 支持
概述
Job Arrays(作业数组)提供了一种机制,用于提交和管理 快速轻松地完成类似的工作;具有数百万个任务的Job Arrays可以是 以毫秒为单位提交(受配置的大小限制限制)。 所有作业必须具有相同的初始选项(例如大小、时间限制等), 但是,可以在作业开始后更改其中一些选项 使用 scontrol 命令执行,该命令指定数组的 JobID 或单个ArrayJobID。
$ scontrol update job=101 ...
$ scontrol update job=101_1 ...
Job Arrays仅支持批处理作业,数组索引值为 使用sbatch命令的 --array或 a选项指定。选项参数可以是特定的数组索引值,范围 索引值和可选的步长,如以下示例所示。 请注意,最小索引值为零,最大值为 Slurm 配置参数(最大数组大小减一)。 属于Job Arrays的作业会将环境变量SLURM_ARRAY_TASK_ID设置为其数组索引值。
# Submit a job array with index values between 0 and 31
$ sbatch --array=0-31 -N1 tmp
# Submit a job array with index values of 1, 3, 5 and 7
$ sbatch --array=1,3,5,7 -N1 tmp
# Submit a job array with index values between 1 and 7
# with a step size of 2 (i.e. 1, 3, 5 and 7)
$ sbatch --array=1-7:2 -N1 tmp
Job Arrays中同时运行的任务的最大数量可能为 使用“%”分隔符指定。 例如“--array=0-15%4”将限制同时的数量 从此Job Arrays运行任务到 4。
作业 ID 和环境变量
Job Arrays将设置两个额外的环境变量。SLURM_ARRAY_JOB_ID将设置为数组的第一个作业 ID。SLURM_ARRAY_TASK_ID将设置为Job Arrays索引值。SLURM_ARRAY_TASK_COUNT将设置为Job Arrays中的任务数。SLURM_ARRAY_TASK_MAX将设置为最高的Job Arrays索引值。SLURM_ARRAY_TASK_MIN将设置为最低Job Arrays索引值。 例如,这种排序 批处理的作业提交 --array=1-3 -N1 tmp 将生成一个包含三个作业的Job Arrays。如果 sbatch 命令响应 提交的批处理作业 36, 则环境变量将设置为 关注:
SLURM_JOB_ID=36
SLURM_ARRAY_JOB_ID=36
SLURM_ARRAY_TASK_ID=1
SLURM_ARRAY_TASK_COUNT=3
SLURM_ARRAY_TASK_MAX=3
SLURM_ARRAY_TASK_MIN=1
SLURM_JOB_ID=37
SLURM_ARRAY_JOB_ID=36
SLURM_ARRAY_TASK_ID=2
SLURM_ARRAY_TASK_COUNT=3
SLURM_ARRAY_TASK_MAX=3
SLURM_ARRAY_TASK_MIN=1
SLURM_JOB_ID=38
SLURM_ARRAY_JOB_ID=36
SLURM_ARRAY_TASK_ID=3
SLURM_ARRAY_TASK_COUNT=3
SLURM_ARRAY_TASK_MAX=3
SLURM_ARRAY_TASK_MIN=1
所有 Slurm 命令和 API 都能识别SLURM_JOB_ID值。 大多数命令还可以识别SLURM_ARRAY_JOB_ID加号SLURM_ARRAY_TASK_ID 用下划线分隔的值,用于标识Job Arrays的元素。 使用上面的示例,“37”或“36_2”将是等效的识别方式 作业 36 的第二个数组元素。 已经开发了一组 API,用于对整个Job Arrays进行操作或选择 单个函数调用中Job Arrays的任务。 函数响应由标识各种错误代码的数组组成 用于作业 ID 的各种任务。 例如,job_resume2()函数可能会返回一个错误数组 指示任务 1 和 2 已完成的代码;任务 3 到 5 已成功恢复,任务 6 到 99 尚未开始。
文件名
有两个附加选项可用于指定作业的 stdin、stdout 和 stderr 文件名:%A将替换为 SLURM_ARRAY_JOB_ID 的值(如上所述) 和 %a将替换为 SLURM_ARRAY_TASK_ID 的值(如上所述)。 Job Arrays的默认输出文件格式为 “slurm-%A_%a.out”。 显式使用格式的一个示例是: sbatch -o slurm-%A_%a.out --array=1-3 -N1 tmp ,它将生成此类输出文件名 “slurm-36_1.out”、“slurm-36_2.out”和“slurm-36_3.out”。 如果在不使用Job Arrays的一部分的情况下使用这些文件名选项,则 “%A”将替换为当前作业 ID,“%a”将替换为 4,294,967,294(相当于0xfffffffe或NO_VAL)。
取消命令使用
如果将Job Arrays的作业 ID 指定为 scancel 命令的输入 然后,该Job Arrays的所有元素都将被取消。 或者,可以指定数组 ID(可选地使用正则表达式) 用于取消作业。
# Cancel array ID 1 to 3 from job array 20
$ scancel 20_[1-3]
# Cancel array ID 4 and 5 from job array 20
$ scancel 20_4 20_5
# Cancel all elements from job array 20
$ scancel 20
# Cancel the current job or job array element (if job array)
if [[-z $SLURM_ARRAY_JOB_ID]]; then
scancel $SLURM_JOB_ID
else
scancel ${SLURM_ARRAY_JOB_ID}_${SLURM_ARRAY_TASK_ID}
fi
队列命令使用
将Job Arrays提交到 Slurm 时,只会创建一个作业记录。 仅当任务的状态在 Job Arrays更改,通常在为任务分配资源或其状态时更改 使用 scontrol 命令进行修改。 默认情况下,squeue 命令将报告与 一行上的单个作业记录,并使用正则表达式指示 “array_task_id”值如下所示。
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
1080_[5-1024] debug tmp mac PD 0:00 1 (Resources)
1080_1 debug tmp mac R 0:17 1 tux0
1080_2 debug tmp mac R 0:16 1 tux1
1080_3 debug tmp mac R 0:03 1 tux2
1080_4 debug tmp mac R 0:03 1 tux3
squeue 命令中还添加了“--array”或“-r”选项。 每行打印一个Job Arrays元素,如下所示。 环境变量“SQUEUE_ARRAY”等效于包含“--array” 队列命令行上的选项。
$ squeue -r
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
1082_3 debug tmp mac PD 0:00 1 (Resources)
1082_4 debug tmp mac PD 0:00 1 (Priority)
1080 debug tmp mac R 0:17 1 tux0
1081 debug tmp mac R 0:16 1 tux1
1082_1 debug tmp mac R 0:03 1 tux2
1082_2 debug tmp mac R 0:03 1 tux3
squeue --step/-s 和 --job/-j 选项可以接受作业或步骤 相同格式的规格。
$ squeue -j 1234_2,1234_3
...
$ squeue -s 1234_2.0,1234_3.0
...
squeue中添加了两个额外的作业输出格式字段选项: %F打印array_job_id值%K打印array_task_id值
(所有要使用的明显字母都已分配给其他作业字段)。
控制命令使用
使用scontrol 显示作业选项显示两个与 Job Arrays支持。 作业 ID是作业的唯一标识符。 ArrayJobID是作业的第一个元素的JobID 数组。 ArrayTaskID是此特定条目的数组索引,可以是 表达式的单个数字,用于标识由 this 表示的条目 工作记录(例如“5-1024”)。 如果作业不是Job Arrays的一部分,则不会显示这两个字段。 使用scontrol show作业或scontrol show 步骤命令指定的可选作业 ID 可以通过以下方式标识Job Arrays元素 指定ArrayJobId和ArrayTaskId,下划线介于 它们(例如<ArrayJobID>_<ArrayTaskId>)。
scontrol 命令将对Job Arrays的所有元素进行操作,如果 指定的作业 ID 是ArrayJobID。 可以使用ArrayJobID_ArrayTaskID修改单个Job Arrays任务,如下所示。
$ sbatch --array=1-4 -J array ./sleepme 86400
Submitted batch job 21845
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST
21845_1 canopo array david R 0:13 1 dario
21845_2 canopo array david R 0:13 1 dario
21845_3 canopo array david R 0:13 1 dario
21845_4 canopo array david R 0:13 1 dario
$ scontrol update JobID=21845_2 name=arturo
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST
21845_1 canopo array david R 17:03 1 dario
21845_2 canopo arturo david R 17:03 1 dario
21845_3 canopo array david R 17:03 1 dario
21845_4 canopo array david R 17:03 1 dario
控制保持、保持、释放、重新排队、重新排队保持、挂起和恢复 命令还可以对Job Arrays的所有元素或单个元素进行操作 元素如下所示。
$ scontrol suspend 21845
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST
21845_1 canopo array david S 25:12 1 dario
21845_2 canopo arturo david S 25:12 1 dario
21845_3 canopo array david S 25:12 1 dario
21845_4 canopo array david S 25:12 1 dario
$ scontrol resume 21845
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST
21845_1 canopo array david R 25:14 1 dario
21845_2 canopo arturo david R 25:14 1 dario
21845_3 canopo array david R 25:14 1 dario
21845_4 canopo array david R 25:14 1 dario
scontrol suspend 21845_3
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST
21845_1 canopo array david R 25:14 1 dario
21845_2 canopo arturo david R 25:14 1 dario
21845_3 canopo array david S 25:14 1 dario
21845_4 canopo array david R 25:14 1 dario
scontrol resume 21845_3
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST
21845_1 canopo array david R 25:14 1 dario
21845_2 canopo arturo david R 25:14 1 dario
21845_3 canopo array david R 25:14 1 dario
21845_4 canopo array david R 25:14 1 dario
作业依赖关系
依赖于整个Job Arrays的作业应指定 本身依赖于 ArrayJobID。 由于每个数组元素可以有不同的退出代码,因此解释 Afterok和afternotok条款将基于最高的 从Job Arrays中的任何任务退出代码。
当作业依赖关系指定Job Arrays的作业 ID 时: 在Job Arrays中的所有任务启动后,将满足after子句。 afterany子句在Job Arrays中的所有任务之后都得到满足 完成。 aftercorr子句在 指定的作业已成功完成(运行到完成,退出代码为 零)。 afterok子句在Job Arrays中的所有任务之后都得到满足 成功完成。 在Job Arrays中的所有任务之后满足afternotok子句 完成时至少有一个任务未成功完成。
使用示例如下所示:
# Wait for specific job array elements
sbatch --depend=after:123_4 my.job
sbatch --depend=afterok:123_4:123_8 my.job2
# Wait for entire job array to complete
sbatch --depend=afterany:123 my.job
# Wait for corresponding job array elements
sbatch --depend=aftercorr:123 my.job
# Wait for entire job array to complete successfully
sbatch --depend=afterok:123 my.job
# Wait for entire job array to complete and at least one task fails
sbatch --depend=afternotok:123 my.job
其他命令用途
以下 Slurm 命令当前无法识别Job Arrays及其 use 需要使用 Slurm 作业 ID,这些 ID 对于每个数组元素都是唯一的: SBCAST,Sprio,Sreport,Sshare和STAT。 sacct、sattach 和 strigger 命令已修改为允许 作业 ID 或Job Arrays元素的规范。 sview 命令已修改为允许显示作业的 ArrayJobId 和 ArrayTaskId 字段。如果出现以下情况,则两个字段都以“N/A”值显示 作业不是Job Arrays的一部分。
系统管理
添加了一个新的配置参数来控制最大值 Job Arrays大小:最大数组大小。可以指定的最小索引 由用户为零,最大索引为 MaxArraySize 减去 1。 MaxArraySize 的默认值为 1001。 Slurm 中支持的最大 MaxArraySize 为 4000001。 请注意 MaxArraySize 的值,因为Job Arrays提供了一种简单的方法 让用户非常快速地提交大量作业。
计划/回填插件已经过修改,以提高性能 Job Arrays。一旦发现Job Arrays的一个元素不可运行,就 或影响待处理作业的计划,该作业的其余元素 数组将被快速跳过。
Slurm 在提交Job Arrays时创建单个作业记录。 其他作业记录仅根据需要创建,通常在执行任务时 的Job Arrays启动,这提供了一种非常可扩展的机制来 管理大量作业。 Job Arrays的每个任务将共享相同的 ArrayJobId,但将具有它们的 拥有唯一的 ArrayTaskId。除了 ArrayJobId 之外,每个作业还将具有 在启动任务时分配的唯一 JobId。