Découverte :
Nextflow, pour votre prochain pipeline ?

Pour commencer

Vous savez déjà tout sur les pipelines et les bonnes pratiques de développement. Vous faites bien évidemment de la recherche reproductive. Vous travaillez peut-être avec un cluster. Vous avez écrit votre propre pipeline en Bash, Python ou même en Perl qui gérait les appels à différents scripts et outils (voire même l'appel à l'ordonnanceur). Vous développez un pipeline, ou le maintenez. Vous êtes intéressé par la découverte de nouveaux outils. Vous avez vu la lumière et vous êtes entrés. Bref, cet article est là pour vous.

Ma petite expérience

C'est un grand classique de réinventer la roue, et je pense pouvoir affirmer sans me tromper qu'on a tous tenté de le faire à un moment ou à un autre. Dans mon cas je n'ai malheureusement découvert Make que sur le tard, et n'ai commencé à m'en servir que pour compiler ma thèse sous LaTeX (et depuis chaque document LaTeX). Mais déjà je savais que le prochain pipeline ne serait pas fait à la main. Probablement en utilisant Make, car il me parle d'aventures. Je me suis longtemps posé aussi la question de Snakemake. Et puis nouveau boulot, nouveau pouvoir projet, et c'est donc Nextflow qui a été choisi pour développer le pipeline. Donc je n'ai que peu d'expérience avec Make, aucune avec Snakemake. Mais ayant découvert Nextflow, je vais donc tenter de vous le présenter et d'expliquer ce qui m'a plu dans ce framework.

La philosophie

Nextflow est basé sur un modèle de programmation orienté en flux de données et deux concepts clés : Process et Channel. En plus clair, ce sont les données qui contrôlent le pipeline. Le Process est le processus de base qui va exécuter un script. Pour chaque Process, on peut définir un Input et un Output (entrée/sortie). Ces Inputs/Outputs peuvent être une valeur, un fichier, un ensemble de valeurs et/ou fichiers, ou plusieurs fichiers, valeurs et ensembles. Les différents Processes communiquent au moyen de Channel (Chaque Input/Output de votre Process est en fait une Channel). Ces dernières sont utilisées pour faire les manipulations sur les données, qu'elles soient valeurs ou fichiers.
Et c'est tout.

La magie

Nextflow is Doge - http://dogr.io/

Vous êtes plutôt Python ou plutôt Perl ? Pas de soucis, pour chaque Process, vous pouvez directement écrire vos scripts dans le langage que vous désirez (même R...). Ou les lignes de commandes en Bash pour appeler les scripts. Pas besoin de spécifier les liens entre les différents Processes, Nextflow s'en occupe, grâce au nom de la Channel (l'Output d'un Process est l'Input d'un autre). Paralléliser votre code ? Pas de problème, c'est implicite avec Nextflow. Il suffit juste de définir vos Inputs et Outputs, Nextflow se charge de paralléliser l’exécution. Vous bossez sur différentes machines, Nextflow fournit une couche entre le pipeline et l'exécution, et s'en occupe, que ce soit sur un cluster, ou un ordi classique. Nextflow se charge bien évidemment de lancer les différents Processes au fur et à mesure. Pas besoin d'adapter votre code à votre machine... Vous voulez un café pendant que vos scripts tournent, bon là par contre il va falloir le faire vous même... (enfin sauf si vous avez un script pour votre machine à café), par contre aucun souci pour une poképause.

Reproductibilité

-with-timeline

Avec le paramètre -with-timeline

Tous les résultats intermédiaires sont automatiquement enregistrés, il est donc facile de recommencer à partir de la dernière étape réussie. Il est possible d'avoir les temps d'exécution (et d'occupation de la mémoire) pour chacun des Processes (avec les paramètres -with-trace et/ou -with-timeline). Chaque Process est automatiquement enregistré, et on peut donc retrouver les différentes étapes, et appels à chacun des scripts, variables d’environnement, version des outils et programmes utilisés... Vous pouvez aussi facilement automatiser une gestion des erreurs, et relancer automatiquement un Process (qui par exemple aurait échoué faute de mémoire tout en lui allouant plus de mémoire/CPU pour un essai suivant (et limiter le nombre d'essais par la même occasion)). Si votre code est versionné avec Git, vous pouvez lancer une version en particulier de votre pipeline avec un simple paramètre -r nomdelaversion, ce qui vous assure d'utiliser le même code. Nextflow supporte nativement Docker, et vous pouvez donc utiliser un container pour pouvoir englober tout ce qu'il vous faut.

Un exemple ?

De très bons exemples se trouvent sur internet, et donc même si j'aime bien refaire la roue, je vais juste en expliquer un.

