La diversité des questions que se posent nos amis biologistes entraîne une diversité des données : génomiques, images, etc. De plus, ces données sont générées à des vitesses folles. Pour manipuler les données et extraire les informations utiles, des solutions et outils bioinformatiques sont nécessaires. De nombreux outils existent déjà pour répondre à de nombreuses questions. Mais parfois, de nouveaux outils sont nécessaires pour répondre à une question spécifique. Intervient alors le développement d'un nouvel outil bioinformatique.
Développer et distribuer un outil bioinformatique
Lorsque vous développez un outil bioinformatique, vous le faites dans le but premier de répondre à une question. Une fois celle-ci correctement formulée, vous choisissez votre méthode de travail et les outils (1, 2) qui vous aiderons à bien gérer votre projet. Par exemple, si vous avez choisi Java pour développer votre projet, il se peut que vous utilisiez Git comme gestionnaire de versions et Maven comme gestionnaire de build.
Vous avez donc écrit du code source. Pour partager votre solution, vous allez écrire de la documentation, faire de la formation et du support autour de l'outil. Et vous pouvez être amené à le publier pour expliquer votre méthode (sinon, ce n'est pas de la science reproductible, donc pas de la science, et tac !). Il vous faut alors distribuer votre programme. Cela peut être fait de bien des façons :
- en imprimant le code (PDF) (Ceci est un troll)
- sous la forme d'un espace web dédié
- via une plateforme de partage de code source, avec les instructions pour utiliser la solution
Le partage des sources est primordial pour assurer la transparence, mais il peut être particulièrement difficile d'installer correctement un logiciel (multitude de dépendances, incompatibilité entre des versions, etc). Le constat est simple : si votre algorithme est révolutionnaire mais que personne ne peut l'utiliser, "je ne lui prédis pas un grand avenir" (#OSS117).
Cette voie fonctionne bien lorsque l'outil est simple et ne dépend pas de trop nombreux autres outils. Cependant, la phase de déploiement reste à la charge de l'utilisateur (ou de l'administrateur système du labo). Et le déploiement d'un logiciel est la proie de deux grands fléaux :
- les dépendances manquantes (OHMYGOD!)
- les versions des dépendances (I'MGONNADIE!!)
Il s'en suit alors un casse-tête dantesque où l'utilisateur doit installer impeccablement TOUTES les bonnes versions de TOUTES les dépendances (si on peut encore les trouver et si elles sont compatibles avec son système, évidemment). A LA MAIN ! C'est évidemment une source colossale de fausse manip' et de découragement pour l'utilisateur, qui préférera alors se tourner vers une solution alternative.
Nous sommes donc face à un double problème de durabilité des outils et de leur déploiement. Ceux-ci ont des impacts importants sur la productivité et la reproductibilité en sciences. Il devient donc urgent de résoudre ces deux questions et rendre la bioinformatique meilleure !
Faciliter le déploiement d'un logiciel
Les problèmes précédemment cités sont une chose que les utilisateurs de systèmes GNU/Linux et OSX ne connaissent qu'à moitié, puisque rares sont ceux qui installent tout à la main. Le commun des mortels utilise, quand il le peut, un gestionnaire de paquets. Il en existent plusieurs étant pour la plupart spécifique :
- à un langage (pip pour Python, CPAN pour Perl, CRAN pour R, etc)
- à un système d'exploitation (yum pour Fedora, APT pour Debian, howebrew pour OSX, etc)
Le packaging demande un petit effort de la part du développeur, mais le déploiement de l'outil derrière le code est grandement facilité. L'utilisateur n'a à se préoccuper que de la partie "utilisation" (ce qui est somme toute plutôt logique). Pour que tout soit parfait, il est également nécessaire de documenter le logiciel, de proposer des formations, du support et d'en faire la publicité.
La solution à tous nos maux : Conda
Pour qu'un outil soit utilisé, il doit être facilement déployable n'importe où. Pour cela, il faut le packager avec un gestionnaire de paquets qui soit :
- indépendant d'un langage de programmation
Des outils bioinformatiques sont disponibles dans pratiquement tous les langages disponibles
- indépendant du système d'exploitation
Les outils sont utilisés sur les principaux systèmes d'exploitation
- indépendant de privilèges super utilisateurs
Certains utilisateurs n'ont pas les droits d'administration de leur ordinateur
- capable de gérer plusieurs versions d'outils
Des versions différentes d'un outil peuvent être requises par différents outils
- compatible avec une utilisation sur le Cloud ou en environnement HPC
Conda est un gestionnaire de paquets open-source qui répond très bien à ces problématiques. Bien que développé par la communauté PyData, conda est conçu pour gérer des paquets et dépendances de n'importe quel programme dans n'importe quel langage. Conda est donc moins
1 |
pip |
qu'une version multi-système d'exploitation de
1 |
apt |
et
1 |
yum |
.
Un paquet conda est défini par une recette et correspond in fine à un fichier tarball contenant des librairies au niveau système, Python ou d'autres modules, des programmes exécutables ou d'autres composants. En distribuant des outils précompilés, l'installation de paquet conda est rapide, robuste et facile :
1 |
[crayon-672342ab61837337839484 ]$ conda install deeptools |
Il y a d'ailleurs un excellent article introductif pour une installation et prise en main rapide de conda.
Les principales fonctionnalités de conda
Conda permet donc de gérer différents logiciels, un peu à la manière de
1 |
apt |
du point de vue de l'utilisateur. On retrouve les commandes suivantes :
1 2 3 4 5 6 |
[crayon-672342ab61842103046432 ]$ conda list # lister les paquets installés $ conda search deeptools # rechercher les paquets qui pourraient correspondre à "deeptools" $ conda install deeptools # installer le paquet "deeptools" $ conda update deeptools # mettre à jour (si possible) le paquet "deeptools" $ conda remove deeptools # supprimer le paquet "deeptools" $ conda help # vous laisser découvrir toute la beauté de conda |
Conda garde une trace des dépendances entre les paquets et les plateformes. Par exemple,
1 |
deeptools |
a besoin de
1 |
python |
,
1 |
numpy 1.9.0+ |
et
1 |
scipy 0.17.0+ |
entre autres. Conda se charge d'installer ou de mettre à jour ses dépendances si besoin, ainsi que les dépendances de ces dépendances, etc.
Conda vient aussi avec une gestion d'environnements virtuels, sur le même principe que les environnements virtuels de Python. Un environnement conda est un dossier contenant une collection spécifique de paquets conda installés mais isolés des autres environnements conda. Ce principe permet l'installation et la gestion de plusieurs versions d'outils, comme Python 2.7 et Python 3.5 par exemple. Vous pouvez alors créer des environnements dédiés qui assureront la reproductibilité de vos analyses. Tout est expliquer ici pour créer vos environnements.
Encore des réticences vis-à-vis de Conda ? Je vous conseille de lire ce blog post sur les mythes et fausses idées liées à Conda.
Les channels
En bon gestionnaire de paquets, conda offre la possibilité d'ajouter d'autres sources de paquets, aussi appelées channels. Les outils assez généralistes peuvent être trouvé dans le channel default ou conda-forge. Spécialisé dans les outils bioinformatiques, le channel Bioconda consiste en :
- Un dépôt GitHub de recettes
- Un système de construction qui transforme ces recettes en paquets conda
- Un répertoire de plus de 2 000 paquets bioinformatiques prêt à être utilisés
Avec presque 200 contributeurs, cette communauté accueillante et formée il y a un peu plus de 1 an grossit rapidement. Elle ajoute, modifie, met à jour et maintient les nombreuses recettes des paquets conda d'outils bioinformatiques existant, mais vous donnera aussi tout un tas de conseils pour parfaire vos recettes.
Packager un logiciel
Envie d'écrire un paquet conda pour un outil existant ? On pourrait penser que cela est difficile étant donnés les avantages apportés par conda. Mais au contraire, l'écriture de paquets conda a été pensée pour être facile et permettre ainsi à tous d'intégrer les outils dans conda avec une documentation extensive. Ainsi, un paquet conda consiste en deux fichiers :
- Un fichier
1meta.yaml
- Un fichier
1build.sh
Par exemple, pour le logiciel deeptools, on le fichier
1 |
meta.yaml |
suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
[crayon-672342ab61860585350881 ]package : name : deeptools version : '2.4.3' source : fn : deepTools-2.4.3.tar.gz url : https ://pypi.python.org/packages/40/4b/2f4[ ;...]796/deepTools-2.4.3.tar.gz md5 : 1751e860c5436d1973d7621ebdf00c6a build : number : 0 requirements : build : - python - setuptools - numpy >=1.9.0 - scipy >=0.17.0 - matplotlib >=1.4.0 - pysam >=0.8.2 - py2bit >=0.2.0 - gcc run : - python - pybigwig >=0.2.3 - numpy >=1.9.0 - scipy >=0.17.0 - matplotlib >=1.4.0 - pysam >=0.8.2 - py2bit >=0.2.0 test : imports : - deeptools commands : - bamCompare –version about : home : https ://github.com/fidelram/deepTools license : GPL3 summary : A set of user-friendly tools for normalization and visualization of deep-sequencing data |
Cette recette fera automatiquement appel au script
1 |
build.sh |
qui contient les instructions pour installer le logiciel, en l’occurrence :
1 2 |
#!/bin/bash<br> $PYTHON setup.py install |
Bioconda propose un guide pour écrire des recettes qui seront par la suite intégrées au channel. Et dans tous les cas, vous pouvez faire appel aux membres de la communautés pour vous aider à construire, débugger, mettre à jour ou parfaire votre recette.
Bioconda va même encore plus loin !
Pour faciliter le déploiement tout en suivant les besoins évoqués précédemment, un autre moyen de packager un outil est de le containeriser. La containerisation la plus connue est Docker, mais il existe d'autres solutions comme rkt ou Singularity. Ces containers permettent d'obtenir un plus haut niveau d'abstraction pour un outil par rapport au système de base.
La création de containers pour un outil est plus complexe que pour créer un paquet conda. Par exemple, pour créer un container Docker, il faut créer un fichier Dockerfile décrivant l'image de base utilisée, les commandes pour créer l'outil, etc.
Mulled est un projet permettant de générer un container (BioContainer) minimal pour Docker ou rkt à partir d'un paquet conda, alpine or linuxbrew. Il faut seulement ajouter une ligne dans un fichier TSV pour indiquer à Mulled de créer le container.
Pour des paquets Bioconda, c'est encore plus facile : il n'y a rien à faire. Mulled parcourt tous les paquets Bioconda quotidiennement et génère des BioContainers automatiquement pour tous les paquets Bioconda.
En packageant les outils avec conda au sein de Bioconda, on réduit drastiquement le problème de déploiement des outils aux utilisateurs. Les outils deviennent facilement déployables avec plusieurs solutions : via les paquets conda ou via des BioContainers construits automatiquement.
La durabilité et disponibilité
Un outil peut dépendre de nombreux autres outils, qui peuvent ne plus être maintenus ni même disponibles. L'indisponibilité des outils posent de nombreux problèmes dont ceux de reproductibilité et durabilité.
Pour résoudre ces problèmes, l'idéal serait d'avoir un stockage permanent de toutes les versions des paquets et outils utilisés pour qu'ils soient toujours accessibles.
La reproductibilité et l'accessibilité font partis des mantras du projet Galaxy. Ainsi, pour répondre aux problèmes de disponibilité et de durabilité des outils et paquets, la communauté autour de Galaxy a mis en place Cargo Port, un répertoire public pour archiver de nombreux paquets de façon stable et permanente.
Ajouter un paquet dans ce dépôt est facile. Il suffit d'ajouter une ligne dans un fichier TSV avec les informations (nom et URL) sur le paquet à stocker. Pour les paquets créés avec Bioconda, c'est même encore plus facile : il n'y a rien à faire ! Cargo Port fait des archives journalières des recettes et paquets Bioconda, et permet ainsi de résoudre les problèmes de durabilité et disponibilité des outils.
Déploiement et durabilité des outils en bioinformatique : Fixés !
Le développement des paquets Bioconda est très facile et facilite le packaging et le déploiement de tout outil bioinformatique. Avec le projet Mulled, des containers GNU/Linux efficaces sont automatiquement construits pour tous paquets Bioconda pour permettre un plus haut niveau d'abstraction et d'isolation par rapport au système de base. C'est un super effort de différentes communautés pour créer un système flexible et extensible et fixer ainsi le problème de déploiement une fois pour toute.
L'interface avec paquets Bioconda avec Cargo Port améliore la disponibilité et la durabilité en conservant toutes les sources.
Nous espérons vous avoir convaincus que grâce à ces projets collaboratifs, leur communauté et leurs collaborations, les outils bioinformatiques peuvent être facilement packagés et être toujours disponibles pour leurs utilisateurs. La seule chose à faire est de créer une recette Bioconda et rendre ainsi vos utilisateurs heureux et leurs (et vos) analyses efficaces et reproductibles !
Merci à Nico M, HedJour, Mathurin, Akira pour les relectures et les commentaires intéressants !
Cet article a été écrit conjointement par Bérénice et Kévin
Laisser un commentaire