我正在编写一个python脚本,为数百个作业准备输入文件(比如job.id = 1到job.id = 1000,其中job.id是一个自我分配的id),然后在集群上提交它们执行。每个作业有3个阶段,s1,s2和s3,其中s2取决于s1的结果,s3取决于s2的结果。在超级集群上使用48-64个cpu核心每个作业可能需要3到4天。我希望我的脚本能够自动处理每个作业的所有阶段。我认为一种方法是立即为所有作业提交s1阶段,然后定期检查所有作业的输出文件(如果存在)的状态或读入队列状态,并查看特定作业是否从队列中消失(即在每5或10或12小时后完成)。我的脚本的基本布局如下。
import sched, time
from subprocess import *
jobs_running = True
s = sched.scheduler(time.time, time.sleep)
def Prepare():
print "prepare jobs by reading some source files"
print "set some flages for each job, e.g. job.id, job.stage, etc."
print "submit jobs using < Popen('qsub nNodes Ncores jobinputfile') > "
def JobStatus():
global jobs_running
print "check status of each job"
"""
for job in jobs:
if job.stage1 == complete:
print "goto stage 2"
print "reset job.stage flages etc."
elif job.stage2 == complete:
print " go to stage 3"
.
.
else last stage:
if all stages complete for all jobs:
set (global var) jobs_running = False
"""
def SecondStage():
print " prepare for second stage "
print " submit using < Popen('qsub nNodes Ncores jobinputfile') > "
def TimeSchedular(sc):
global jobs_running
JobStatus()
if jobs_running :
s.enter(36000, 1, TimeSchedular, (sc,))
if (__name__ == "__main__"):
Prepare()
s.enter(36000, 1, TimeSchedular, (s,))
s.run()
由于许多原因,这绝对不是一个优雅的解决方案。例如,我必须检查每个周期中每个作业的状态。此外,如果在检查状态后立即完成工作,它将等待接下来的5或10或12小时,以便提交下一阶段。所以我的问题是:
有没有办法直接从PBS / SLURM或上述布局中的系统获取作业完成信号,比如job.id = 99,这样就可以进入下一阶段(不检查状态其余的工作)? 或者有人可以提出更好的解决方案吗?
答案 0 :(得分:1)
实现这一目标的正常方法是通过工作dependencies。例如,如果您的工作在开始之前依赖于另一个工作,您可以执行以下操作:
jobid1=`qsub phase_one.sh`
jobid2=`qsub phase_two.sh -W depend=afterok:${jobid1}`
# and so on as needed
那里的链接转到Torque文档。我很确定大多数资源管理器都提供类似的功能。