Python
Python et bibliothèques Python
Description
L'écosystème Python dispose de nombreux outils optimisés pour le calcul scientifique et le traitement de données. Les plus connus sont disponibles sur Jean Zay via des modules.
Versions installées
Les modules Python encapsulent des environnements Conda et contiennent des bibliothèques installées via conda ou pip.
-
pour avoir la liste des modules :
module avail python -
pour charger un module (et donc, indirectement, un environnement conda) :
module load <module-selectionne>infole chargement d'un module entraîne l'activation de l'environnement.
Si ces modules sont incomplets pour votre usage, vous avez plusieurs options :
- demander l'ajout d'une bibliothèque via un ticket à l'assistance IDRIS (assist@idris.fr)
- ajouter vous même localement le paquet manquant via
pip install --user --no-cache-dir <nom-paquet> - créer un nouvel environnement conda via
conda create
La première option est largement préférable pour des raisons de performances et compatibilité avec l'environnement Jean Zay. Cela nous permet aussi de faire profiter d'autres utilisateurs de ces outils et vous évite de saturer vos quotas disque.
Le support de la version 2.7 ayant pris fin le 01/01/2020, nous installons les nouvelles versions des logiciels uniquement pour Python 3 depuis cette date.
Si vous souhaitez utiliser le paquet mpi4py, vous devez également charger l'un des modules MPI disponibles (module avail openmpi) via la commande module. En effet, aucun module MPI n'est chargé par défaut dans les environnements Python (alors que la bibliothèque mpi4py est disponible).
Les commandes module purge, module switch, module unload ne fonctionnent pas avec conda. C'est à dire que pour désactiver un environnement conda et en activer un autre en chargeant un autre module, il faut lancer la série de commandes suivantes :
conda deactivate
module purge
module load <nouvel_environnement>
ou relancer une session.
Environnement Python personnel
L'IDRIS propose de nombreux modules dédiés à l'IA. Les modules sont conçus pour exploiter au mieux l'infrastructure de Jean Zay et les bibliothèques installées (telles que cuDNN, Intel MKL, NCCL).
Si un module correspond à vos besoins, mais qu'il manque quelques bibliothèques indispensables à vos codes, vous avez deux solutions :
- faire une demande à assist@idris.fr en précisant la bibliothèque et le module concerné. Cela bénéficiera potentiellement à d'autres utilisateurs de Jean Zay. Notez que l'ajout ne pourra se faire que s'il ne modifie pas trop l'environnement concerné : celui-ci pourrait ne plus fonctionner pour d'autres utilisateurs.
- ajouter les bibliothèques manquantes localement via la commande
pip, en surchargeant un des modules proposés. Lire plus loin pour les avantages et inconvénients de cette méthode.
Si votre besoin est vraiment très différent de ce que propose l'IDRIS, vous pouvez créer votre propre environnement conda avec exactement ce qui vous est nécessaire. Cela vous donne un contrôle total mais s'accompagne de quelques inconvénients :
- un environnement prend de la place (en particulier en terme d'inodes) et risque de saturer l'espace qui vous est alloué. Voir la section suivante pour des tactiques limitant cet aspect.
- les codes installés ne sont pas optimisés pour Jean Zay et ne vont pas forcément trouver les librairies de bas niveau comme cuDNN (même en chargeant le module
cudnn/7.6.5.32-cuda-10.2). - l'assistance utilisateur aura plus de difficultés à vous dépanner en cas de comportement anormal de votre code.
- une installation personnelle s'accompagne en général de performances moindres comparé à une installation de l'IDRIS.
Quelques commandes utiles :
module availpour savoir quels sont les modules disponibles, par exemplemodule avail pythonmodule load <nom_complet_module>pour charger un module (et activer l'environnement Python ou Conda en même temps)module list(une fois un module chargé) pour avoir la liste complète des modules associésmodule purgepour "décharger" tous les modules. Attention, ne désactive pas les environnements Python et Conda (en cas d'anomalie, il peut être préférable de partir d'une nouvelle session).
Conseils généraux avant d'installer localement des bibliothèques
Le répertoire de stockage des paquets PyPI est situé dans $HOME/.local par défaut. Vous risquez donc de rapidement saturer le quota disque de votre $HOME si ce comportement est conservé. Pour éviter ceci, nous vous recommandons de créer un répertoire cible dans votre répertoire $WORK et de faire un lien symbolique dans le $HOME pointant sur le répertoire cible :
- si le dossier
$HOME/.localexiste déjà, il faut d'abord le déplacer dans le$WORK:
mv $HOME/.local $WORK
ln -s $WORK/.local $HOME
- si le dossier
$HOME/.localn'existe pas encore, il faut d'abord créer un répertoire dans le$WORK:
mkdir $WORK/.local
ln -s $WORK/.local $HOME
De même, via conda, les bibliothèques sont installées dans $HOME/.conda, il est donc vivement encouragé de procéder de la même façon.
- si le dossier
$HOME/.condaexiste déjà, il faut d'abord le déplacer dans le$WORK:
mv $HOME/.conda $WORK
ln -s $WORK/.conda $HOME
- si le dossier
$HOME/.condan'existe pas encore, il faut d'abord créer un répertoire dans le$WORK:
mkdir $WORK/.conda
ln -s $WORK/.conda $HOME
Pour connaître l'occupation de $WORK :
idr_quota_userouidr_quota_projectdonnent le pourcentage d'occupation en Go et inodes (mis à jour une fois par jour durant la nuit)- pour plus de détail, faire
du --inodes --max-depth=1 $WORKoudu -h --max-depth=1 $WORK
Ajouts locaux de bibliothèques via pip
Avantages et inconvénients de cette méthode :
- cette méthode est adaptée pour rajouter des bibliothèques à un module existant et évite de devoir tout installer ce qui limite l'occupation disque.
- en contrepartie, ces bibliothèques installées via
pipseront visibles de tout module, si celui-ci utilise la même version de python (l'installation se fait dans.local/lib/pythonX.Y). - il faudra être vigilant sur de possibles incompatibilités si vous êtes amené à lancer des calculs avec divers environnements (par exemple
pytorch-gpu/py3/1.5.0etpytorch-gpu/py3/1.7.1sont basés sur la même version de python (3.7) mais pas la même version denumpy). - l'installation locale d'une bibliothèque a la précédence sur la version provenant d'un module, mais il faut rester vigilant sur les dépendances.
Pour installer localement des paquets issus du dépôt PyPI, utilisez les options --user et --no-cache-dir :
pip install --user --no-cache-dir <paquet>
Si vous oubliez l'option --user, vous tenterez d'installer le paquet dans l'environnement système et vous obtiendrez un message d'erreur car l'environnement système est protégé en écriture : vous n'avez pas les droits pour le modifier.
Pour désinstaller un paquet installé de cette manière :
pip uninstall <paquet>
Autres commandes utiles (voir documentation officielle pour les options) :
pip cache purgeutile si l'on a oublié l'option--no-cache-diret réduire l'occupation disque.pip listpour avoir tous les paquets accessibles (provenant du module ou d'une installation locale)
Création d'un environnement conda
Pas besoin d'installer Anaconda ou Miniconda pour créer son propre environnement ! Il suffit de charger l'un des environnements python proposé, trouvable avec la commande module avail python.
Les commandes utiles sont :
conda deactivatepour sortir de l'environnement chargé lors dumodule load- creation d'un environnement :
conda create -y -n <nom> python=x.y(avec une version précise de python, sinon c'est la version par défaut du module) conda activate <nom>conda env remove --name <nom>pour effacer proprement l'environnementconda clean -ava enlever les packages inutilisés et le cache. Ne pas se formaliser si cela tente d'effacer les packages des environnements système (i.e. non locaux)
L'installation de paquets se fait via conda install. Il peut être judicieux d'ajouter -c conda-forge car c'est le canal qui contient les dernières mises à jour de nombreux paquets scientifiques.
Derniers conseils
Les $PATH, $PYTHONPATH et $CONDA_PREFIX sont correctement configurés, il n'est à priori pas nécessaire de les modifier (cela risque de changer l'ordre de précédence des répertoires ou d'aboutir à des chemins vers des paquets incompatibles).
Par contre si un paquet installe un exécutable (c'est le cas de Horovod et Deepspeed), il le sera dans .local/bin. Alors, pour accéder à cet exécutable sur un nœud de calcul, il sera nécessaire de faire un export PATH=$WORK/.local/bin:$PATH (dans le fichier slurm ou une fois connecté sur un nœud).
Si vous utilisez alternativement plusieurs modules de Jean Zay (par exemple tensorflow et pytorch), que vous complétez via des installations pip, il est possible de redéfinir la localisation des paquets installés localement en définissant la variable PYTHONUSERBASE différemment suivant le module utilisé : par exemple avec tensorflow-gpu/py3/2.4.0, export PYTHONUSERBASE=$WORK/.local_tf240. Cet export doit être fait avant l'installation des paquets et avant le lancement des calculs (ne pas oublier de redéfinir éventuellement le PATH si nécessaire).
Si jamais vous devez compiler des codes IA utilisant les GPU (CUDA, cuDNN), intel MKL, etc., n'hésitez pas à contacter l'assistance (assist@idris.fr).