Snakemake + Apptainer bind parameters

Bonjour chers collègues Snakemakers (en espérant que quelques uns suivent encore ce canal parce que ça fait un petit moment qu’il n’y a pas eu d’activité :wink: …) !

Je suis un peu dans une impasse donc je me demandais si vous auriez d’autres astuces auxquelles je n’aurais pas pensé…

J'ai un pipeline que j'exécute avec l'option --use-apptainer... Du coup, je déclare en amont la variable d'environnement APPTAINER_BINDPATH pour qu'il intègre les espaces dont j’ai besoin… Mais voilà : pour une des règles, j'ai besoin aussi de monter un dossier /database qui n’est que présent sur un noeud spécifique de notre cluster de calcul. Lorsque je l'ajoute à APPTAINER_BINDPATH, j'ai une erreur parce que les autres règles s'exécutent sur des noeuds “normaux” qui n'ont pas "/database"...

J’ai tenté de regarder côté Snakemake, on dirait qu'il y a de la demande pour permettre de spécifier de façon indépendante les bindpath mais ça n'a pas l'air de bouger côté développement : Add Singularity arguments for specific rules in Snakefile · Issue #262 · snakemake/snakemake · GitHub

Et j’ai tenté aussi de regarder côté apptainer s’il n’y avait pas une option qu’on pouvait activer pour qu’il ne passe pas en erreur lorsqu’on lui donne un path qui n’existe pas à “binder” mais pas de succès non plus… La seule option que je vois requièrent d’avoir les droits admin en créant le dossier manquant s’il n’existe pas…

Mais peut-être qu’il y a un workaround auquel je n’aurai pas pensé ? Je trouverais ça bête de devoir exécuter plusieurs pipelines juste pour (re-)définir le bind d'une règle à l'autre :confused:

Merci d’avance pour vos retours… :crossed_fingers:

Chloé

1 « J'aime »

Je me réponds après avoir discuté avec des collègues qui m’ont conseillé le “workaround” suivant :

mkdir -p $PWD/database # create local database directory
ln -s /database/db $PWD/database # symlink /database/db into local dir
export APPTAINER_BINDPATH="$PWD/database:/database" # bind the local dir instead of /database directly
apptainer exec myimage.sif echo "hello" # run my image

Donc en gros, je joue sur un lien symbolique dans un dossier existant et c’est ce dossier (qui existe sur tous les noeuds du coup) que je “bind” au lieu de “bind” `/database` directement (qui, lui, n’existe pas sur tous les noeuds).

Petite précision : en fait cette solution ne marche :confused: Apptainer n’arrive pas à remonter les liens symboliques parce que le dossier source n’a pas été monté… `ls: cannot access '/database/db/': Too many levels of symbolic links`

Mince. Je n’ai jamais eu ce cas de figure à résoudre. Et sinon du côté des paramètres slurm, préciser en ressource un noeud de calcul pour la règle concernée si c’est possible ? En rajoutant ce paramètre -w dans la commande de base slurm définie dans le profil cluster-slurm.

1 « J'aime »

Bingo ! Merci beaucoup Pauline :blush:
J'ai changé mon workflow-profile en mettant :

set-resources:
  run_mmseqs:
    slurm_extra: "--nodelist=node41 --export=ALL,APPTAINER_BINDPATH=/database,$APPTAINER_BINDPATH"
    slurm_partition: "alphafold"

Et effectivement, ça a marché :heart:

2 « J'aime »

Cool :fu: :smiley:

C’est vrai qu’il y a l’option --nodelist, j’avais pensé à -p <partition> et -w <worker> dans la commande slurm.

Bravo pour la mise en œuvre, je note la directive slurm_extra :wink:

1 « J'aime »