Skip to content

Environment Modules (EM)

What are Environment Modules (EMs)

The "Environment Module" system is a tool that allows you to control your own access to the different pieces of software that are currently installed on the cluster. This is important because we often have many different versions of the same software installed, and accessing the wrong version could create bugs that would be difficult to track down. EMs give you a way to access the software you need, while also avoiding any unnecessary conflicts.

In Unix, access to programs and libraries is generally controlled by setting a number of "environment variables". On many systems, users need to setup these variables themselves by editing certain scripts that get run automatically when the user logs in. Environment Modules simplify this process by allowing you to type some simple commands to query, load and unload software as you need it. To use a particular software package, you have to load the relevant module. Some info about EMs can be found in the wikipedia page :

Flat vs Hierarchical Modules

Argo uses a flat module scheme that displays all module available on the system at all time. When you search a package via module avail <package_name>, you will see modules matching <package_name> regardless of their dependencies.

Hopper uses a hierarchical module scheme that displays only modules which are compatible with the particular compiler and MPI library you have loaded at a given time to avoid incompatibilities. Therefore, searching a package via module avail <package_name> will not necessarily show you all available versions of that package. A more comprehensive way of searching for packages is using the module spider <package_name> command. That will report all available packages matching <package_name>.

Initializing and Loading EMs

There are some standard software and libraries that are already installed for all user on the cluster. Users can see which of these are currently available (Note. Some modules may be removed and/or updated, it is important that you always check to make sure the software/library you want to use is available) by using the following command:

module avail

This will show:

.some package_1
.some package_2
.some more packages

The use.own is a special module, it enables the user to load their own modules for software they have installed locally inside their home directory. For more information about how to install software and create modules for them please see the wiki page: Installing User Packages In Argo.

Users can load a specific module from the list of available modules by invoking:

module load module_name

You must load the respective module for the software or a library before using it inside your application. You can load modules inside your sbatch script by using the above command. You can check which modules are currently loaded by:

module list

To get information about a particular module (such as the collection of environment variables that are set by that module) you can use:

module show module_name

You can unload a module by:

module unload module_name

To find more options type in:

module --help

Auto Loading Modules at Login

Users can make a module load automatically each time they login to the cluster using the following command:

module initadd module_name

Similarly one can remove a module from being auto loaded by:

module initrm module_name

You may also get more information about a particular module by invoking:

module whatis module_name

Note: Whatever modules you need to run your application must also be loaded from your sbatch Slurm job submission script which you submit to the Slurm scheduler in order to run your application.

#SBATCH options

#load modules after this line

Base/ Default Modules


No modules are loaded by default at login on Argo unless you explicitly load them via your startup.


Since modules available to you depend on the compiler and MPI library loaded in your environment, Hopper loads a set of default modules including a default compiler (gnu9/9.3.0) and MPI library (openmpi4/4.0.4).

$ module list

Currently Loaded Modules:
  1) use.own     4) gnu9/9.3.0         7) hwloc/2.1.0
  2) autotools   5) ucx/1.8.0          8) openmpi4/4.0.4
  3) prun/2.0    6) libfabric/1.10.1   9) hosts/hopper

Warning: If you load modules or set up other environmental variables using your startup scripts on Argo, you will likely get errors and warning messages when logging into Hopper because those modules do not exist on Hopper with the same name. To avoid these issues, you can wrap some of the logic in your startup scripts to behave differently based on the cluster. Such logic would look like this:

# load the proper set of modules based on the cluster
export CLUSTER=`sacctmgr -n  show cluster format=Cluster|xargs`
export CNODE=`hostname -s`
if [ ${CLUSTER} == "argo" ]; then
  module load <ARGO_MODULE_NAME...>
  source <ARGO_FILE...>
else [ ${CLUSTER} == "hopper" ] 

Module Naming


Modules are generally named as <package_name>/<package_version> on Argo


Depending on the source of the package, Lmod modules on Hopper can have longer names and aliases.

  • Spack-built packages are named <package_name>/<package_version>-<two-character-hash>
  • Some packages have useful aliases such as <package_name>/<package_version>-<two-character-hash> (mixed-precision)
  • Some important packages such as compilers, MPI and math libraries have global aliases appearing at the top when you execute module avail

Searching for modules

Info: On Hopper, module spider searches the whole module tree to find matching modules whereas module avail will only search modules built with your current compiler and MPI library.

How you search for modules in Hopper is very different from Argo Cluster. Examples and demostration of the key differences are shown in the Argo vs Hopper page. Argo vs Hopper page

Basic LMod Usage on Hopper Cluster

The Lmod is only used on the Hopper Cluster.The table below summarizes the most commonly used LMod commands. Please note that you can use ml as an alias or shortcut to module.

Module Command Description
ml avail List available modules
ml list Show modules currently loaded
ml load/add package Load a selected module*
ml +package Load a selected module*
ml unload/rm package Unload a previously loaded module
ml -package Unload a previously loaded module
ml swap package1 package2 Unload package1 and load package*
ml purge Unload all loaded modules
ml reset Reset loaded modules to system defaults
ml display/show package Display the contents of a selected module
ml spider List all modules (not just available ones)
ml spider package Display description of a selected module
ml keyword key Search for available modules by keyword
ml, module help Display help, usage information for modules
ml use path Add path to the MODULPATH (module search path)
ml unuse path Remove path from the MODULPATH (module search path)

Creating Custom Modules

Additional information on Customs modules is given on the User packages wiki page linked below: User packages wiki page


  1. Linux manpage: