Jean Zay : commande module

Afin de charger les produits installés sur Jean Zay, il est nécessaire d'utiliser la commande module.

Attention : Depuis le 10/12/2019 une nouvelle version 4.3.1 de module est en service sur Jean Zay, ce qui vous oblige à modifier vos anciens scripts de soumission.

Cette nouvelle version remplace la version 3.2.10, qui n'a plus évolué depuis 2012 : ce changement modifie notablement le fonctionnement des modules à l'IDRIS.
En effet, la version 4 se comporte différemment de l'ancienne version 3 : les prérequis des produits (compilateur, bibliothèque MPI) sont chargés automatiquement lors du chargement d'un module.

Grace à ce changement de comportement de la commande module, les noms des modulefiles ont été simplifiés : la version du compilateur a disparu du nom des modules. Vous devez donc modifier la syntaxe de vos commandes module, dans votre environnement de connexion comme dans vos scripts de soumission Slurm.

Voici un exemple de syntaxe utilisée avec l'ancienne version de module :

$ module purge
$ module load gcc/8.2.0/gcc-4.8.5 intel-mpi/19.0.4
$ module load gromacs/2019.2/gcc-8.2.0-mpi-cuda

Avec la nouvelle version 4.3.1, la syntaxe est simplifiée :

$ module purge
$ module load gromacs/2019.2-mpi-cuda

Nouveautés avec Environment Modules v4

En plus de corriger de nombreux bugs, l'Environment Modules v4 introduit de nouvelles fonctionnalités, en particulier :

  • la gestion automatique des dépendances entre les modules (voir la section suivante) ;
  • un choix amélioré de la version par défaut des modules : la plus récente est utilisée par défaut, plutôt que la dernière version disponible dans l'ordre alphabétique. Par exemple, la version 1.10 est bien considérée comme étant plus récente que la version 1.9 ;
  • un filtrage avancé de la sortie de la commande module avail via des options :
    • -d n'affiche que la version par défaut de chaque module
    • -L n'affiche que la version la plus récente de chaque module
    • -C <texte> permet de chercher tous les modules dont le nom ou la version contient le motif <texte>
  • une colorisation de la sortie de la commande pour en améliorer la lisibilité ;
  • une amélioration des performances.

Pour plus de détails, nous vous invitons à consulter, sur le site officiel d'Environment Modules, les notes de version et la page Differences between versions 3.2 and 4.

Gestion automatique des dépendances

La fonctionnalité de gestion automatique des dépendances entre les modules, introduite dans l'Environment Modules v4, est utilisée à l'IDRIS afin de garantir la cohérence de l'environnement chargé.
Ceci signifie que la commande module s'assure que les prérequis en matière de compilateur et de bibliothèque MPI sont bien satisfaits à chaque chargement d'un module :

  • Lorsqu'un module est chargé dans un environnement vierge (sans aucun compilateur ni bibliothèque MPI déjà sélectionnés), un environnement par défaut est chargé si nécessaire (sélection du compilateur et/ou de la bibliothèque MPI). Par exemple, la bibliothèque NetCDF est disponible avec 2 environnements Intel (18.0.5 et 19.0.4); par défaut, c'est l'environnement Intel 19.0.4 qui est chargé :
    $ module purge
    $ module load netcdf
    Loading netcdf/4.7.2-mpi
      Loading requirement: intel-compilers/19.0.4 intel-mpi/19.0.4
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/19.0.4   2) intel-mpi/19.0.4   3) netcdf/4.7.2-mpi
    $ which ncdump
    /.../netcdf/4.7.2/intel-19.0.4-cqo7jj3yxaprhm23gr2tfq2f4epw7k3r/bin/ncdump
  • Lorsqu'on charge un module dans un environnement déjà contraint par le chargement antérieur d'un compilateur (et éventuellement d'une bibliothèque MPI), l’installation du produit effectuée avec cette même version du compilateur (et respectivement de la même bibliothèque MPI) est automatiquement sélectionnée. Prenons, par exemple, la bibliothèque NetCDF disponible pour les environnements Intel 18.0.5 et 19.0.4, on peut vérifier ce comportement de la commande module en chargeant préalablement l'environnement Intel 18.0.5 :
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/18.0.5   2) intel-mpi/18.0.5 
    $ module load netcdf
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/18.0.5   2) intel-mpi/18.0.5   3) netcdf/4.7.2-mpi  
    $ which ncdump
    /.../netcdf/4.7.2/intel-18.0.5-4q5xoewvla54i45rdh743eu7bm7wnsi7/bin/ncdump
  • Par contre, si aucune installation n'a été effectuée pour l'environnement déjà chargé, un message d'erreur sera affiché (indiquant un conflit, par exemple) ; dans ce cas le module n'est pas chargé. Par exemple, si on essaie de charger la bibliothèque NetCDF dans l'environnement Intel 19.0.5 alors qu'elle n'est pas disponible :
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/19.0.5  
    $ module load netcdf
    Loading intel-compilers/19.0.4
      ERROR: Conflicting intel-compilers is loaded
     
    Loading intel-compilers/18.0.5
      ERROR: Conflicting intel-compilers is loaded
     
    Loading netcdf/4.7.2-mpi
      ERROR: Load of requirement intel-compilers/19.0.4 or intel-compilers/18.0.5 failed
     
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/19.0.5

