Aller au contenu principal

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>

    info

    le chargement d'un module entraîne l'activation de l'environnement.

Si ces modules sont incomplets pour votre usage, vous avez plusieurs options :

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.

Python 2.7

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.

mpi4py et modules MPI

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).

Désactivation d'un environnement conda

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.
environnement conda personnel

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 avail pour savoir quels sont les modules disponibles, par exemple module avail python
  • module 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és
  • module purge pour "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/.local existe 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/.local n'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/.conda existe 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/.conda n'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_user ou idr_quota_project donnent 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 $WORK ou du -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 pip seront 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.0 et pytorch-gpu/py3/1.7.1 sont basés sur la même version de python (3.7) mais pas la même version de numpy).
  • 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>
info

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 purge utile si l'on a oublié l'option --no-cache-dir et réduire l'occupation disque.
  • pip list pour 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 deactivate pour sortir de l'environnement chargé lors du module 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'environnement
  • conda clean -a va 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).

Variable $PYTHONUSERBASE

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).

Compilation sur GPU

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).