2017-03-27 2 views
1

Hier soir, j'ai envoyé un grand nombre de jobs avec qsub du même exécutable mais avec des paramètres d'entrée différents. La plupart des emplois étaient en file d'attente, attendant que les autres finissent. Ce matin, j'ai réalisé que tous les travaux en attente utilisaient la dernière instance de mon fichier d'entrée.Envoyer plusieurs jobs qsub avec différents paramètres d'exécution

Quelle est la manière standard de contourner ce problème? Devrais-je avoir un fichier d'entrée par tâche et compiler mon code afin qu'il lise le bon? Ou existe-t-il une solution meilleure/plus robuste?

+0

Avez-vous modifié un script '' pbs' entre chaque qsub'? – gauteh

+0

@gauteh non je ne l'ai pas fait. Mon erreur (stupide) est que j'ai supposé que le fichier d'entrée serait lu quand j'enverrais le travail, ce qui n'a pas de sens. Cependant, je trouve qu'ayant N fichiers d'entrée différents pour les simulations N, nécessitant une recompilation N est très inefficace. Donc, je pense qu'il doit y avoir une meilleure façon de faire les choses – solalito

+0

Si vous modifiez l'exécutable pour prendre des arguments d'entrée sur la ligne de commande plutôt que d'être défini au moment de la compilation, vous pouvez utiliser une approche comme décrit ci-dessous. Vous pouvez également envelopper votre exécutable dans un script qui donne des paramètres d'entrée plus compliqués que des nombres simples qui sont plus faciles à traiter dans le script PBS. – gauteh

Répondre

1

Vous pouvez créer un script PBS maître qui passe en boucle sur les différentes paramters d'entrée, les exécute en parallèle ou séquentielle:

cela donne simplement executable un numéro d'entrée différent pour chaque tâche (IN), vous devez modifier ce pour effectuer une boucle sur un ou plusieurs de vos paramètres d'entrée si nécessaire.

# PBS -l mppwidth=2048 

NIN=10 # number of input parameters 

for IN in `seq -w 1 $NIN`; do 
    cd "sub_job_${IN}" 
    executable $IN # runs jobs sequentially (you might have to prefix this with aprun) 
done 

ou en parallèle:

# PBS -l mppwidth=2048 
# ^^ these should now be shared among the jobs. 

NIN=10 # number of input parameters 

for IN in `seq -w 1 $NIN`; do 
    cd "sub_job_${IN}" 
    executable $IN & # runs the job in the background, you might 
        # have to prefix this with `aprun -n .. -N ..` or something 
        # so that each job only uses a portion of the total 
        # requested CPUs. 
done 
wait # wait for all jobs to finish 
+0

TBH, j'avais déjà pensé à quelque chose comme ça mais je pensais qu'il devait y avoir un moyen meilleur/plus propre. Merci pour la solution cependant! La meilleure solution pourrait être d'avoir un script python éditer mes fichiers d'entrée et de lancer les simulations les unes après les autres ... – solalito

+0

Oui, j'utilise fréquemment python comme script maître en lançant chaque job en tant que thread en utilisant le ThreadPoolExecutor (avec un lancement d'aprun dans chaque processus). De cette façon, vous pouvez tirer parti de l'interface python simple pour garder une trace de vos travaux. – gauteh