Docu: comment faire tourner un script R avec SLURM

Existe--t-il une page où on explique comment lancer un script R avec srun sur le cluster ? Je suppose qu'il "n'y a qu'à" combiner quelques infos qu'on trouve à différents endroits, mais je ne suis pas sûr de savoir comment faire. Je crois que ce serait utile de faire un tuto spécifique à cette question, car elle concerne potentiellement un bon nombre d'usagers.

Pour le moment j'utilise coupablement sinteractive, mais si vous m'indiquez les bonnes pratiques je contribuerai volontiers à la rédaction d'une page de doc spécifique sur cette question.

On pourrait d'abord rappeler les principes

  • ne JAMAIS faire tourner sur le noeud d'accès
  • utiliser srun ou sbatch

puis les étapes:

  1. Charger le module R,

  2. S'assurer qu'on ait les bonnes librairies

    Au fait, si elles ne sont pas installées, peut-on en installer dans son compte ? Le fait-on avec conda ou directement via R install.package() ?

  3. Rédiger son script

  4. Tester son script pas à pas pour voir comment ça tourne. Au fait comment faites-vous ?

    • sinteractive ?
    • autre ?
    • vous écrivez tout votre script sans une seule faute puis vous le lancez via srun ?
      Pour le moment je fais cela avec 2 onglets sous sinteractive (emacs + R) mais je suis preneur de solutions sinteractive-free)
  5. Lancer le script en job, en choisissant les paramètres (mémoire, nombre de coeurs),

  6. Capturer les sorties STDERR et STDOUT dans des fichiers .err et .out.
    Au fait, doit-on utiliser &1 et &2 ou bien SLURM le fait-il tout seul ? Si oui comment choisit-on le chemin de ces fichiers, ou bien comment les trouve-t-on ?

  7. Vérifier le bon déroulement du script en suivant les captures de SDTOUT et STDERR

  8. Accéder à ses résultats y compris les fichiers graphiques. Au fait, comment faites-vous ? Moi je monte le dossier de résultats sur mon portable, mais ce n'est peut-être pas la façon la plus correcte.

  9. Récupérer les résultats sur son ordi (rsync, filezilla, coincoin)

  10. ... ?

Merci

Jacques

Bonjour Jacques,

Quelques éléments de réponses, je laisse le soin aux collègues de me corriger ou compléter si besoin.

Existe--t-il une page où on explique comment lancer un script R avec srun sur le cluster ?

La documentation actuelle doit encore être mise à jours pour intégrer srun.
En attendant, Julien propose "The 5 minutes IFB Core Cluster tutorial" : https://asciinema.org/a/zZrSazw5Fh7YmpHvUfvVQnzNi

Pour le moment j'utilise coupablement sinteractive, mais si vous m'indiquez les bonnes pratiques je contribuerai volontiers à la rédaction d'une page de doc spécifique sur cette question.

