我正在编写一个python脚本,它为数百个作业准备输入文件(例如作业.id=1至作业.id=1000,其中作业.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或上述布局中的系统获取作业完成信号作业.id=99,以便进入下一阶段(不检查其余作业的状态)? 或者有人能提出更好的解决方案吗?在
通常的方法是通过作业dependencies。例如,如果某个作业在启动前依赖于另一个作业,则可以执行以下操作:
链接到扭矩文档。我相当确定大多数资源管理器都提供类似的功能。在
相关问题 更多 >
编程相关推荐