Parallélisation slurm avec snakemake

Serait-il possible de fournir des guidelines pour la bonne utilisation de slurm avec snakemake sur le cluster IFB ?

J'ai un workflow snakemake pour lequel je gérais jusqu'ici la parallélisation soit avec l'option --jobs, soit avec qsub. Pour le faire tourner sur le cluster IFB-core il me faudrait configurer snakemake pour envoyer les jobs à slurm.

Il y a un exemple ici : https://snakemake.readthedocs.io/en/stable/snakefiles/configuration.html mais je dois avouer que je ne vois pas très bien comment l'adapter pour IFB-core-cluster. Qu'est-ce que je mets dans le sbatch ? Où intervient mon fichier snakemake ?

Quelqu'un a-t-il de l'expérience ?

Merci

Jacques

Pour envoyer des jobs sur slurm avec Snakemake tu peux utiliser la couche DRMAA.

  1. Charger le module snakemake disponible sur le cluster :
module load snakemake

Ce module inclut la librairie python drmaa

  1. Charger le module slurm-drmaa :
module load slurm-drmaa

Ce module permet de charger le driver SLURM pour DRMAA

  1. Lancer snakemake avec l'option --drmaa et l'option --jobs pour indiquer le nombre maximum de jobs concurrents que pourra lancer snakemake :
snakemake --drmaa --jobs=400 <my-output-data>

Un tuto Snakemake sera disponible très très prochainement sur le site de documentation du cluster ! Stay tune !

1 « J'aime »

Ben dis-donc ça c'est du support communautaire. Tu avais déjà commencé à rédiger la réponse avant que je ne termine de poster la question ?

En tout cas l'option -drmaa semble beaucoup plus pratique que les explications de readthedoc snakemake. Merci !

Jacques

Un doute: comment fais-je pour lancer snakemake ? J'imagine que je ne lance pas la commande à partir de la machine d'accueil. Est-ce que j'encapsule la commande dans un srun que je lance avec un sbatch ? Si oui dans lequel dois-je charcher les modules ? Le srun ? Le sbatch ? Le shel à partir duquel je lance le sbatch ?

Question un peu naïve mais je dois avouer que je n'ai pas encore très bien capté le apssage des modules / environnements conta à travers toutes ces couches.

Si tu utilises l'option --drmaa ou --cluster de Snakemake tu peux lancer la commande snakemake directement sur le login node sans soucis. L'orchestration des jobs est relativement légère et ne nécessite pas énormément de ressources.
Ca fonctionnera également très bien en lançant snakemake via srun.

Lorsque tu charges des modules (conda, snakemake, slurm-drmaa, etc.) les modules modifient ton environnement ($PATH, $LD_LIBRARY_PATH, etc.) pour que les outils choisis soient accessibles et fonctionnels. En utilisiant srun et/ou sbatch, SLURM se charge de copier ton environnement depuis ta machine courante vers les noeuds de calcul attribués à ton job. Ainsi, ce qui fonctionne sur ta machine courante fonctionnera exactement de la même manière sur le noeud de calcul.

Si tu veux en avoir le coeur net, tu peux faire un petit test :

env | sort > env_login.txt
srun env | sort > env_calcul.txt
diff env_login.txt env_calcul.txt

Tu constateras que la seule différence et l'apparition de toutes les variables de SLURM décrivant ton job, sinon rien n'a changé.

Effectivement , merci pour les explications concernant l'environnement.

J'ai un autre problème: on fait le mapping avec hisat2 et apparemment c'est hyper-gourmand en RAM.
Au départ il s'était planté en dépassant les 2GB de RAM, j'ai lancé une seule analyse hisat2 en mettant la mémoire à 4GB par CPU et il outrepasse.

slurmstepd: error: Step 3234209.0 exceeded memory limit (4198384 > 4194304), being killed
srun: Exceeded job memory limit
srun: Job step aborted: Waiting up to 32 seconds for job step to finish.

Jusqu'où puis-je aller pour la RAM ?

Est-ce que je peux lancer 48 échantillons avec 6GB/CPU et laisser snakemake se débrouiller pour trouver de la place ? Comment faire ? J'ai essayé de changer la mémoire avec srun, mais slurm ne veut même plus lancer l'analyse.

#!/usr/bin/bash
SNAKEFILE=SnakeChunks/scripts/snakefiles/workflows/mapping.wf
CONFIGFILE=metadata/config_RNA-seq.yml
JOBS=50
MEM_PER_CPU=6GB
MEM=32GB
# --mem-per-cpu=${MEM_PER_CPU} \
srun --mem=${MEM} \
   snakemake --drmaa --jobs=${JOBS} --use-conda -p \
   -s ${SNAKEFILE} --configfile ${CONFIGFILE}

J'ai essayé séparément les options --mem et --mem-per-cpu et j'ai dans les deux cas la même erreur:

srun: error: Unable to create step for job 3235955: Memory required by task is not available

Help!

Il existe une solution pour définir finement les ressources nécessaire pour chacune des règles de ton workflow Snakemake.

Avant tout, ne confonds pas les ressources alloués à processus snakemake et les ressources demandés par snakemake pour chacun de ses jobs.

En passant le paramètre --mem=${MEM} à ton srun, tu réserves simplement de la mémoire pour le processus snakemake mais pas pour les jobs que va lancer snakemake via drmaa.
En fait, ce --mem est inutile car snakemake ne consomme que très peu de ressources.

Pour résoudre ton problème pour hisat2, il faut ajouter une config de cluster pour Snakemake. Snakemake utilisera alors cette config pour réserver plus ou moins de ressources pour chaque règle.

Une config cluster est un simple fichier yaml, par exemple cluster.yml:

__default__:
  mem: 2000

hisat2:
  mem: 6000

Dans ce fichier de config, j'indique à Snakemake que par défaut (__default__) je veux que mon paramètre mem soit égale à 2000 (2GB) et pour ma règle hisat2, je veux que ce paramètre passe à 6000 (6GB).
Je te laisse adapter le nom de la règle à ce que tu as choisi dans ton workflow.

A présent, il suffit de lancer Snakemake avec quelques options en plus :

snakemake --cluster-config cluster.yml --drmaa " --mem={cluster.mem}" --jobs ${JOBS} --use-conda -p \
   -s ${SNAKEFILE} --configfile ${CONFIGFILE}

Attention à l'espace au début du paramètre de --drmaa !

A présent lorsque Snakemake va lancer des jobs, il utilisera ton fichier de config cluster pour savoir combien de mémoire attribuer à chaque job en fonction de la règle.