Condor(Grid)

Condor est le logiciel qui gère le Grid, l'infrastructure de calcul distribué de l'INGI.

Un certain nombre de machines sont dédiées au calcul pour le Grid. Toutes les machines de salles étudiantes sont accessibles via le Grid. Plus d'informations sur les caractéristiques de ces machines est disponible sur la page dédiée au matériel.

Condor vous permet d'exécuter des tâches sur le Grid.

1.  Connexion à la machine principale de Condor

Le noeud principal de Condor est studssh.info.ucl.ac.be. Pour interagir avec le Grid, vous devez d'abord vous connecter:

ssh LOGIN_INGI@studssh.info.ucl.ac.be

2.  Lancer un script

Maintenant que vous êtes sur StudSSH, vous pouvez interagir avec Condor, et donc avec le Grid. Pour lancer un de vos scripts sur le Grid, vous devez tout d'abord créer un fichier de description du travail à effectuer, puis soumettre ce fichier.

2.1  Créer le fichier de description

Voici un exemple de fichier de description:

#Votre script a exécuter
Executable   = mandel.py 
#Le log dans lequel tout sera indiqué
Log          = mandel.log 
#Les sorties. $(Process) indique le numéro du processus
Output       = mandel.outputfile.$(Process)
#Permet d'exécuter le job sur les machines en x86_64. Important.
requirements = Arch == "X86_64" 
#Executer 10 fois le script
Queue 10

Vous pouvez également rajouter une ligne Input = fichierinput, qui sera appliqué sur l'input standard de votre script. Tous les chemins du fichier sont relatifs par rapport au fichier.

Un script de test, mandel.py, est fourni en bas de cette page.

Sauvegardons donc ce fichier sous le doux nom de job.

2.2  Soumettre le travail

Maintenant que vous avez sauvegardé votre configuration, il vous suffit de la soumettre à Condor:

$ condor_submit job
Submitting job(s)..........
Logging submit event(s)..........
10 job(s) submitted to cluster 1737074.

Notez qu'il faudra plusieurs minutes avant que le travail sur vos tâches commence, même si la file d'attente est vide.

3.  Statuts des machines

La commande condor_status permet de voir quelles machines sont utilisées actuellement:

$ condor_status

Name               OpSys      Arch   State     Activity LoadAv Mem   ActvtyTime

slot1@amidala.info LINUX      X86_64 Unclaimed Idle      0.060 1476  0+01:45:05
slot2@amidala.info LINUX      X86_64 Unclaimed Idle      0.000 1476  0+01:45:06
slot3@amidala.info LINUX      X86_64 Unclaimed Idle      0.000 1476  0+01:45:07
slot4@amidala.info LINUX      X86_64 Unclaimed Idle      0.000 1476  0+01:45:08
...
slot4@yoda.info.uc LINUX      X86_64 Owner     Idle      0.000 1476  0+00:45:07
slot5@yoda.info.uc LINUX      X86_64 Owner     Idle      0.000 1476  0+00:45:08
slot6@yoda.info.uc LINUX      X86_64 Owner     Idle      0.000 1476  0+00:45:09
slot7@yoda.info.uc LINUX      X86_64 Owner     Idle      0.000 1476  0+00:45:10
slot8@yoda.info.uc LINUX      X86_64 Owner     Idle      0.000 1476  0+00:45:03
                     Machines Owner Claimed Unclaimed Matched Preempting

        X86_64/LINUX      200    17       0       183       0          0

               Total      200    17       0       183       0          0

La colonne Activity est la colonne la plus importante : elle indique si la machine est en attente d'un travail (Idle) ou occupée (Busy).

4.  File des tâches

Pour voir les tâches en attente et en cours d'exécution, exécutez la commande condor_q:

$ condor_q
-- Submitter: studssh.info.ucl.ac.be : <130.104.78.16:9680> : studssh.info.ucl.ac.be
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD                  
1688394.0   trung           3/4  14:25   0+00:00:31 R  0   0.1  SECAlgo SupportGra
1688415.0   trung           3/4  14:25   0+00:00:00 I  0   0.1  SECAlgo SupportGra
...

La colonne ST contient le statut actuel de la tâche : R=Running(en cours),H=Held(erreur), I=Idle(en attente).

4.1  Voir seulement mes tâches

$ condor_q -submitter LOGIN_INGI

4.2  Plus d'informations sur une tâche

L'argument -bet (diminutif de -better-analyse) affiche beaucoup d'informations sur les tâches en attente. Particulièrement utile lorsque votre tâche est Held.

$ condor_q -submitter pirauxma -bet
....
1737073.002:  Run analysis summary.  Of 51 machines,
      5 are rejected by your job's requirements
      0 reject your job because of their own requirements
      0 match but are serving users with a better priority in the pool
     46 match but reject the job for unknown reasons
      0 match but will not currently preempt their existing job
      0 are available to run your job
	Last successful match: Tue Mar  4 15:32:23 2014

The Requirements expression for your job is:

( target.Arch == "X86_64" ) && ( target.OpSys == "LINUX" ) &&
( target.Disk >= DiskUsage ) && ( ( target.Memory * 1024 ) >= ImageSize ) &&
( TARGET.FileSystemDomain == MY.FileSystemDomain )

    Condition                         Machines Matched    Suggestion
    ---------                         ----------------    ----------
1   ( target.Arch == "X86_64" )       46                   
2   ( target.OpSys == "LINUX" )       51                   
3   ( target.Disk >= 2 )              51                   
4   ( ( 1024 * target.Memory ) >= 2 ) 51                   
5   ( TARGET.FileSystemDomain == "info.ucl.ac.be" )
                                      51      
...

Il n'est pas grave d'avoir un certain nombre de machines dans la catégorie X match but reject the job for unknown reasons. Cela signifie simplement que votre tâche n'est pas encore parvenue jusqu'elles. Cela peut prendre plusieurs minutes.

5.  Script de test

Voici un script python qui tourne assez longtemps, pour vous permettre d'effectuer un test de votre configuration. Il calcule des fractales de Mandelbrot... sur la console.

#!/usr/bin/python
# by Daniel Rosengren

import os, sys, time
stdout = sys.stdout

BAILOUT = 16
MAX_ITERATIONS = 100000

class Iterator:
  def __init__(self):
    print 'Rendering...'
    for y in range(-39, 39):
      stdout.write('\n')
      for x in range(-39, 39):
        i = self.mandelbrot(x/40.0, y/40.0)

        if i == 0:
          stdout.write('*')
        else:
          stdout.write(' ')

  def mandelbrot(self, x, y):
    cr = y - 0.5
    ci = x
    zi = 0.0
    zr = 0.0
    i = 0

    while True:
      i += 1
      temp = zr * zi
      zr2 = zr * zr
      zi2 = zi * zi
      zr = zr2 - zi2 + cr
      zi = temp + temp + ci

      if zi2 + zr2 > BAILOUT:
        return i
      if i > MAX_ITERATIONS:
        return 0

t = time.time()
Iterator()
print '\nPython Elapsed %.02f' % (time.time() - t)