On prends évidemment toute aide pour la rédaction de documentation. Peut-être qu'une page de doc "exemple" sur l'usage du cluster via R serait utile.
Les principes données me semblent correctes.
Les pages de documentation (https://ifb-elixirfr.gitlab.io/cluster/doc/) sont au format Markdown et gérées via le dépôt gitlab: https://gitlab.com/ifb-elixirfr/cluster/doc/
La rédaction est ouverte et discuté via des "Merge Request".

Au fait, si les librairies ne sont pas installées, peut-on en installer dans son compte ? Le fait-on avec conda ou directement via R install.package() ?

Tout est possible. On peut installer des librairies dans son /home (via conda, install.package ou autre). Et il est possible de demander ou contribuer à l'installation de ces paquets sur l'environnement commun pour qu'ils soient accessible à tous les utilisateurs.
Suivant le cas ("test d'une librairie", "installation d'une librairie pour un groupe d'utilisateurs", etc.) on privilégiera l'une ou l'autre solution.
Sur la méthode d'installation (conda, install.package, ...) je n'ai pas de recommandations particulières.

Tester son script pas à pas pour voir comment ça tourne. Au fait comment faites-vous ?

Personnellement, je privilégie toujours les scripts lancé via sbatch.
Les commandes de traitement au sein de ce script sont préfixées par srun.
Je construis le script au fur et à mesure en testant les commandes via srun (et une fois la commande validée, je copie/colle).
PS: j'avoue avoir découvert srun assez récemment (j'utilisais auparavant d'autre mécanisme tel que sinteractive).
srun permets entre autre d'avoir des métriques et un suivi plus précis et il remplace avantageusement sinteractive:

$ module load r/3.5.1 
$ srun --pty R

# Toutes les commandes sont alors exécuté sur un noeud de calcul (grâce à srun)
> Sys.info()["nodename"]
               nodename 
"cpu-node-83.ifb.local" 

sinteractive est pour l'instant indispensable pour les commandes necessitant un affichage déporté (via X11).
Attention, dans les deux cas, cela monopolise un CPU sur un nœud de calcul. De ce fait, il ne faut pas laisser traîner ce type de connexion si ce n'est pas nécessaire.

Capturer les sorties STDERR et STDOUT dans des fichiers .err et .out.
Au fait, doit-on utiliser &1 et &2 ou bien SLURM le fait-il tout seul ? Si oui comment choisit-on le chemin de ces fichiers, ou bien comment les trouve-t-on ?

Slurm capture les sorties standard et d'erreur.
Par défaut, les deux sorties sont redirigées vers un fichier "slurm-%j.out" (%j = jobid).
A noter aussi que le fichier est remplit en "live" (et pas seulement à la fin de l'exécution du job). Cela permet donc de suivre l'exécution du job.
Mais il est possible de changer ce comportement en spécifiant les fichiers pour chacune des sorties:

-o, --output=<filename pattern>
-e, --error=<filename pattern>

Vérifier le bon déroulement du script en suivant les captures de SDTOUT et STDERR

Oui en suivant le/les fichiers de sorties.

Pour avoir des inforamtions sur le/les jobs, j'aime bien utiliser aussi les commandes suivantes:

# Voir les jobs
squeue -l
# Voir mes jobs
squeue -l -u $USER

# Information sur le job
scontrol show job <jobid>

# Si on utilise srun, on peut avoir des informations précises sur les ressources utilisées
# Par exemple avec la commande ci-dessous (chaque "step" étant une commande srun):
sstat --allsteps --format=JobID,AveCPU,AveRSS,AveVMSize,AveDiskRead,AveDiskWrite,NTasks -j <jobid>

# La commande sacct remonte également beaucoup d'information sur les jobs et les ressources utilisés
sacct
# Ou en sélectionnant les colonnes qui m'interessent
sacct --format=JobID,JobName,State,Elapsed,Partition,ReqCPUS,ReqMem,ReqNodes,NodeList,AveCPU,AveRSS,AveVMSize,AveDiskRead,AveDiskWrite,ExitCode -j <jobid>

J'aime bien également recevoir un email en début/fin du job en spécifiant les options suivants à sbatch:

--mail-user=email@address
--mail-type=ALL

Accéder à ses résultats y compris les fichiers graphiques.

Quelques infos complémentaire: https://ifb-elixirfr.gitlab.io/cluster/doc/data/

Récupérer les résultats sur son ordi (rsync, filezilla, coincoin)

Sans oublier scp :slight_smile:

Peut-être que d'autres personnes auront d'autres pratiques ?
N'hésitez pas venir partager vos façons de faire, questionnements ou conseils.

Bonne journée

Merci David!

J'ai progressé sur la façon de lancer des scripts R avec srun + sbatch mais je ne suis pas encore au point. Comme j'avais lancé la question sur le site support, je propose de poursuivre à cet endroit.

On pourra ensuite revenir à la doc, après avoir défini les bonnes pratiques pour lancer des jobs Rscript via srun et sbatch, et pour suivre leur exécution.

OK pour toi ?

Jacques

Bonjour Jacques,

Ça me va bien :+1:

Les exemples données par Julien (Running parallel jobs based on Rscript) me semblent nikel.

A bientôt