【发布时间】:2017-09-21 20:04:59
【问题描述】:
我需要在 slurm 上运行 10,000 个作业(假设每个作业需要 30 分钟)。目前,计划是使用作业数组,并行使用 250 个内核,如下所示:
sbatch --array=0-10000%250 array_script.sh args
不幸的是,系统管理员没有更改 slurm 的 MaxArraySize(默认为 1001)。为了“规避”这一点,我计划将整个工作分成 10 块,并以某种方式安排每一块,使其在前一块完成后运行。例如,我将从:
sbatch --array=0-999%250 array_script.sh args
那么当完成后,我会这样做:
sbatch --array=1000-1999%250 array_script.sh args
现在我需要以某种方式安排这个。我对 bash 没有那么丰富的经验,而且我对所有东西都有一个 python 包装器,所以我想我会用 python 来做(另外我在作业数组周围使用了一个 python 包装器来做很多其他的事情)。那我平时怎么做呢?
目前我有:
for i in range(num_slices):
command = 'sbatch --array={lower_end}-{upper_end}%250 array_script.sh args'.format(lower_end=i*1000, upper_end=min((i+1)*1000-1, num_targets-1), args=args)
subprocess.run(command, shell=True)
<< need to have a step that waits till the job is done >>
首先,在上面,我运行sbatch 和subprocess.run,这意味着我目前不知道JOB_ID。有没有办法捕获subprocess.run 的输出或可以让我找到JOB_ID 的东西。以及如何执行squeue 的等效操作来检查作业是否仍在运行并决定是否继续循环?
【问题讨论】:
标签: python bash subprocess slurm