Remarque : lorsqu'un produit est disponible pour plusieurs environnements, il peut être nécessaire de charger le compilateur et/ou la bibliothèque MPI avant de charger le produit afin de s'assurer que l'environnement utilisé est le bon.

Affichage des produits installés

Pour afficher les produits installés sur Jean Zay, il faut utiliser la sous-commande avail.

$ module avail
------------------------- /gpfslocalsup/pub/module-rh/modulefiles -------------------------
arm-forge             intel-all/16.0.4        intel-compilers/18.0.1  intel-vtune/18.0.5     pgi/19.7   
cuda/9.2              intel-all/18.0.1        intel-compilers/18.0.5  intel-vtune/19.0.2     pgi/19.9   
cuda/10.0             intel-all/18.0.5        intel-compilers/19.0.2  intel-vtune/19.0.4     pgi/19.10  
cuda/10.1.1           intel-all/19.0.2        intel-compilers/19.0.4  intel-vtune/19.0.5     
cuda/10.1.2           intel-all/19.0.4        intel-compilers/19.0.5  nccl/2.4.2-1+cuda9.2   
cudnn/9.2-v7.5.1.10   intel-all/19.0.5        intel-itac/18.0.1       nccl/2.4.2-1+cuda10.1  
cudnn/10.1-v7.5.1.10  intel-itac/19.0.4       intel-itac/18.0.5       pgi/19.5               
 
------------------------- /gpfslocalsup/pub/modules-idris-env4/modulefiles/linux-rhel7-x86_64 -------------------------
abinit/7.0.5                fftw/3.3.8-mpi           nco/4.8.1                         trilinos/12.12.1-mpi      
abinit/8.8.2-mpi            fftw/3.3.8-mpi-cuda      ncview/2.1.7-mpi                  udunits2/2.2.24           
abinit/8.10.3-mpi           gaussian/g09-revD01      netcdf-fortran/4.5.2              uuid/1.6.2                
adf/2019.104-mpi-cuda       gaussian/g16-revC01      netcdf-fortran/4.5.2-mpi          valgrind/3.14.0-mpi
anaconda-py2/2019.03        gcc/4.8.5                netcdf/4.7.2                      valgrind/3.14.0-mpi-cuda
anaconda-py3/2019.03        gcc/5.5.0                netcdf/4.7.2-mpi                  vasp/5.4.4-mpi-cuda       
arpack-ng/3.7.0-mpi         gcc/6.5.0                netlib-lapack/3.8.0               vim/8.1.0338              
autoconf/2.69               gcc/8.2.0                netlib-scalapack/2.0.2-mpi        visit/2.13.0-mpi          
automake/1.16.1             gcc/8.3.0                netlib-scalapack/2.0.2-mpi-cuda   vtk/8.1.2-mpi  
bigdft/devel-0719-mpi-cuda  gcc/9.1.0                nwchem/6.8.1-mpi                  xedit/1.2.2               
blitz/1.0.1                 gcc/9.1.0-cuda-openacc   octave/4.4.1-mpi
boost/1.62.0                gdb/8.2.1                opa-psm2/11.2.77
[...]   

(affichage non exhaustif, basé sur une sortie de la commande éditée en décembre 2019)

Rechercher un produit particulier

Il est possible de rechercher un produit particulier en tapant : module avail <premières lettres du nom du produit>.
Par exemple pour afficher les produits commençant par cud :

$ module avail cud
 
------------------------- /gpfslocalsup/pub/module-rh/modulefiles -------------------------
cuda/9.2  cuda/10.0  cuda/10.1.1  cuda/10.1.2  cudnn/9.2-v7.5.1.10  cudnn/10.1-v7.5.1.10

Vérifier quels sont les modules déjà chargés

La sous-commande list permet de vérifier quels sont les modules chargés à un moment donné dans votre environnement courant :

$ module list
Currently Loaded Modulefiles:    
 1) intel-compilers/19.0.4   4) intel-vtune/19.0.4     7) intel-itac/19.0.4  
 2) intel-mkl/19.0.4         5) intel-advisor/19.0.4   8) intel-all/19.0.4   
 3) intel-mpi/19.0.4         6) intel-tbb/19.0.4      

Si aucun module n'est chargé le message suivant apparaît :

$ module list
No Modulefiles Currently Loaded.

Chargement d'un produit

Le chargement des produits se fait avec la sous-commande load suivie par :

  • soit le nom complet du module pour sélectionner une version précise du produit :
    $ module load intel-compilers/19.0.4
  • soit le début du nom du module qui sélectionne alors la version par défaut du produit :
    $ module load intel-compilers