Pour le faire marcher, il suffit juste d'installer Nextflow, de télécharger le fichier sample.fa et de créer votre script monScript.nf dans votre éditeur de texte préféré. Un simple :

devrait suffire à faire marcher ce simple exemple et vous donner un résultat :

Un dossier work a été créé dans le répertoire courant, c'est le dossier temporaire contenant la trace de tout ce qu'il s'est passé. Pour chaque Process, un dossier principal et un sous-dossier sont crées. Et dans ce dernier se trouve les liens symboliques vers les fichiers d'entrées et les fichiers de sorties qui eux seront liés symboliquement dans le prochain Process.

Vous pouvez bien évidemment paramétrer Nextflow pour que ce dossier work temporaire soit dans un dossier temporaire (du genre /scratch), et décider d'un répertoire de sortie pour vos fichiers finaux. Ce repertoire temporaire a pour intérêt de garder tous les fichiers intermédiaires, sans encombrer le répertoire courant.

Avec l'option -resume, on remarque que les Processes déjà effectués sont en mémoire, et ne sont donc pas exécutés, mais réutilisés. Un dossier temporaire correspond donc à un Process, et chaque dossier contient toutes les informations utilisées pour l'exécution du Process :

.command.run initialise le répertoire temporaire et lie symboliquement les fichiers d'entrées.
.command.sh contient le script qui sera exécuté par le Process.
C'est donc assez pratique pour débugger.

Partage et Cloud

Nextflow est très facilement partageable, et vous pouvez directement exécuter un script Nextflow se trouvant sur Github :

Ce qui est très pratique quand vous voulez que d'autres personnes moins versées que vous en programmation testent votre pipeline. Nextflow marche aussi dans le cloud et supporte Amazon AWS et DNAnexus.

Une communauté active

Paolo Di Tommaso, le lead dev sur Nextflow est hyper réactif, que ce soit sur le chat Gitter, ou le Google group. Un certain nombre de pipelines sont également awesomement listés sur GitHub, c'est une très bonne source d'inspiration.

Pourquoi Nextflow ?

Plusieurs se sont déjà posé la question de quel framework utiliser pour gérer un pipeline, ici aussi. Julian Mazzitelli a fait une comparaison entre Bash, Make, SnakeMake et Nextflow dans un article de blog que je conseille de lire. Dans notre groupe la décision finale était entre SnakeMake et Nextflow. Et comme dit précédemment, ça c'est décidé sur Nextflow pour mon projet.

Inconvénients

Écrit en Groovy, et même si certains diront que Groovy n'aurait jamais du exister (notamment James Strachan l'un des créateurs), personnellement le seul inconvénient que j'ai rencontré a été de devoir apprendre une nouvelle syntaxe, et je n'ai pas eu trop de mal à m'y faire. Je trouve à mon humble avis que ça reste moins obscur qu'un Makefile.

Conflits d'intérêts

Aucun.

Remerciements

Je remercie Yoann M. pour sa motivation concernant cet article, Estel pour m'avoir redonné la motivation de réécrire des articles, ainsi que Lelouar, _NiGoPol_ et Norore bien aimés relecteurs pour leurs avis et discussions.

  • À propos de
  • Issu du Master pro BBSG sur Marseille, j'ai fait une thèse sur Marseille sur la recherche de biomarqueurs prédictifs dans le cancer du sein, suivi par un post-doc à Singapour. Je suis maintenant en Suède, à Stockholm où je travaille pour une biobanque de tumeurs. Anciennement impliqué chez JeBiF, je vous invite fortement à aller aux JeBiF Pubs ;-)

Catégorie: Découverte | Tags:

3 commentaires sur “Nextflow, pour votre prochain pipeline ?

  1. À propos de Strachan, on m\'a fait remarqué qu\'il était revenu sur ses dires et n\'utilisait plus Scala :
    https://twitter.com/jstrachan/status/784333918078169088

  2. Salut,

    C\'est avec un peu de retard que je dis merci pour cet article. Je me mets à Nextflow et ton article permet de recadrer (je trouve) une doc un peu complexe et sans assez d\'exemples (avis perso toujours).

    J\'ai une question : connais tu un forum fréquenté par des utilisateurs de Nextflow? SeqAnswers, Reddit sont un peu pauvres sur le sujet.
    Merci!

  3. Alors niveau communication, comme dit dans l\'article, y\'a un google group ou un chat gitter.
    Peu d\'activité sur Reddit en effet.

    Niveau exemples y\'a https://github.com/nextflow-io/examples qui donne une bonne liste pour démarrer.
    Sinon après personnellement pour notre pipeline, on s\'est beaucoup inspiré de https://github.com/nextflow-io/awesome-nextflow et maintenant on est dans les featured pipelines.

    Après si t\'as des questions plus précises, hésite pas à me contacter.

Laisser un commentaire