Acceder a software a través de Módulos

Última actualización: 2026-02-17 | Mejora esta página

Tiempo estimado: 45 minutos

Hoja de ruta

Preguntas

  • ¿Cómo cargamos y descargamos paquetes de software?

Objetivos

  • Cargar y usar un paquete de software.
  • Explicar cómo cambia el entorno de la shell cuando el mecanismo de módulos carga o descarga paquetes.

En un sistema de computación de alto rendimiento, raramente el software que queremos usar está disponible cuando iniciamos sesión. Está instalado, pero necesitaremos “cargarlo” antes de que pueda ejecutarse.

Antes de empezar a usar paquetes de software individuales, sin embargo, debemos entender el razonamiento detrás de este enfoque. Los tres factores más grandes son:

  • incompatibilidades de software
  • versiones
  • dependencias

La incompatibilidad de software es un dolor de cabeza importante para los programadores. A veces, la presencia (o ausencia) de un paquete de software romperá otros que dependen de él. Dos ejemplos bien conocidos son las versiones de Python y compilador C. Python 3 proporciona famosamente un comando python que entra en conflicto con el proporcionado por Python 2. El software compilado contra una versión más nueva de las bibliotecas C y luego ejecutado en una máquina que tiene versiones más antiguas de bibliotecas C instaladas resultará en un error opaco 'GLIBCXX_3.4.20' not found.

El versionado del software es otro problema común. Un equipo podría depender de una cierta versión del paquete para su proyecto de investigación; si la versión del software cambiara (por ejemplo, si se actualizara un paquete), podría afectar sus resultados. Tener acceso a múltiples versiones de software permite a un conjunto de investigadores evitar que los problemas de versiones de software afecten sus resultados.

Las dependencias son donde un paquete de software particular (o incluso una versión particular) depende de tener acceso a otro paquete de software (o incluso una versión particular de otro paquete de software). Por ejemplo, el software de ciencia de materiales VASP puede requerir una versión particular de la biblioteca de software FFTW (Transformada rápida de Fourier en el Oeste) para que funcione.

Módulos de entorno


Los módulos de entorno son la solución a estos problemas. Un módulo es una descripción autónoma de un paquete de software: contiene la configuración requerida para ejecutar un paquete de software y, generalmente, codifica las dependencias requeridas en otros paquetes de software.

Hay varias implementaciones diferentes de módulos de entorno comúnmente usadas en sistemas HPC: las dos más comunes son módulos TCL y Lmod. Ambos usan sintaxis similar y los conceptos son los mismos, por lo que aprender a usar uno te permitirá usar el que esté instalado en el sistema que estés usando. En ambas implementaciones, el comando module se usa para interactuar con módulos de entorno. Generalmente se agrega un subcomando adicional al comando para especificar qué quieres hacer. Para una lista de subcomandos puedes usar module -h o module help. Como con todos los comandos, puedes acceder a la ayuda completa en las páginas man con man module.

Al iniciar sesión, puede que comiences con un conjunto predeterminado de módulos cargados o puede que comiences con un entorno vacío; esto depende de la configura del sistema que estés usando.

Listar módulos disponibles

Para ver módulos de software disponibles, usa module avail:

BASH

[tuUsuario@raimondi ~]$ module avail | less

SALIDA

------------------------------------------------------------------------------------ /opt/ohpc/pub/moduledeps/gnu14-openmpi5 -------------------------------------------------------------------------------------
   adios2/2.10.1    extrae/3.8.3    imb/2021.3     netcdf-cxx/4.3.1     (D)    omb/7.5                petsc/3.18.1      ptscotch/7.0.7      scalapack/2.2.2    sionlib/1.7.7         tau/2.31.1
   boost/1.88.0     fftw/3.3.10     mfem/4.4       netcdf-fortran/4.6.2 (D)    opencoarrays/2.10.2    phdf5/1.14.6      py3-mpi4py/3.1.5    scalasca/2.6.2     slepc/3.18.0          trilinos/13.4.0
   dimemas/5.4.2    hypre/2.33.0    mumps/5.2.1    netcdf/4.9.3         (D)    otf2/3.1.1             pnetcdf/1.14.0    py3-scipy/1.5.4     scorep/9.0         superlu_dist/6.4.0

  [Se ha eliminado la mayor parte de la salida aquí para mayor claridad.]

  Where:
   D:  Default Module
   L:  Module is loaded

