Environment modules#
Modules permite el cambio rápido de un entorno a otro porque nos deja cargar o borrar las variables necesarios para un programa ejecutando un comando sencillo y avisa si hay conflictos entre un entorno ya definido con otro que el usuario quiere cargar.
Una vez instalado, es fácil definir los entornos, consiste básicamente en crear los diferentes ficheros en modulefiles como podemos ver en el vídeo
Los modulefiles están escritos en Tcl (Tool Command Language) y son interpretados por el modulecmd que se ejecuta cada vez que invocamos module
Debe inicializarse con el login de los usuarios según la shell que se usa
source /usr/share/modules/init/bash
Especifica variables como el MODULESHOME o MODULEPATH
Los comandos básicos de la herramienta son:
module avail # Muestra los módulos de entornos de programas disponibles
module load # Carga el entorno del programa <prog> de la versión por defecto
module load # Carga el entorno del programa <prog> de la versión <vers>
module list # Muestra los módulos cargados actualmente
module unload # Quita el entorno del <prog>
module show # Muestra el entorno que define el módulo
module whatis # información que aparecerá al usar module whatis modulefile
Configuración de environment modules: instalamos en el servidor :
apt-get install environment-modules
Podemos comprobar que se ha instalado
tunombre1@compute-0-0:~$ module avail
------------------------ /usr/share/modules/modulefiles ------------------------
dot module-git module-info modules null use.own
Vamos a crear un nuevo modulo
root@compute-0-0:/usr/share/modules/modulefiles# cat test
#%Module
##
## test modulefile
##
##
proc ModulesHelp { } {
global version modroot
puts stderr "\ttest carga nada"
}
module-whatis "Entorno para test"
prepend-path PATH /export/apps/test/bin
root@compute-0-0:~# cat /export/apps/test/bin/test.x
echo hola $(whoami)
echo hoy es $(date)
Podemos comprobar que se ha cargado
tunombre1@compute-0-0:~$ module avail
------------------------ /usr/share/modules/modulefiles ------------------------
dot module-git module-info modules null test use.own
tunombre1@compute-0-0:~$ module whatis test
------------------------ /usr/share/modules/modulefiles ------------------------
test: Entorno para test
tunombre1@compute-0-0:~$ module help test
-------------------------------------------------------------------
Module Specific Help for /usr/share/modules/modulefiles/test:
test carga nada
-------------------------------------------------------------------
tunombre1@compute-0-0:~$ text.x
text.x: command not found
tunombre1@compute-0-0:~$ module list
No Modulefiles Currently Loaded.
tunombre1@compute-0-0:~$ module load test
tunombre1@compute-0-0:~$ module list
Currently Loaded Modulefiles:
1) test
tunombre1@compute-0-0:~$ test.x
hola tunombre1
hoy es vie 14 abr 2023 10:21:49 UTC
tunombre1@compute-0-0:~$ module rm test
tunombre1@compute-0-0:~$ module list
No Modulefiles Currently Loaded.
tunombre1@compute-0-0:~$ test.x
test.x: command not found
Ahora vamos a lanzarlo al sistema de colas con sbatch:
tunombre1@compute-0-0:~$ cat script.sh
#!/bin/bash
#SBATCH --job-name=serial_job_test # Job name
#SBATCH --ntasks=1 # Run on a single CPU
#SBATCH --partition=debug
#SBATCH --time=00:05:00 # Time limit hrs:min:sec
#SBATCH --output=serial_test_%j.log # Standard output and error log
module load test
pwd > salida
hostname >> salida
test.x >> salida
tunombre1@compute-0-0:~$ sbatch script.sh
Submitted batch job 10
tunombre1@compute-0-0:~$ cat salida
/home/tunombre1
compute-0-1
tunombre1@compute-0-0:~$ cat serial_test_10.log
tunombre1@compute-0-0:~$ cat salida
/var/lib/slurm/slurmd/job00010/slurm_script: line 12: test.x: command not found
como podemos ver, no se encuentra el ejecutable test.x, para que funcione tenemos que exportar a los nodos /export/app, instalar los environment-modules en los nodos y copiar su configuración:
root@compute-0-0:~$ scp /usr/share/modules/modulefiles/test compute-0-1:/usr/share/modules/modulefiles/test
root@compute-0-0:~$ tail -5 /etc/exports
/home/tunombre1 172.16.0.12(rw,sync,no_root_squash,no_subtree_check)
/home/tunombre1 172.16.0.13(rw,sync,no_root_squash,no_subtree_check)
/home/tunombre1 172.16.0.14(rw,sync,no_root_squash,no_subtree_check)
/export 172.16.0.10(rw,async,no_root_squash) 172.16.0.0/255.255.255.0(rw,async)
/export/apps *(rw,async,no_root_squash)
root@compute-0-1:~$ tail -4 /etc/auto.master
#
+auto.master
/home /etc/auto.home
/export /etc/auto.share --timeout=1200
root@compute-0-1:~$ tail -4 /etc/auto.home
* compute-0-0:/home/&
root@compute-0-1:~$ tail -4 /etc/auto.share
apps compute-0-0:/export/&
Volvemos a lanzar el proceso y comprobamos que ahora si existe el comando test.x
tunombre1@compute-0-0:~$ sbatch script.sh
Submitted batch job 11
tunombre1@compute-0-0:~$ cat salida
/home/tunombre1
compute-0-1
hola tunombre1
hoy es vie 14 abr 2023 10:23:51 UTC
#No hace falta tenerlo cargado en el nodo principal
tunombre1@compute-0-0:~$ module list
No Modulefiles Currently Loaded.