2017-01-11 5 views
2

나는 수백 개의 작업에 대한 입력 파일을 준비하는 파이썬 스크립트를 작성하고 있습니다 (job.id = 1에서 job.id = 1로 job.id 자체 할당 된 ID입니다) 실행을 위해 클러스터에 제출하십시오. 각 작업에는 s1, s2 및 s3의 3 단계가 있습니다. 여기서 s2는 s1의 결과에 종속되고 s3은 s2의 결과에 종속됩니다. 각 작업은 수퍼 클러스터에서 48-64 CPU 코어를 사용하여 3-4 일이 소요될 수 있습니다. 스크립트가 각 작업의 모든 단계를 자동으로 처리하기를 원합니다. 한 가지 방법은 모든 작업에 대해 s1 단계를 한 번에 제출 한 다음 모든 작업에 대한 출력 파일 (있는 경우) 또는 큐 상태를 정기적으로 확인하고 특정 작업이 대기열에서 사라 졌는지 확인하는 것입니다 (예 : 완료, 각 5 또는 10 또는 12 시간 후). 스크립트의 기본 레이아웃은 다음과 같습니다.Python 스크립트에서 PBS/Torque/Slurm 작업 완료 상태를 얻는 방법

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로 다음 단계로 갈 수 있습니다. 작업 나머지 부분의 상태 확인). 아니면 누군가가 더 나은 해결책을 제안 할 수 있습니까?

답변

1

이 작업을 수행하는 일반적인 방법은 작업 dependencies입니다. 토크 설명서를 간다

jobid1=`qsub phase_one.sh` 
jobid2=`qsub phase_two.sh -W depend=afterok:${jobid1}` 
# and so on as needed 

링크 : 예를 들어, 당신이 시작하기 전에 다른 작업에 의존하는 작업이있는 경우, 당신은 이런 식으로 뭔가를 할 수 있습니다. 대부분의 리소스 관리자가 비슷한 기능을 제공한다는 것은 확실합니다.