如何为SLURM作业阵列计时?

时间:2019-11-04 18:27:30

标签: slurm

我正在提交SLURM作业数组,并希望将总运行时间(即不是每个任务的运行时间)打印到日志中。

这是我尝试过的:

#!/bin/bash

#SBATCH --job-name=step1
#SBATCH --output=logs/step1.log
#SBATCH --error=logs/step1.log
#SBATCH --array=0-263%75

start=$SECONDS

python worker.py ${SLURM_ARRAY_TASK_ID} 

echo "Completed step1 in $SECONDS seconds"

在step1.log中得到的内容是这样的:

Completed step1 in 42 seconds
Completed step1 in 94 seconds
Completed step1 in 88 seconds
...

似乎为数组中的最后一组任务提供了运行时。从提交到最后一个任务结束,我希望为整个数组使用一个计时器。有可能吗?

1 个答案:

答案 0 :(得分:2)

对于作业数组,每个任务都是脚本的相同提交,因此,如您所见,测量时间的方式必然只是每个任务。要获取整个作业数组的总体经过时间,您需要获取第一个任务的提交时间,然后从最后一个任务的结束时间中减去。

例如

# get submit time for first task in array
sacct -j <job_id>_0 --format=submit

# get end time for last task in array
sacct -j <job_id>_263 --format=end

然后使用date -d <timestamp from sacct> +%s将时间戳转换为自纪元以来的秒数,以使它们更易于减去。

还要注意,您的264个任务中的每一个都将使用自己的输出覆盖step1.log。我通常会使用#SBATCH --output=step1-%A_%a.out来区分不同任务的输出。