If the avail list is too long consider trying:

"module --default avail" or "ml -d av" to just list the default modules.
"module overview" or "ml ov" to display the number of modules for each name.

Use "module spider" to find all possible modules and extensions.
Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys".

Ten en cuenta que enviar la salida a través de less nos permite buscar dentro de la salida usando la tecla /.

Listar módulos cargados actualmente

Puedes usar el comando module list para ver qué módulos tienes actualmente cargados en tu entorno. Si no tienes módulos cargados, verás un mensaje que te lo dice.

BASH

[tuUsuario@raimondi ~]$ module list

SALIDA

Currently Loaded Modules:
  1) autotools   3) gnu14/14.2.0   5) ucx/1.18.0         7) openmpi5/5.0.7   9) ohpc
  2) prun/2.2    4) hwloc/2.12.0   6) libfabric/1.18.0   8) nvtop/3.2.0

Cargar y descargar software


Para cargar un módulo de software, usa module load.

En este ejemplo usaremos Python 3. Inicialmente, no está cargado. Podemos probar esto usando el comando which. which busca programas de la misma manera que Bash, así que podemos usarlo para decirnos dónde se almacena un software particular.

BASH

[tuUsuario@raimondi ~]$ which python3

Si el comando python3 no estuviera disponible, veríamos una salida como

SALIDA

/usr/bin/which: no python3 in (/usr/local/sbin:/opt/ohpc/pub/apps/nvtop/bin:/opt/ohpc/pub/mpi/libfabric/1.18.0/bin:/opt/ohpc/pub/mpi/ucx-ohpc/1.18.0/bin:/opt/ohpc/pub/libs/hwloc/bin:/opt/ohpc/pub/mpi/openmpi5-gnu14/5.0.7/bin:/opt/ohpc/pub/compiler/gcc/14.2.0/bin:/opt/ohpc/pub/utils/prun/2.2:/opt/ohpc/pub/utils/autotools/bin:/opt/ohpc/pub/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/tuUsuario/.local/bin:/home/tuUsuario/bin)

Ten en cuenta que esta pared de texto es realmente una lista, con valores separados por el carácter :. La salida nos dice que el comando which buscó en los siguientes directorios python3, sin éxito:

SALIDA

/usr/local/sbin
/opt/ohpc/pub/apps/nvtop/bin
/opt/ohpc/pub/mpi/libfabric/1.18.0/bin
/opt/ohpc/pub/mpi/ucx-ohpc/1.18.0/bin
/opt/ohpc/pub/libs/hwloc/bin
/opt/ohpc/pub/mpi/openmpi5-gnu14/5.0.7/bin
/opt/ohpc/pub/compiler/gcc/14.2.0/bin
/opt/ohpc/pub/utils/prun/2.2
/opt/ohpc/pub/utils/autotools/bin
/opt/ohpc/pub/bin/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/home/tuUsuario/.local/bin
/home/tuUsuario/bin

Sin embargo, en nuestro caso sí tenemos un python3 existente disponible, así que vemos

SALIDA

/usr/bin/python3

Nosotros necesitamos un Python diferente al proporcionado por el sistema, así que carguemos un módulo para acceder a él.

Podemos cargar el comando python3 con module load:

BASH

[tuUsuario@raimondi ~]$ module load python
[tuUsuario@raimondi ~]$ which python3

SALIDA

/opt/ohpc/pub/apps/spack/local/linux-x86_64/python-3.13.5-aloly4qhu2ecv2x3urosyr44oq4hmbn6/bin/python3

Entonces, ¿qué acaba de suceder?

Para entender la salida, primero necesitamos entender la naturaleza de la variable de entorno $PATH. $PATH es una variable de entorno especial que controla dónde busca software un sistema UNIX. Específicamente, $PATH es una lista de directorios (separados por :) que el SO busca a través de un comando antes de rendirse y decirnos que no puede encontrarlo. Como con todas las variables de entorno, podemos imprimirlo usando echo.

BASH

[tuUsuario@raimondi ~]$ echo $PATH

SALIDA

