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 _gp . Évalué à 1.
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 jben . Évalué à 2.
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 ǝpɐןƃu∀ nǝıɥʇʇɐW-ǝɹɹǝıԀ (site web personnel) . Évalué à 2. Dernière modification le 29 juin 2012 à 09:43.
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.
« IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace
# Octave
Posté par JoeltheLion (site web personnel) . É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 jben . É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 jbdenis . É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 jben . É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 jbdenis . Évalué à 1. Dernière modification le 29 juin 2012 à 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 à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.