Journal cjm, un frontend à dmtcp

Posté par .
Tags : aucun
32
28
juin
2012

Sommaire

Synopsis :

Je vais vous parler de checkpointing de processus. Je vous préviens, je ne suis pas un expert juste un utilisateur. Pour répondre à mes besoin j'ai écrit un petit (minuscule) frontend à une solution existante.

Problèmatique

Lançant régulierement des calculs coûteux (en temps) sur des machines (dont certaines qui n'ont pas la chance de m'avoir comme utilisateur root), je suis confronté à plusieurs problèmes de calculs interrompus par des causes multiples. Voici quelques exemples vécus.

  • Coupure ERDF (d'un temps supérieur à la capacité de l'onduleur)
  • kernel panic (un autre utilisateur a un processus qui consomme 31.8 GiB sur 32 GiB, l'OOM-killer est bourré, il tire sur tout ce qui bouge sauf lui)
  • administrateurs qui décident d'une mise à jour (même si ils préviennent à l'avance certains calculs peuvent prendre plusieurs mois)

Bref il me fallait un moyen d'avoir de la reprise sur état.

Ce qui existe

Quelques recherchent m'ont mené au mot clef Application_checkpointing. Ok, c'est cool. En gros deux outils correspondent à mes besoins

Le premier est simple et correspond exactement à ce que je veux, mais misèricorde ! il fait n'importe quoi quand je l'essaie. Je me détourne donc de cette solution.

Le second est un vrai couteaux suisse, après avoir mis 3 heures à comprendre comment ça marche, j'ai compris qu'il pouvait faire ce que je voulais, et bien plus.