/opt/ohpc/pub/apps/spack/local/linux-x86_64/python-3.13.5-aloly4qhu2ecv2x3urosyr44oq4hmbn6/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/gettext-0.23.1-qde2xzyizazzp5s47ejgaxyzwc4nfnfd/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/libxml2-2.13.5-z4a4hmomjj5ro423f22s2t32zvlciycd/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/tar-1.35-qe5dfed6ps3v2caxwfdwwqyah7z6pbu4/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/pigz-2.8-2smh4ufgfif5rb3j6m2zkhrca3seaiqg/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/bzip2-1.0.8-wucwh5ce7m7vilxnz56gwqxqzx7nnwzb/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/zstd-1.5.7-shcfzlty5p73tnmstuv2rw5uil6y6qfh/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/libiconv-1.18-446fnouxgsaesaumijbliacukhy3ixde/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/sqlite-3.46.0-ugjl73lgudrl2prwuxinbqtx7j4lzrne/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/openssl-3.4.1-zsrh72hcb4nifdxsddfhbylgofl2dp7x/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/gdbm-1.23-hzp3jssy2pkph7kmjtqyonoqfpd6fhzu/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/expat-2.7.1-zfeeeecjghhwg3sud4lnwk354hyyxava/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/readline-8.2-2sa76zwjjun2hdt7cn75hmt6cutq3egw/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/ncurses-6.5-24imdjdnnqyszfgfquu23k2jcumxzfv2/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/xz-5.6.3-dfp5nxkcjqw55iyzxcg5vcvdud3z2jmw/bin:/opt/ohpc/pub/apps/spack/local/linux-x86_64/util-linux-uuid-2.41-mtu6n2jns45cggjd7x3y7c2bax7oaes5/bin:/usr/local/sbin:/opt/ohpc/pub/apps/nvtop/bin:/opt/ohpc/pub/mpi/libfabric/1.18.0/bin:/opt/ohpc/pub/mpi/ucx-ohpc/1.18.0/bin:/opt/ohpc/pub/libs/hwloc/bin:/opt/ohpc/pub/mpi/openmpi5-gnu14/5.0.7/bin:/opt/ohpc/pub/compiler/gcc/14.2.0/bin:/opt/ohpc/pub/utils/prun/2.2:/opt/ohpc/pub/utils/autotools/bin:/opt/ohpc/pub/bin:/usr/local/bin:/usr/bin:/usr/sbin

Notarás una similitud con la salida del comando which. En este caso, solo hay una diferencia: el directorio diferente está al principio. Cuando ejecutamos el comando module load, se agregó un directorio al principio de nuestra $PATH o se “antepuso al $PATH”. Veamos qué hay allí:

BASH

[tuUsuario@raimondi ~]$ ls /opt/ohpc/pub/apps/spack/local/linux-x86_64/python-3.13.5-aloly4qhu2ecv2x3urosyr44oq4hmbn6/bin

SALIDA

idle3     pydoc3     python   python3.13         python3.13-gdb.py  python-config
idle3.13  pydoc3.13  python3  python3.13-config  python3-config

En resumen, module load agregará software a tu $PATH. “Carga” software. Una nota importante al respecto: dependiendo de qué versión del programa module esté instalada en tu sistema, module load también cargará las dependencias de software necesarias.

A manera de ejemplo, usemos module list. module list muestra todos los módulos de software cargados.

BASH

[tuUsuario@raimondi ~]$ module list

SALIDA

Currently Loaded Modules:
  1) autotools   3) gnu14/14.2.0   5) ucx/1.18.0         7) openmpi5/5.0.7   9) ohpc
  2) prun/2.2    4) hwloc/2.12.0   6) libfabric/1.18.0   8) nvtop/3.2.0

BASH

[tuUsuario@raimondi ~]$ module load gromacs
[tuUsuario@raimondi ~]$ module list

SALIDA

Currently Loaded Modules:
  1) autotools   2) prun/2.2   3) gnu14/14.2.0   4) ucx/1.18.0   5) libfabric/1.18.0   6) openmpi5/5.0.7   7) nvtop/3.2.0   8) ohpc   9) gromacs/2025.2-gcc-14.2.0-linux-rocky9-x86_64-h6wd4d7

One or more modules are hidden from list. To see all do "module --show_hidden list"

En la salida anterior se observa que algunos módulos están ocultos. Para ver la lista completa de módulos cargados, es necesario añadir la opción --show_hidden.

BASH

[tuUsuario@raimondi ~]$ module --show_hidden list

SALIDA

