【问题标题】:Interacting with slurm through python (to automatically chain jobs)通过 python 与 slurm 交互(自动链接作业)
【发布时间】: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 >>

首先,在上面,我运行sbatchsubprocess.run,这意味着我目前不知道JOB_ID。有没有办法捕获subprocess.run 的输出或可以让我找到JOB_ID 的东西。以及如何执行squeue 的等效操作来检查作业是否仍在运行并决定是否继续循环?

【问题讨论】:

    标签: python bash subprocess slurm


    【解决方案1】:

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

    只要你的作业是独立的,就不需要等待当前作业数组完成再发送下一个。

    至于获取子进程输出,可以找到答案here

    【讨论】:

    • 在这种情况下,最大提交限制似乎适用于不同的作业,即使它们是依赖的。所以我需要一个调度程序,否则任何会使我的总作业大小超过限制的额外作业都会被拒绝。
    【解决方案2】:

    对于偶然发现这个问题的其他人:您的管理员出于充分的理由对最大作业数和阵列作业数设置了限制。

    Slurm(和其他作业调度程序)倾向于使用与队列中作业数量成比例的管理系统资源。作业太多,调度器本身就会陷入困境,作业调度会延迟,这将进一步增加队列中的作业数量。这可能会导致系统完全停止。

    如果您需要提交更多管理员允许的工作,正确的方法是联系管理员。解释你想要做什么,以及你想要达到的目标。您可能会获得提交作业的许可,或者他们可能知道实现您的目标的更好方法,而无需运行太多作业。

    HPC 系统管理员通常很乐意事先讨论如何实现您的目标。他们不太乐意扑灭因用户试图绕过出于良好技术原因而存在的限制而引发的火灾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多