Environnements virtuels : Python (R, ruby, julia...)
Plusieurs versions de python sont installés sur la plateforme de calcul:
- Les packages (python v2, python v3) issus de la dernière version stable du système d'exploitation debian. Ils sont accessibles via les chemins par défaut du système (aucune modification de votre environnement n'est nécessaire pour les utiliser).
- Python 2 (avec un certain nombre de packages) en chargeant le module conda :
# module load conda (ou ml conda)
Conda ouvre une troisième voie : c'est également un gestionnaire de packages et d'environnements qui permet à chacun d'installer son (ses) propre(s) environnement(s) Python (ou R, ruby,...) et apporte donc les avantages suivants:
- générer des environnements stables dans le temps (donc une meilleure reproductibilité des calculs),
- collaboratif: un environnement est exportable (simple fichier texte) à transmettre à un collaborateur,
- autonomie par rapport aux administrateurs systèmes de la plateforme,
- c'est parfois la seule solution pour résoudre des problèmes de dépendances incompatibles entre utilisateurs de la plateforme.
Il y a toutefois un inconvénient de taille(!), attention à vos quotas: vous installez une distribution de python (ou R,ruby) sur votre compte. Selon le nombre de packages cela peut atteindre plusieurs Go; si les packages de la distribution Linux de la plateforme vous suffisent, c'est inutile.
1. Créer et gérer un environnement virtuel: conda, conda-env
1.1. premiers pas
Lister l'ensemble des commandes disponibles : clean, config, create, info, list....
# conda --help (ou conda -h)
Exemple1:
Créer un environnement (vide) :
# conda create --name testenv1 (ou conda create -n testenv1)
Charger l'environnement testenv1, y installer Python :
# source activate testenv1
(testenv1) # conda install python
- Noter le changement de prompt (testenv1#) qui implique que toutes les commandes conda s'appliquent à l'environnement testenv1 et seulement celui-ci.
- le Python installé ici, sans précision particulière, est par défaut la dernière version stable de la version 3 de python, donc 3.7.3 (le jour de rédaction de cet article)
- pip install ?: la commande pip est automatiquement installée dans votre environnement conda. La recommandation est de préférer conda install package (si le package existe dans les dépots).
Sortir de l'environnement testenv1:
(testenv1) # source deactivate testenv1
# (-> retour au prompt "normal)
Exemple 2 : syntaxe sur une seule ligne pour à la fois créer l'environnement et installer plusieurs packages. Ici la version de python est forcée à la 2.7:
# conda create -n testenv2 python=2.7 matplotlib numpy
Lister les packages (et ses dépendances) installés dans un environnement :
# conda list -n testenv2
ou:
(testenv2) # conda list (si l'environnement est déjà activé)
Lister l'ensemble des environnements disponibles:
# conda env list
#
#
testenv1 /nfs/home/labo/login/.conda/envs/testenv1
testenv2 /nfs/home/labo/login/.conda/envs/testenv2
base * /nfs/opt/conda
À noter que dès que le module conda est chargé, l'environnement base est l'environnement courant (marqué par une "*") :
1.2. Exporter et importer un environnement
La commande :
# conda env export -n testenv2 -f backup-testenv2.yml
sauvegarde dans un simple fichier texte la liste des packages et des dépendances de l'environnement testenv2.
Pour le restaurer (Vous, ou le collaborateur à qui vous l'auriez transmis) :
# conda env create -f backup-testenv2.yml
1.3. Créer et partager des environnements entre utilisateurs
Espace disque & quota :
1. si vous maîtriser les droits en lecture (/écriture) sur un dossier du collègue 1 ou dossier d'équipe, de projets etc., vous n'êtes pas obligés de dupliquer autant de distributions & environnements qu'il y a de collaborateurs.
2. (remarque): la méthode qui suit serait à prioriser même si vous ne partagez pas vos environnements afin de préserver votre quota sur votre $HOME_directory : installer vos environnements sur un espace non sauvegardé (/nfs/data/unprotected/labo/login). Seule la “recette“ (cf "export" ci dessus) de vos environnements devrait se trouver sur votre $HOME_directory (donc sauvegardée toutes les nuits)
user1 crée un environnment dans un répertoire qu'il partage :
# mkdir /nfs/data/unprotected/laboratoire/user1/sharedconda (création repertoire)
# conda create --prefix /nfs/data/unprotected/laboratoire/login/sharedconda/pyt python
# chmod -R g+rx /nfs/data/unprotected/laboratoire/user1/sharedconda (accès en lecture à tous les membres du laboratoire)
Remarque : l'environnemet est implicitement appelé "pyt" ( option --path/-p est incompatible avec --name/-n)
Les utilisateurs (y compris user1 s'il veut que l'alias "pyt" apparaisse dans sa liste) déclarent le chemin:
# conda config --append envs_dirs /nfs/data/unprotected/laboratoire/user1/sharedconda
1.4. suppressions & ménage:
D'un environnement, d'un package (dans un environnement) :
# conda env remove -n testenv1 (supprime l'environnement testenv1)
# conda uninstall -n testenv2 matplotlib (supprime le package matplotlib de testenv2)
(testenv2) # conda uninstall matplotlib (idem, mais après avoir "activé" testenv2)
Des archives compressées des packages installés lors de l'installation de tout package, plus éventuellement tous les packages que vous auriez désinstallés. Tout est en effet stocké en cache dans le répertoire par défaut /nfs/home/laboratoire/login/.conda/pkgs/
# conda clean --all
2. lancer un calcul: adapter les scripts OAR
Penser simplement à charger le module conda et activer l'environnement virtuel désiré dans votre script oar:
#!/bin/bash
#OAR -l /core=4/cpu=2,walltime=1
#OAR -n test_conda
...
source /nfs/opt/env/env.sh #)
module load conda #) -> chargement du module conda
source activate testenv2 # -> activation de l'environnement virtuel testenv2
...
python ./mon_script.py
3. Aller plus loin: ressources
La commande :
# conda config --show
# conda config --help
... vous donnera un aperçu des paramètres qui régissent le comportement de conda, notamment des emplacements des dépots (channels), des caches locaux où sont stockés les packages téléchargés etc.
Vous trouverez probablement d'innombrables ressources sur le web, en voici trois:
- https://conda.io/
- https://docs.conda.io/
- https://anaconda.org/
- https://github.com/conda-forge (de nombreux packages voire langages, sont accessibles par le biais du channel conda-forge)
- exemple: conda create -n my_julia -c conda-forge julia
crée l'environnement my_julia et y installe le langage julia à partir des dépots conda-forge