Utilisation de Ganga

Ganga est une interface python permettant la création et la gestion de jobs.

Ce logiciel est installé sur lyoserv.in2p3.fr. Pour l'utiliser, commencez par copier le fichier à la racine de votre home lyoserv avec le nom {.gangarc} (attention au point devant le nom). Éditez ensuite ce fichier pour indiquer le nom de votre VO aux lignes 359 et 1111. Exemple :

VirtualOrganisation = vo.ipnl.in2p3.fr
init_opts = --voms vo.ipnl.in2p3.fr

Vous pouvez ensuite lancer ganga en vous connectant à lyoserv.in2p3.fr et en tapant :

$ ganga

Création d'un job Hello World

Pour créer un job qui sera envoyé sur le Tier3 IPNL uniquement et qui exécutera la commande /bin/echo avec en paramètres "Hello World" :

Veillez à remplacer cream-pbs-ipnl par cream-pbs-nom_de_votre_file dans le code suivant et dans tous les autres exemples !

j = Job()
j.application = Executable(exe=File('/bin/echo'), args=['Hello World'])
j.backend='CREAM'
j.backend.CE='lyogrid07.in2p3.fr:8443/cream-pbs-ipnl'

Vous pouvez obtenir une description complète du job en tapant simplement le nom de la variable contenant le job :

j

Pour soumettre le job :

j.submit()

Votre job devrait être envoyé sur le T3. Vous pouvez suivre sont état avec la commande :

jobs

Vous obtenez alors un tableau contenant tous les jobs que vous avez déjà soumis, avec leur état actuel. Votre job devrait être submited. Si tout se passe bien il sera ensuite running (très peu de temps dans notre exemple) et finalement {completed}.

La première colonne du tableau vous donne un identifiant unique pour votre job. Vous pouvez accéder à un job particulier en donnant son ID à la commande jobs :

jobs(26)

correspond au job ayant l'ID 26.

Regardons maintenant les fichiers créés par notre job (on suppose ici que l'ID du job est 1):

jobs(1).peek()

Vous devriez disposer de 3 fichiers dont la sortie d'erreurs (stderr.gz) et la sortie standard (stdout.gz). Ces fichiers sont automatiquement récupérés par ganga. Pour lister le contenu de stdout.gz:

!zcat $jobs(1).outputdir/stdout.gz

Le caractère '!' permet de passer une commande système depuis ganga. On utilise ici la commande zcat permettant de lister le contenu d'un fichier texte ayant été zippé. On lui passe en argument le fichier stdout.gz se trouvant dans le répertoire de sortie du job n°1. Vous devriez retrouver dans ce fichier le résultat de notre job : la chaine de caractères {Hello World}.

Vous pouvez bien entendu accéder aux fichiers de sortie sans l'intermédiaire de ganga. Pour savoir où ils se trouvent :

jobs(1).outputdir

Exécuter votre propre script

Pour utiliser un script dont vous êtes l'auteur, il suffit de l'indiquer lors de la création du job. Le script sera automatiquement envoyé avec le job. Si votre script génère un fichier en sortie autre que la sortie standard (par exemple monfichier.txt) vous avez 2 possibilités : * copier explicitement le fichier sur le Storage Element à la fin de votre script (solution la plus efficace et la plus robuste). * le copier dans l'{output sandbox}. Le fichier sera alors récupéré directement par ganga, mais cela n'est possible qu'avec les fichiers de taille relativement modeste et sur un petit nombre de jobs (pas plus de quelques dizaines de Mo par job, pas plus d'un ou deux Go au total sur tous les jobs).

Dans notre exemple nous ne générons qu'un petit fichier texte, nous allons utiliser l'output sandbox.

j = Job()
j.application = Executable(exe=File('~/grille/testJob.sh'), args=['arg1','arg2'])
j.backend='CREAM'
j.backend.CE='lyogrid07.in2p3.fr:8443/cream-pbs-ipnl'
j.outputsandbox=['monfichier.txt']
j.submit()

Lorsque le job est terminé, vous devriez trouver un fichier {monfichier.txt} dans le répertoire de sortie du job.

Générer plusieurs jobs à partir d'une seule soumission

Il est probable que vous ayez besoin d’exécuter plusieurs fois le même script avec des paramètres différents. Ganga peut vous simplifier la tache. Supposons que notre script précédent (testJob.sh) prenne 2 paramètres : un entier et une chaîne de caractères. Notre but est de créer 10 jobs qui prendront comme paramètres:

1 default
2 default
3 default
4 default
5 default
6 default
7 default
8 default
9 default
10 default

Pour notre exemple on fait donc varier le premier paramètre et on garde le même second paramètre. La première étape est de créer le job, comme nous l'avons déjà fait précédemment :

j = Job()
j.application = Executable(exe=File('~/grille/testJob.sh'), args=['arg1','arg2'])
j.backend='CREAM'
j.backend.CE='lyogrid07.in2p3.fr:8443/cream-pbs-ipnl'
j.outputsandbox=['monfichier.txt']

Nous allons maintenant créer la liste des paramètres :

params=[]
for i in range(1,11):
    args=[i,'default']
    params.append(args)

Le tableau params contient maintenant une liste de 10 tableaux, chacun de ces tableaux contenant 2 éléments : un entier et une chaîne de caractères. Il nous reste à utiliser ce tableau dans notre job :

s = ArgSplitter()
s.args=params
j.splitter=s

Il ne reste qu'à soumettre le job :

j.submit()

Au lieu de ne soumettre qu'un seul job, ganga va en soumettre 10: autant que d'entrées dans le tableau params. Vous avez en fait un job parent qui contient 10 jobs enfant. La commande jobs ne vous indiquera qu'une seule entrée pour la soumission, mais la colonne subjobs contiendra la valeur 10. Si votre job a reçu l'ID n°23, la commande :

jobs(23).subjobs

vous donne l'état de chacun des 10 jobs enfant (ID 23.0 à 23.9). Lorsque les 10 sont terminés, le job parent est également terminé.

On peut afficher le contenu du fichier monFichier.txt de chaque job enfant :

for je in jobs(23).subjobs:
   !cat $je.outputdir/monfichier.txt

Si l'un des jobs enfant a rencontré un problème, vous pouvez essayer de le soumettre à nouveau (sans re-soumettre tous les autres jobs):

jobs('23.4').resubmit()

Fusion automatique des fichiers de sortie

Dans notre exemple précédent, tous nos jobs enfant génèrent un fichier texte monfichier.txt. Il est possible de demander à ganga de fusionner les 10 fichiers lorsque tous les jobs sont terminés. On créé le job comme précédemment et on ajoute :

tm=TextMerger()
tm.files=['monfichier.txt']
j.merger=tm

Il ne reste qu'à soumettre le job. Lorsque les 10 jobs enfant sont terminés, ganga va fusionner les 10 fichiers monfichier.txt et copier le résultat dans le répertoire de sortie du job parent.

Documentation

Pour plus d'informations sur l'utilisation de ganga, reportez-vous à http://ganga.web.cern.ch/ganga/user/html/GangaIntroduction/GangaIntroduction.html