Currently Loaded Modules:
  1) autotools                                                        13) zlib-ng/2.2.4-gcc-14.2.0-linux-rocky9-x86_64-mcjvjqx        (s,HL)  25) krb5/1.21.3-gcc-14.2.0-linux-rocky9-x86_64-dlwmfph      (s,HL)
  2) prun/2.2                                                         14) libxml2/2.13.5-gcc-14.2.0-linux-rocky9-x86_64-z4a4hmo       (s,HL)  26) libxcrypt/4.4.38-gcc-14.2.0-linux-rocky9-x86_64-nngshzb (s,HL)
  3) gnu14/14.2.0                                                     15) ncurses/6.5-gcc-14.2.0-linux-rocky9-x86_64-24imdjd          (s,HL)  27) openssh/9.9p1-gcc-14.2.0-linux-rocky9-x86_64-5zzlvcn    (s,HL)
  4) ucx/1.18.0                                                       16) libpciaccess/0.17-gcc-14.2.0-linux-rocky9-x86_64-y4bm7oj    (s,HL)  28) numactl/2.0.18-gcc-14.2.0-linux-rocky9-x86_64-cuz44wf   (s,HL)
  5) libfabric/1.18.0                                                 17) hwloc/2.11.1-gcc-14.2.0-linux-rocky9-x86_64-mqocexr         (s,HL)  29) libevent/2.1.12-gcc-14.2.0-linux-rocky9-x86_64-mj7zgc2  (s,HL)
  6) openmpi5/5.0.7                                                   18) libedit/3.1-20240808-gcc-14.2.0-linux-rocky9-x86_64-dqicyab (s,HL)  30) pmix/5.0.5-gcc-14.2.0-linux-rocky9-x86_64-xygwyws       (s,HL)
  7) nvtop/3.2.0                                                      19) openssl/3.4.1-gcc-14.2.0-linux-rocky9-x86_64-zsrh72h        (s,HL)  31) openmpi/5.0.8-gcc-14.2.0-linux-rocky9-x86_64-kigoc6d    (s,HL)
  8) ohpc                                                             20) zstd/1.5.7-gcc-14.2.0-linux-rocky9-x86_64-shcfzlt           (s,HL)  32) fftw/3.3.10-gcc-14.2.0-linux-rocky9-x86_64-surg77v      (s,HL)
  9) glibc/2.34-none-none-linux-rocky9-x86_64-ppxsf4c         (s,HL)  21) bzip2/1.0.8-gcc-14.2.0-linux-rocky9-x86_64-wucwh5c          (s,HL)  33) openblas/0.3.29-gcc-14.2.0-linux-rocky9-x86_64-5lpalvi  (s,HL)
 10) gcc-runtime/14.2.0-none-none-linux-rocky9-x86_64-7itgu3a (s,HL)  22) pigz/2.8-gcc-14.2.0-linux-rocky9-x86_64-2smh4uf             (s,HL)  34) gromacs/2025.2-gcc-14.2.0-linux-rocky9-x86_64-h6wd4d7
 11) xz/5.6.3-gcc-14.2.0-linux-rocky9-x86_64-dfp5nxk          (s,HL)  23) tar/1.35-gcc-14.2.0-linux-rocky9-x86_64-qe5dfed             (s,HL)
 12) libiconv/1.18-gcc-14.2.0-linux-rocky9-x86_64-446fnou     (s,HL)  24) gettext/0.23.1-gcc-14.2.0-linux-rocky9-x86_64-qde2xzy       (s,HL)

  Where:
   HL:  Hidden from load Module
   s:   Soft Hidden Module

Con este último resultado notaremos que al cargar el módulo gromacs (un paquete de software de bioinformática), también se cargó glibc/2.34-none-none-linux-rocky9-x86_64-ppxsf4c, gcc-runtime/14.2.0-none-none-linux-rocky9-x86_64-7itgu3a y muchos más. Ahora intentemos descargar el paquete gromacs.

BASH

[tuUsuario@raimondi ~]$ module unload gromacs
[tuUsuario@raimondi ~]$ module list

SALIDA

Currently Loaded Modules:
  1) autotools   3) gnu14/14.2.0   5) libfabric/1.18.0   7) nvtop/3.2.0
  2) prun/2.2    4) ucx/1.18.0     6) openmpi5/5.0.7     8) ohpc

