Slurm 作业数组:有没有办法在不同时间开始的 slurm 上创建作业数组?

Slurm job arrays: is there a way to create a job array on slurm that starts at different times?

我有一个长期运行宁的任务,我想 运行 在 slurm 上使用作业数组。

我目前用来提交作业的脚本是:

#!/bin/bash

#SBATCH --output=slurm-%A_%a.out

#SBATCH --array=1-30

#SBATCH --ntasks=1

#SBATCH --qos=qos-15d

#SBATCH --partition=large

#SBATCH --mem=4G

srun ./a

这个脚本工作正常,但我的问题是它是一个包含 30 个作业的数组,我需要在时间 X 开始第一个,然后在 X 分钟后开始第二个,依此类推。我想这样做是因为我将模拟一个使用 srand(time(0)) 函数生成随机数的 C 编译程序。因此,上面的脚本对 30 次模拟产生了相同的结果,因为生成的随机数是相等的。由于每次模拟都需要很长时间才能运行,所以我等一个工作完成再开始另一个工作是不可行的。

假设您是唯一一个使用集群的人(否则,您的所有作业的启动时间将不相同),一个小技巧是在脚本的开头添加一个随机睡眠:

#!/bin/bash

#SBATCH --output=slurm-%A_%a.out
#SBATCH --array=1-30
#SBATCH --ntasks=1
#SBATCH --qos=qos-15d
#SBATCH --partition=large
#SBATCH --mem=4G

sleep $((RANDOM%30+1))

srun ./a

即使所有作业同时开始,它们也会在实际开始计算之前随机休眠一段时间(从 1 到 30 秒)。

我知道这个问题已经有了答案,但在遇到同样的问题后,我找到了另一种解决方法。

最初的答案对我来说有问题,因为延迟是随机的而不是唯一的,所以有可能同时开始多次运行。

我的解决方案使用大多数 slurm 系统在这种情况下特别提供的环境变量 $SLURM_ARRAY_TASK_ID。 (更多环境变量可以在这里找到:https://slurm.schedmd.com/sbatch.html#OPT_SLURM_ARRAY_TASK_ID

对于上面的用例,脚本看起来像这样。睡眠语句中的数字可以是想要的延迟。

#!/bin/bash

#SBATCH --output=slurm-%A_%a.out
#SBATCH --array=1-30
#SBATCH --ntasks=1
#SBATCH --qos=qos-15d
#SBATCH --partition=large
#SBATCH --mem=4G

sleep $((SLURM_ARRAY_TASK_ID*5))

srun ./a

这将保证节目的单独开始时间。

也可以选择将 $SLURM_ARRAY_JOB_ID$SLURM_ARRAY_TASK_ID 读入程序并将它们用作模拟随机数生成器的种子。 (在 C 中读取环境变量 http://www0.cs.ucl.ac.uk/staff/W.Langdon/getenv/