3

我有一个长时间运行的任务,我想在 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 次模拟产生了相同的结果,因为生成的随机数是相等的。由于每次模拟都需要很长时间才能运行,因此等待一项工作完成后再开始另一项工作对我来说是不可行的。

4

2 回答 2

2

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

#!/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 秒)休眠。

于 2019-09-23T07:50:41.157 回答
0

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

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

我的解决方案使用大多数 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/

于 2022-02-07T16:29:29.997 回答