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
我有一个 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