Setting up the environment using Lmod at the HPC-UGent clusters#
module
command or the
handy shortcut command ml
.Quick introduction#
A very quick introduction to Lmod. Below you will find more details and examples.
ml
lists the currently loaded modules, and is equivalent withmodule list
ml GCC/4.9.3
loads theGCC/4.9.3
module, and is equivalent withmodule load GCC/4.9.3
ml -GCC
unloads the currently loadedGCC
module, and is equivalent withmodule unload GCC
ml av gcc
prints the currently available modules that match gcc (case-insensitively), and is equivalent withmodule avail GCC
ml show GCC/4.9.3
prints more information about theGCC/4.9.3
module, and is equivalent withmodule show GCC
ml spider gcc
searches (case-insensitive) for gcc in all available modules over all clustersml spider GCC/4.9.3
show all information about the moduleGCC/4.9.3
and on which clusters it can be loaded.ml save mycollection
stores the currently loaded modules to a collectionml restore mycollection
restores a previously stored collection of modules
Module commands: using module
(or ml
)#
Listing loaded modules: module list
(or ml
)#
To get an overview of the currently loaded modules, use module list
or ml
(without specifying extra arguments).
In a default environment, you should see a single cluster
module
loaded:
$ ml
Currently Loaded Modules:
1) cluster/victini (S)
Where:
S: Module is Sticky, requires --force to unload or purge
(for more details on sticky modules, see the section on ml purge
)
Searching for available modules: module avail (or ml av) and ml spider#
Printing all available modules: module avail (or ml av)#
To get an overview of all available modules, you can use
module avail
or simply ml av
:
$ ml av
----------------------------- /apps/gent/CO7/haswell-ib/modules/all -----------------------------
ABAQUS/6.12.1-linux-x86_64 libXext/1.3.3-intel-2016a (D)
ABAQUS/6.14.1-linux-x86_64 (D) libXfixes/5.0.1-gimkl-2.11.5
ADF/2014.02 libXfixes/5.0.1-intel-2015a
... ...
In the current module naming scheme, each module name consists of two parts:
the part before the first
/
, corresponding to the software name; andthe remainder, corresponding to the software version, the compiler toolchain that was used to install the software, and a possible version suffix
For example, the module name
matplotlib/1.5.1-intel-2016a-Python-2.7.11
will set up the
environment for using matplotlib version 1.5.1, which was installed
using the intel/2016a
compiler toolchain; the version suffix
-Python-2.7.11
indicates it was installed for Python version 2.7.11.
The (D)
indicates that this particular version of the module is the
default, but we strongly recommend to not rely on this as the default
can change at any point. Usuall, the default will point to the latest
version available.
Searching for modules: ml spider#
The (Lmod-specific) spider
subcommand lets you search for modules
across all clusters.
If you just provide a software name, for example gcc
, it prints on
overview of all available modules for GCC.
$ ml spider gcc
---------------------------------------------------------------------------------
GCC:
---------------------------------------------------------------------------------
Versions:
GCC/4.7.2
GCC/4.8.1
GCC/4.8.2
GCC/4.8.3
GCC/4.9.1
GCC/4.9.2
GCC/4.9.3-binutils-2.25
GCC/4.9.3
GCC/4.9.3-2.25
GCC/5.3.0
Other possible modules matches:
GCCcore
---------------------------------------------------------------------------------
To find other possible module matches do:
module -r spider '.*GCC.*'
---------------------------------------------------------------------------------
For detailed information about a specific \"GCC\" module (including how to load the modules) use the module's full name.
For example:
$ module spider GCC/4.9.3
---------------------------------------------------------------------------------
Note that spider
is case-insensitive.
If you use spider
on a full module name like GCC/4.9.3-2.25 it will
tell on which cluster(s) that module available:
$ ml spider GCC/4.9.3-2.25
---------------------------------------------------------------------------------
GCC: GCC/4.9.3-2.25
---------------------------------------------------------------------------------
Other possible modules matches:
GCCcore
You will need to load all module(s) on any one of the lines below before the \"GCC/4.9.3-2.25\" module
is available to load.
cluster/golett
cluster/phanpy
cluster/swalot
cluster/skitty
cluster/victini
Help:
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada,
as well as libraries for these languages (libstdc++, libgcj,...). - Homepage: http://gcc.gnu.org/
---------------------------------------------------------------------------------
To find other possible module matches do:
module -r spider '.*GCC/4.9.3-2.25.*'
This tells you that the module named GCC/4.9.3-2.25
is available on
the clusters golett
, phanpy
, swalot
, skitty
and
victini
. It also tells you what the module contains and a URL to the
homepage of the software.
Available modules for a particular software package: module avail <name> (or ml av <name>)#
To check which modules are available for a particular software package,
you can provide the software name to ml av
.
For example, to check which versions of IPython are available:
$ ml av ipython
----------------------------- /apps/gent/CO7/haswell-ib/modules/all -----------------------------
IPython/3.2.3-intel-2015b-Python-2.7.10 IPython/3.2.3-intel-2016a-Python-2.7.11 (D)
Note that the specified software name is treated case-insensitively.
Lmod does a partial match on the module name, so sometimes you need to
use /
to indicate the end of the software name you are interested
in:
$ ml av GCC/
----------------------------- /apps/gent/CO7/haswell-ib/modules/all -----------------------------
GCC/4.9.2 GCC/4.9.3-binutils-2.25 GCC/4.9.3 GCC/4.9.3-2.25 GCC/5.3.0 GCC/6.1.0-2.25 (D)
Inspecting a module using module show (or ml show)#
To see how a module would change the environment, use module show
or
ml show
:
$ ml show matplotlib/1.5.1-intel-2016a-Python-2.7.11
----------------------------- /apps/gent/CO7/haswell-ib/modules/all -----------------------------
whatis(\"Description: matplotlib is a python 2D plotting library which produces publication quality figures in a variety of
hardcopy formats and interactive environments across platforms. matplotlib can be used in python scripts, the python
and ipython shell, web application servers, and six graphical user interface toolkits. - Homepage: http://matplotlib.org \")
conflict(\"matplotlib\")
load(\"intel/2016a\")
load(\"Python/2.7.11-intel-2016a\")
load(\"freetype/2.6.2-intel-2016a\")
load(\"libpng/1.6.21-intel-2016a\")
prepend_path(\"LD_LIBRARY_PATH\",\"/apps/gent/CO7/haswell-ib/software/matplotlib/1.5.1-intel-2016a-Python-2.7.11/lib\")
prepend_path(\"LIBRARY_PATH\",\"/apps/gent/CO7/haswell-ib/software/matplotlib/1.5.1-intel-2016a-Python-2.7.11/lib\")
setenv(\"EBROOTMATPLOTLIB\",\"/apps/gent/CO7/haswell-ib/software/matplotlib/1.5.1-intel-2016a-Python-2.7.11\")
setenv(\"EBVERSIONMATPLOTLIB\",\"1.5.1\")
setenv(\"EBDEVELMATPLOTLIB\",\"/apps/gent/CO7/haswell-ib/software/matplotlib/1.5.1-intel-2016a-Python-2.7.11/easybuild/matplotlib-1.5.1-intel-2016a-Python-2.7.11-easybuild-devel\")
prepend_path(\"PYTHONPATH\",\"/apps/gent/CO7/haswell-ib/software/matplotlib/1.5.1-intel-2016a-Python-2.7.11/lib/python2.7/site-packages\")
setenv(\"EBEXTSLISTMATPLOTLIB\",\"Cycler-0.9.0,matplotlib-1.5.1\")
help([[ matplotlib is a python 2D plotting library which produces publication quality figures in a variety of
hardcopy formats and interactive environments across platforms. matplotlib can be used in python scripts, the python
and ipython shell, web application servers, and six graphical user interface toolkits. - Homepage: http://matplotlib.org
Note that both the direct changes to the environment as well as other modules that will be loaded are shown.
If you’re not sure what all of this means: don’t worry, you don’t have to know; just load the module and try using the software.
Loading modules: module load <modname(s)> (or ml <modname(s)>)#
To effectively apply the changes to the environment that are specified
by a module, use module load
or ml
and specify the name of the
module.
For example, to set up your environment to use matplotlib:
$ ml matplotlib/1.5.1-intel-2016a-Python-2.7.11
$ ml
Currently Loaded Modules:
1) cluster/victini (S) 12) zlib/1.2.8-intel-2016a
2) GCCcore/4.9.3 13) libreadline/6.3-intel-2016a
3) binutils/2.25-GCCcore-4.9.3 14) ncurses/6.0-intel-2016a
4) icc/2016.1.150-GCC-4.9.3-2.25 15) Tcl/8.6.4-intel-2016a
5) ifort/2016.1.150-GCC-4.9.3-2.25 16) SQLite/3.9.2-intel-2016a
6) iccifort/2016.1.150-GCC-4.9.3-2.25 17) Tk/8.6.4-intel-2016a-no-X11
7) impi/5.1.2.150-iccifort-2016.1.150-GCC-4.9.3-2.25 18) GMP/6.1.0-intel-2016a
8) iimpi/8.1.5-GCC-4.9.3-2.25 19) Python/2.7.11-intel-2016a
9) imkl/11.3.1.150-iimpi-8.1.5-GCC-4.9.3-2.25 20) freetype/2.6.2-intel-2016a
10) intel/2016a 21) libpng/1.6.21-intel-2016a
11) bzip2/1.0.6-intel-2016a 22) matplotlib/1.5.1-intel-2016a-Python-2.7.11
Note that even though we only loaded a single module, the output of
ml
shows that a whole bunch of modules were loaded, which are
required dependencies for matplotlib, including both the compiler
toolchain that was used to install matplotlib (i.e. intel/2016a
,
and its dependencies) and the module providing the Python installation
for which matplotlib was installed (i.e.
Python/2.7.11-intel-2016a
).
Conflicting modules#
It is important to note that only modules that are compatible with each other can be loaded together. In particular, modules must be installed either with the same toolchain as the modules that are already loaded, or with a compatible (sub)toolchain.
For example, once you have loaded one or more modules that were
installed with the intel/2016a
toolchain, all other modules that you
load should have been installed with the same toolchain.
In addition, only one single version of each software package can be
loaded at a particular time. For example, once you have the
Python/2.7.11-intel-2016a
module loaded, you can not load a
different version of Python in the same session/job script; neither
directly, nor indirectly as a dependency of another module you want to
load.
See also the topic “module conflicts” in the list of key differences with the previously used module system.
Unloading modules: module unload <modname(s)> (or ml -<modname(s)>)#
To revert the changes to the environment that were made by a particular
module, you can use module unload
or ml -<modname>
.
For example:
$ ml
Currently Loaded Modules:
1) cluster/golett (S)
$ which gcc
/usr/bin/gcc
$ ml GCC/4.9.3
$ ml
Currently Loaded Modules:
1) cluster/golett (S) 2) GCC/4.9.3
$ which gcc
/apps/gent/CO7/haswell-ib/software/GCC/4.9.3/bin/gcc
$ ml -GCC/4.9.3
$ ml
Currently Loaded Modules:
1) cluster/golett (S)
$ which gcc
/usr/bin/gcc
Resetting by unloading all modules: ml purge (module purge)#
To reset your environment back to a clean state, you can use
module purge
or ml purge
:
$ ml
Currently Loaded Modules:
1) cluster/victini (S) 11) bzip2/1.0.6-intel-2016a
2) GCCcore/4.9.3 12) zlib/1.2.8-intel-2016a
3) binutils/2.25-GCCcore-4.9.3 13) libreadline/6.3-intel-2016a
4) icc/2016.1.150-GCC-4.9.3-2.25 14) ncurses/6.0-intel-2016a
5) ifort/2016.1.150-GCC-4.9.3-2.25 15) Tcl/8.6.4-intel-2016a
6) iccifort/2016.1.150-GCC-4.9.3-2.25 16) SQLite/3.9.2-intel-2016a
7) impi/5.1.2.150-iccifort-2016.1.150-GCC-4.9.3-2.25 17) Tk/8.6.4-intel-2016a-no-X11
8) iimpi/8.1.5-GCC-4.9.3-2.25 18) GMP/6.1.0-intel-2016a
9) imkl/11.3.1.150-iimpi-8.1.5-GCC-4.9.3-2.25 19) Python/2.7.11-intel-2016a
10) intel/2016a
$ ml purge
The following modules were not unloaded:
(Use \"module --force purge\" to unload all):
1) cluster/victini
[15:21:20] vsc40023@node2626:~ $ ml
Currently Loaded Modules:
1) cluster/victini (S)
Note that, on HPC-UGent, the cluster
module will always remain
loaded, since it defines some important environment variables that point
to the location of centrally installed software/modules, and others that
are required for submitting jobs and interfacing with the cluster
resource manager ( qsub
, qstat
, …).
As such, you should not (re)load the cluster
module anymore
after running ml purge
. See also the topic on the purge command in
the list of key differences with the previously used module
implementation.
Module collections: ml save, ml restore#
If you have a set of modules that you need to load often, you can save these in a collection (only works with Lmod).
First, load all the modules you need, for example:
ml HDF5/1.8.16-intel-2016a GSL/2.1-intel-2016a Python/2.7.11-intel-2016a
Now store them in a collection using ml save
:
$ ml save my-collection
Later, for example in a job script, you can reload all these modules
with ml restore
:
$ ml restore my-collection
With ml savelist
you can get a list of all saved collections:
$ ml savelist
Named collection list:
1) my-collection
2) my-other-collection
To inspect a collection, use ml describe
.
To remove a module collection, remove the corresponding entry in
$HOME/.lmod.d
.
Lmod vs Tcl-based environment modules#
In August 2016, we switched to Lmod as a modules tool, an alternative to the environment modules tool.
Consult the Lmod documentation web site for more information.
Benefits#
significantly more responsive module commands, in particular
module avail
a better and easier to use interface (e.g. case-insensitive
avail
, theml
command, etc.)additional useful features, like defining & restoring module collections
drop-in replacement for Tcl-based environment modules (existing Tcl module files do not need to be modified to work)
module files can be written in either Tcl or Lua syntax (and both types of modules can be mixed together)
Key differences#
The switch to Lmod should be mostly transparent, i.e. you should not have to change your existing job scripts.
Existing module
commands should keep working as they were before the
switch to Lmod.
However, there are a couple of minor differences between Lmod & the old modules tool you should be aware of:
module conflicts are strictly enforced
module purge
does not unload thecluster
modulemodulecmd
is not available anymore (only relevant for EasyBuild)
Module conflicts are strictly enforced#
Conflicting modules can no longer be loaded together.
Lmod has been configured to report an error if any module conflict occurs (as opposed to the default behaviour which is to unload the conflicting module and replace it with the one being loaded).
Although it seemed like the old modules did allow for conflicting modules to be loaded together, this was highly discouraged already since it usually resulted in a broken environment. Lmod will ensure no changes are made to your existing environment if a module that conflicts with an already module is loaded.
If you do try to load conflicting modules, you will run into an error message like:
$ module load Python/2.7.11-intel-2016a
$ module load Python/3.5.1-intel-2016a
Lmod has detected the following error: Your site prevents the automatic swapping of modules with same name.
You must explicitly unload the loaded version of \"Python\" before you can load the new one. Use swap (or an unload
followed by a load) to do this:
$ module swap Python Python/3.5.1-intel-2016a
Alternatively, you can set the environment variable LMOD_DISABLE_SAME_NAME_AUTOSWAP to \"no\" to re-enable same name
Note that although Lmod suggests to unload or swap, we recommend to try and make sure you only load compatible modules together, and certainlynotto define ``$LMOD_DISABLE_SAME_NAME_AUTOSWAP``.
module purge does not unload the cluster module#
module purge
effectively resets your environment to a
pristine working state, i.e. the cluster
module stays loaded
after the purge
.module load cluster
to
restore your environment to a working state.When you do run module load cluster
when a cluster
is already
loaded, you will see the following warning message:
WARNING: 'module load cluster' has no effect when a 'cluster' module is already loaded.
For more information, please see https://www.vscentrum.be/cluster-doc/software/modules/lmod#module_load_cluster
To change to another cluster, use module swap
or ml swap
; for
example, to change your environment for the golett
cluster, use
ml swap cluster/golett
.
If you are frequently see the warning above pop up, you may have
something like this in your $VSC_HOME/.bashrc
file:
. /etc/profile.d/modules.sh
module load cluster
If you do, please remove that, and include this at the top of your
~/.bashrc
file:
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
modulecmd is not available anymore#
The modulecmd
command is not available anymore, and has been replacd
by the lmod
command.
modulecmd
is readily available.export EASYBUILD_MODULES_TOOL=Lmod
See the EasyBuild documentation for other ways of configuring EasyBuild to use Lmod.
You should not be using lmod
directly in other circumstances, use
either ml
or module
instead.