Python 等待 Slurm 作业?

Python wait Slurm job?

我有一个 python 脚本,它应该为要调用的外部程序生成一堆输入。对外部程序的调用将通过 slurm。

我想要的是让我的脚本等到所有生成的对外部程序的调用完成(不是 slurm 命令,外部程序的实际执行),然后解析外部程序生成的输出,用数据做一些事情。

我试过子进程调用,但它只等待 slurm 提交命令。有什么建议吗?

解决方案 1

我建议将您的管道分解成更小的步骤,然后可以在 bash 脚本等中自动执行。 首先,您通过 slurm 生成所有需要 运行 的命令。如果您将它们作为 slurm 作业数组提交(参见 here),您可以同时提交解析所有这些命令输出的脚本。使用 slurm 依赖项,您可以使此作业仅在作业数组完成后启动。

解决方案 2

您可以在 python 脚本中执行 while 循环并检查作业的状态:

import time
t = time.time()
while True:
    # Break if this takes more than some_limit
    if time.time() - t > some_limit:
        break
    # Check if the jobs are done. This could be done by
    # grep'ing squeue for your username and some tags
    # that you name your jobs
    check_for_completion()
    # Sleep for a while depending on the estimated completion time of the jobs
    time.sleep(some_time)

解决方案 3

在 slurm 上保留 N 个节点,运行 你的脚本在那里。这避免了前端混乱。我建议 gnu parallel 在节点上分发你的作业。

您可以 运行 您的 sbatch 命令像您之前尝试的那样在子进程中异步执行,但是对 sbatch 使用 -W 或 --wait 命令行选项。这将导致子进程在作业终止之前不会 return。然后您可以阻止主程序的执行,直到所有子进程完成。作为奖励,这还允许您处理来自外部程序的意外 return 值。有关详细信息,请参阅 sbatch documentation