通过Python与Slurm互动(自动链接作业)



我需要在slurm上运行10,000个作业(每个需要30分钟)。目前,该计划是使用一个并行的250个核心使用一个工作阵列来完成,例如:

sbatch --array=0-10000%250 array_script.sh args

不幸的是,系统管理员没有更改Slurm的MaxArraysize(from默认的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 >>

首先,在上面,我使用subprocess.run运行sbatch,这意味着我目前不知道JOB_ID。是否有一种方法可以从subprocess.run接收输出,或者可以让我找到JOB_ID的东西。以及如何进行squeue的等效检查,以检查作业是否仍在运行并决定是否继续循环?

slurm将自动排队所有工作,因此您可以一次发送所有作业。

只要您的工作是独立的,就无需等待当前作业数组的完成。

对于获取子过程输出,您可以在此处找到答案。

对于其他人绊倒了这个问题:您的管理员有充分的理由设置了最大作业数量和数组作业数量的限制。

slurm(和其他作业调度程序)倾向于在管理系统上使用与队列中的作业数量成正比的资源。工作太多,调度程序本身将陷入困境,工作计划将被延迟,这将增加队列中的工作数量。这可能会导致系统磨削到完全停止。

如果您需要提交更多的工作允许您的工作,那么正确的方法就是联系管理员。解释您想做的事情以及您要实现的目标。您可能会获得提交工作的许可,或者他们可能会知道一种更好的方法来实现您的目标,而这不涉及运行那么多的工作。

HPC系统管理员通常很乐意讨论如何事先实现目标。他们不太高兴地发出由用户试图避免出于良好技术原因而限制的用户引起的火灾。

最新更新