2017-01-11 4 views
2

Я пишу скрипт python, который подготавливает входные файлы для сотен заданий (скажем job.id = 1 to job.id = 1000, где job.id это самонастраиваемый идентификатор), а затем отправить их в кластер для выполнения. Каждое задание имеет 3 этапа, s1, s2 и s3, где s2 зависит от результатов s1 и s3 зависит от результатов s2. Каждое задание может занимать от 3 до 4 дней с использованием 48-64 ядер процессора в суперкласте. Я хочу, чтобы мой скрипт автоматически обрабатывал все этапы для каждой работы. Один из способов, который, как я думал, состоит в том, чтобы сразу отправить s1-этап для всех заданий, а затем периодически проверять состояние выходных файлов (если существует) для всех заданий или читать в статусе очереди и видеть, исчезло ли какое-либо задание из очереди (т. Е. завершается), после каждых 5 или 10 или 12 часов. Основной макет моего сценария выглядит следующим образом.Как получить статус завершения PBS/Torque/Slurm в скрипте Python

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 

В ссылке там идет к документации крутящего момента. Я уверен, что большинство диспетчеров ресурсов предлагают аналогичную функциональность.

Смежные вопросы