En plus il ne necessite pas de dépendances (autres qu'un compilateur à la compilation, ☺), je peux l'installer facilement dans mon home sans faire le resolveur de dépendances dans ma tête (ou sans installer une gentoo prefix, ça dépend de la religion).

Bon le problème c'est qui est super-casse-bonbons à utiliser, il faut lancer le coordinateur pour chaque travail, lancer le prcessus, causer au coordinateur… bref c'est légèrement énervant.

Ma solution

Ne voulant faire qu'un usage restreint des fonctionnalités de dmtcp, et ayant envie d'avoir un gestionnaire sympa, j'ai écrit un petit script qui fait le boulot pour moi. À l'origine c'était juste pour moi, je ne pensais pas le publier, ça ne mérite pas grand chose, surement pas une page web. Bon je me suis quand même motivé, j'ai rajouté un header avec une licence vraiment libre, et j'en fais un journal.

Voici le script en question, il s'appelle cjm pour checkpointed job manager.

Voici une petite démo (avec GNU Octave)

  • Sur le premier terminal je demarre octave :

    jben@ginette ~ $ cjm start octave -q
    cjm start: job id 5
    
    warning: X11 DISPLAY environment variable not set
    octave:1> A=rand(2)
    A =
    
       0.99239   0.98673
       0.14165   0.91403
    
    octave:2>
    
  • Bon c'est le job numéro 5, voyons voir le fonction list et info, sur un autre terminal :

    jben@ginette ~ $ cjm list
    # id    host        status      command
    --------------------------------------------------------
    4   ginette     stopped     octave
    5   ginette     launched    octave -q
    
    jben@ginette ~ $ cjm info 5
    Job id                  : 5
    Host                    : ginette
    Command                 : octave -q
    Last start              : 28/06/2012 20:20:34 +0200
    Status                  : Launched
    Automatic checkpointing : disabled
    Size                    : 24K
    No checkpoint found
    
  • Bon on peut lui demander manuellement un checkpoint

    jben@ginette ~ $ cjm checkpoint 5
    
  • Et regarder le résultat

    jben@ginette ~ $ cjm info 5
    Job id                  : 5
    Host                    : ginette
    Command                 : octave -q
    Last start              : 28/06/2012 20:20:34 +0200
    Status                  : Launched
    Automatic checkpointing : disabled
    Size                    : 25M
    Last checkpoint         : 28/06/2012 20:21:10 +0200
    
  • Maintenant on quitte la session d'octave, on ferme le terminal (on reboote si on a envie), et dans un terminal on repart du checkpoint

    jben@ginette ~ $ cjm restart 5
    cjm restart: job id 5
    
    octave:2> A
    A =
    
       0.99239   0.98673
       0.14165   0.91403
    
    octave:3>
    

On peut configurer un checkpointing automagique, à utiliser avec modération, lors de la création d'un checkpoint le processus est arrêté, cela peut prendre beaucoup de temps si l'espace mémoire occupé est grand. comme mon but c'est de pouvoir relancer un travail long, je ne suis pas à une heure près, je ne descend jamais en dessous d'une periode de une heure.

Cerise sur le gateau, avec plusieurs machines identiques, un home partagé en NFS, je le stoppe sur l'un je le redemarre sur l'autre.

Voila, ça vaut ce que ça vaut. Moi je trouve cela génial, mais je suis comme un gosse avec ce qui brille…

Pour ceux que ça n'interesse pas, une nimage.

  • # Ma question

    Posté par . Évalué à 1.

    certains calculs peuvent prendre plusieurs mois

    Je comprends mieux le problème. Mais juste par curiosité, quelle sorte de calcul peut prendre plusieurs mois ? Pour quelle puissance de calcul à disposition ? Je suppose que c'est pour autre chose que jouer a gnuchess…

    • [^] # Re: Ma question

      Posté par . Évalué à 2.

      Mais juste par curiosité, quelle sorte de calcul peut prendre plusieurs mois ?

      Perso je n'ai jamais lancé de calculs plus longs que quelques semaines. Mais les gens autour de moi dans mon unité lancent parfois des calculs qui durent un peu plus.

      Par exemple, ça peut être de la simulation de graphe aléatoire, l'estimation de paramêtres décrivant la structure d'un graphe observée (c'est sur ça que je bosse), ou encore un Monté Carlo par chaîne de Markov pour simuler sous une loi dont la normalisation n'est pas connue par exemple (ça, c'est très utiles à ceux qui développent des methodes bayesiennes).

      Niveau moyen de calcul, ça va, mais on pourrait avoir mieux. 4 machines, équipée en Intel Xeon E5410, 32 GiB de RAM par machine. Je rève d'une machine avec plus de cœur, mais comme la pluspart des calculs lancé ne sont pas parralelles (et souvent non parralelisables, par exemples les MCMC), ça ne servirait pas à grand chose (sauf à moi).

    • [^] # Re: Ma question

      Posté par (page perso) . Évalué à 2. Dernière modification le 29/06/12 à 09:43.

      « quelle sorte de calcul peut prendre plusieurs mois ? »

      Pour prendre en compte correctement la corrélation électronique dans l'interaction entre (seulement) deux atomes de terres rares, avec des approximation assez drastiques, il faut pouvoir extraire les valeurs propres d'une matrice de plus de 1e9 sur 1e9 éléments. Pour faire les choses sans trop d'approximations ça pourrait facilement monter à beaucoup plus. Comme personne n'envisage encore des machines avec assez de mémoire pour de telles matrices, il faut faire beaucoup plus de calcul qu'une extraction de valeurs propres standard pour obtenir le résultat.

  • # Octave

    Posté par (page perso) . Évalué à 3.

    Merci pour ce journal très intéressant.

    Je me pose juste une question: si tes calculs prennent autant de temps, est-ce que tu n'aurais pas intérêt à redévelopper les parties qui prennent du temps en C/C++/Fortran optimisé? Si ton code est en octave de base, je pense que tu peux gagner un facteur dix en performances, au moins.

    • [^] # Re: Octave

      Posté par . Évalué à 4.

      C'est déjà fait en partie. Je donnais un exemple avec octave, car c'est plus simple à montrer.

      Mais dans certains cas il vaut mieux rester en octave, par exemple dans certains cas c'est le calcul matriciel qui est limitant niveau vitesse et non la boucle. Octave (comme beaucoup d'autres) faisant appel à blas et lapack (fournies par atlas sur les systemes que j'utilise), il n'y a vraiment rien à gagner sur ce point à réimplementer en C++ (par exemple).

      Pour d'autres applications, comme les MCMC que j'ai déjà cité dans un commentaire précedent, c'est souvent la boucle qui est limitante en Octave, et dans ce cas une implémentation en C++ (par exemple) apporte un gros gain (un facteur entre 10 et 100 je dirais).

      Disons que quand du code octave, R, ou tout autre language interprété dont l'interpréteur fait appel au libs de calcul matriciel éprouvés, est lent, le réimplementer dans un language compilé peut apporter entre un gros gain et aucun gain. C'est toujours le même problème, il réflechir avant de coder !

  • # NFS

    Posté par . Évalué à 3.

    Je ne connaissais pas dmtcp, chouette découverte.

    Est-ce que tu as eu l'occasion de tester la reprise sur un partage NFS ?

    • [^] # Re: NFS

      Posté par . Évalué à 3.

      Oui, ça marche très bien.

      Je précise toutefois que les machines en question sont identiques, avec le même OS (Debian en l'espèce), les même libs installés, avec les mêmes versions.

      • [^] # Re: NFS

        Posté par . Évalué à 1. Dernière modification le 29/06/12 à 17:31.

        Tu lances un programme qui accède à un fichier sur un partage NFS, tu fais le checkpoint, tu arrêtes, et ça repart ? Il faut je teste ça, merci !

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.