Así que, usar module unload “descarga” un módulo, y dependiendo de cómo esté configurado, también puede descargar todas las dependencias (en nuestro caso lo hace). Si no lo hiciera y quisiéramos descargar todo a la vez, podríamos ejecutar module purge (descarga todo).

BASH

[tuUsuario@raimondi ~]$ module purge
[tuUsuario@raimondi ~]$ module list

SALIDA

No modules loaded

Ten en cuenta que module purge proporciona información útil. También nos indicará si existe un conjunto predeterminado de paquetes “sticky” que no pueden descargarse (y cómo descargarlos realmente en caso de que así lo deseemos).

Ten en cuenta que este proceso de carga de módulos sucede principalmente a través de la manipulación de variables de entorno como $PATH. Generalmente hay poco o ningún movimiento de datos involucrado.

El proceso de carga de módulos también manipula otras variables de entorno especiales, incluidas variables que influyen en dónde busca el sistema bibliotecas de software, y a veces variables que le dicen a paquetes de software comercial dónde encontrar servidores de licencia.

El comando module también restaura estas variables de entorno de la shell a su estado anterior cuando un módulo se descarga.

Versioning del software


Hasta ahora, hemos aprendido cómo cargar y descargar paquetes de software. Esto es muy útil. Sin embargo, aún no hemos abordado el problema del versionado del software. En algún momento u otro, te encontrarás con problemas donde solo una versión particular de algún software será adecuada. Quizá la corrección de un error clave solo sucedió en una versión determinada, o la versión X rompió la compatibilidad con un formato de archivo que usas. En cualquiera de estos casos de ejemplo, es útil ser muy específico sobre qué versión de software estas cargado.

Examinemos la salida de module avail más de cerca, usando el paginador ya que puede haber montones de salida:

BASH

[tuUsuario@raimondi ~]$ module avail | less

SALIDA

------------------------------------------------------------------------------------ /opt/ohpc/pub/moduledeps/gnu14-openmpi5 -------------------------------------------------------------------------------------
   adios2/2.10.1    extrae/3.8.3    imb/2021.3     netcdf-cxx/4.3.1     (D)    omb/7.5                petsc/3.18.1      ptscotch/7.0.7      scalapack/2.2.2    sionlib/1.7.7         tau/2.31.1
   boost/1.88.0     fftw/3.3.10     mfem/4.4       netcdf-fortran/4.6.2 (D)    opencoarrays/2.10.2    phdf5/1.14.6      py3-mpi4py/3.1.5    scalasca/2.6.2     slepc/3.18.0          trilinos/13.4.0
   dimemas/5.4.2    hypre/2.33.0    mumps/5.2.1    netcdf/4.9.3         (D)    otf2/3.1.1             pnetcdf/1.14.0    py3-scipy/1.5.4     scorep/9.0         superlu_dist/6.4.0

  [Se ha eliminado la mayor parte de la salida aquí para mayor claridad.]

  Where:
   D:  Default Module
   L:  Module is loaded

If the avail list is too long consider trying:

"module --default avail" or "ml -d av" to just list the default modules.
"module overview" or "ml ov" to display the number of modules for each name.

Use "module spider" to find all possible modules and extensions.
Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys".

Si el software que ejecuta tu script de Slurm requiere una versión específica de una dependencia, asegúrate de utilizar el nombre completo del módulo, en lugar de la versión predeterminada (default) que se carga cuando se indica solo su nombre (hasta la primera barra /)

Desafío

Usar módulos de software en scripts

Crea un trabajo que pueda ejecutar python3 --version. Recuerda, ¡ningún software está cargado por defecto! Ejecutar un trabajo es como iniciar sesión en el sistema (no debes asumir que un módulo cargado en el nodo de acceso está cargado en un nodo de cómputo).

BASH

[tuUsuario@raimondi ~]$ nano python-module.slurm
[tuUsuario@raimondi ~]$ cat python-module.slurm

SALIDA

#!/bin/bash
#SBATCH -p debug

#SBATCH -t 00:00:30

module load python

python3 --version

BASH

[tuUsuario@raimondi ~]$ sbatch  python-module.slurm

Es recomendable guardar tus scripts de trabajo con la extensión .slurm, ya que así podrás diferenciarlos fácilmente de los scripts de shell tradicionales.

Puntos Clave
  • Carga software con module load nombreDelSoftware.
  • Descarga software con module unload.
  • El sistema de módulos gestiona automáticamente el versionado del software y los conflictos entre paquetes.