La commande module load ne renvoie aucune information lorsqu'elle s'exécute sans problème. Il peut donc être nécessaire d'utiliser la commande module list pour savoir quelle version a été chargée.
Par contre, une erreur peut se produire et empêcher le chargement d'un module. Des messages d'erreur sont alors retournés, par exemple :

  • si le module à charger n'existe pas :
    $ module load intel-compilers-19/19.0.4
    ERROR: Unable to locate a modulefile for 'intel-compilers-19/19.0.4'
  • si un conflit existe entre le module à charger et un des modules déjà chargés :
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/19.0.5
     
    $ module load intel-compilers/19.0.4
    Loading intel-compilers/19.0.4
      ERROR: Conflicting intel-compilers is loaded

Chargement de plusieurs produits

Il est possible de charger plusieurs produits en une seule fois :

  • En les listant sur une même ligne de commande :
    $ module load intel-compilers/19.0.4 intel-mpi/19.0.4 intel-mkl/19.0.4

    Attention : l'ordre dans lequel les modules sont indiqués peut être important !
    Ainsi, la commande suivante ne donne pas le résultat escompté puisque les modules intel-compilers/18.0.5 et intel-mpi/18.0.5 ne sont finalement pas utilisés :

    $ module load netcdf intel-compilers/18.0.5 intel-mpi/18.0.5
    Loading netcdf/4.7.2-mpi
      Loading requirement: intel-compilers/19.0.4 intel-mpi/19.0.4
     
    Loading intel-compilers/18.0.5
      ERROR: Conflicting intel-compilers is loaded
     
    Loading intel-mpi/18.0.5
      ERROR: Conflicting intel-mpi is loaded
     
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/19.0.4   2) intel-mpi/19.0.4   3) netcdf/4.7.2-mpi

    Dans ce cas, il faut charger intel-compilers/18.0.5 et intel-mpi/18.0.5 avant netcdf pour avoir le résultat attendu :

    $ module load intel-compilers/18.0.5 intel-mpi/18.0.5 netcdf
     
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/18.0.5   2) intel-mpi/18.0.5   3) netcdf/4.7.2-mpi
  • Certains modules sont des raccourcis permettant de charger plusieurs modules en une seule opération. C'est le cas des modules nommés intel-all/XX.Y.Z, qui vont charger plusieurs modules définissant un environnement Intel complet pour une version XX.Y.Z choisie.
    Par exemple avec Intel 19.0.4 :
    $ module load intel-all/19.0.4
    Loading intel-all/19.0.4
      Loading requirement: intel-compilers/19.0.4 intel-mkl/19.0.4 intel-mpi/19.0.4
        intel-vtune/19.0.4 intel-advisor/19.0.4 intel-tbb/19.0.4 intel-itac/19.0.4
     
    $ module list
    Currently Loaded Modulefiles:
     1) intel-compilers/19.0.4   4) intel-vtune/19.0.4     7) intel-itac/19.0.4  
     2) intel-mkl/19.0.4         5) intel-advisor/19.0.4   8) intel-all/19.0.4   
     3) intel-mpi/19.0.4         6) intel-tbb/19.0.4

Déchargement d'un produit

Vous pouvez retirer un produit de votre environnement en utilisant la sous-commande unload; vous pouvez aussi supprimer tous les modules avec la sous-commande purge :

$ module list
Currently Loaded Modulefiles:
 1) intel-compilers/19.0.4   2) intel-mpi/19.0.4   3) intel-mkl/19.0.4
 
$ module unload intel-mkl/19.0.4
$ module list
Currently Loaded Modulefiles:
 1) intel-compilers/19.0.4   2) intel-mpi/19.0.4
 
$ module purge
$ module list
No Modulefiles Currently Loaded.

S'il s'effectue sans problème, le déchargement d'un produit ne renvoie aucune information.

Changement de version d'un produit

Lorsque vous souhaitez changer la version d'un produit déjà chargé, vous pouvez utiliser la sous-commande switch :

$ module list
Currently Loaded Modulefiles:
 1) intel-compilers/19.0.4   2) intel-mpi/18.0.5
$ module switch intel-mpi/19.0.4
$ module list
Currently Loaded Modulefiles:
 1) intel-compilers/19.0.4   2) intel-mpi/19.0.4

Là encore, si tout se passe bien la commande ne renvoie aucun message.

Mise en garde pour l’édition de liens

Lors de la compilation de vos codes, même après avoir chargé le module adéquat pour utiliser une bibliothèque, il sera sans doute nécessaire de spécifier les librairies à utiliser lors de l'édition de liens.
Par exemple, pour compiler avec la bibliothèque mathématique HYPRE :

$ module load hypre
$ ifort -o test -lHYPRE test.f90

Notez que, par contre, les chemins vers les fichiers headers, les modules Fortran, les librairies statiques (.a) et dynamiques (.so) sont positionnés automatiquement, sans qu'il soit nécessaire de les préciser.

Pour tous ces points, en cas de problème, contactez le Support de l'Assistance.