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.
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 :
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.
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 :
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.