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

Quelques commandes utiles :

  • pour savoir quels sont les modules disponibles : module avail, par exemple module avail python
  • module load <nom_complet_module> pour charger un module
  • 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 (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.

Pour connaître l'occupation de $WORK :

  • idrquota -w donne le pourcentage d'occupation en Go et inodes (mis à jour toutes les demi-heures)
  • 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
  • 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 donc ê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>

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)
  • 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 (ie 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 sera dans .local/bin. Pour accéder à cet exécutable sur un noeud 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 noeud).

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: par exemple export PYTHONUSERBASE=$WORK/.local_tf240. A faire 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).