Acceder a software a través de Módulos
Última actualización: 2026-02-17 | Mejora esta página
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:
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.
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.
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:
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.
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.
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
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.
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.
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).
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:
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
/)
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
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.
- 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.