2017-01-11 14 views
2

何百ものジョブの入力ファイルを準備するpythonスクリプトを書いています(job.id = 1、job.id = 1000、job.id自己割り当てのIDです)、実行のためにクラスターに提出してください。各ジョブは、s1、s2、s3の3つのステージを持ちます。ここで、s2はs1の結果に依存し、s3はs2の結果に依存します。各ジョブは、スーパークラスタ上で48〜64個のCPUコアを使用して3〜4日かかることがあります。私は自分のスクリプトが各ジョブのすべてのステージを自動的に処理するようにしたい。 1つの方法は、すべてのジョブに対して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 

リンク:たとえば、あなたはそれを開始する前に、別のジョブに依存して仕事をしている場合、あなたはこのような何かを行うことができます。ほとんどのリソースマネージャーが同様の機能を提供していることは間違いありません。

関連する問題