Unimore HPC Wiki

LYRALOGIN · Software

Utilizzo dei moduli software in un cluster HPC

Introduzione

Nei cluster HPC è comune utilizzare un sistema di Environment Modules per rendere disponibili compilatori, librerie e applicazioni scientifiche senza installarle direttamente nell'ambiente personale dell'utente.

Un modulo modifica in modo controllato le variabili d'ambiente della shell. A seconda del software può, ad esempio, aggiornare:

Questo permette di mantenere installate contemporaneamente più versioni dello stesso programma e di scegliere esplicitamente quale utilizzare.


Il comando module

La gestione avviene principalmente attraverso il comando:

module

Per visualizzare l'help:

module help

oppure:

module --help

I comandi disponibili possono variare leggermente in funzione dell'implementazione installata sul cluster, ad esempio Lmod o Environment Modules.


Visualizzare i moduli disponibili

Per visualizzare i moduli software disponibili:

module avail

L'output può contenere, ad esempio:

gcc/11.3.0
openmpi/4.1.5
python/3.11
cuda/12.0
matlab/R2023b

Le versioni effettivamente disponibili dipendono dal software installato sul cluster.


Caricare un modulo: module load

Per rendere disponibile un software si utilizza:

module load nome_modulo

Esempio:

module load gcc/11.3.0

Per caricare più moduli:

module load gcc/11.3.0
module load openmpi/4.1.5

oppure, se supportato dalla configurazione:

module load gcc/11.3.0 openmpi/4.1.5

Dopo il caricamento, il modulo modifica le variabili d'ambiente necessarie affinché comandi, librerie e altri componenti del software siano raggiungibili.


Verificare i moduli caricati: module list

Per sapere quali moduli sono attivi nella sessione corrente:

module list

È particolarmente utile prima di compilare un programma o lanciare un job Slurm, perché consente di verificare l'ambiente software effettivamente in uso.


Rimuovere un modulo: module unload

Per rimuovere un singolo modulo dall'ambiente:

module unload nome_modulo

Esempio:

module unload gcc/11.3.0

Il sistema rimuove dall'ambiente le modifiche associate al modulo.


Pulire completamente l'ambiente: module purge

Per rimuovere tutti i moduli attualmente caricati:

module purge

Una pratica utile negli script HPC consiste nel partire da un ambiente pulito:

module purge
module load gcc/11.3.0
module load openmpi/4.1.5

In questo modo lo script dichiara esplicitamente i moduli software necessari e riduce la dipendenza dall'ambiente interattivo dell'utente.


Cercare un modulo

Con molte installazioni è possibile filtrare module avail, ad esempio:

module avail gcc

oppure:

module avail python

Con Lmod è normalmente disponibile anche:

module spider nome_modulo

Esempio:

module spider cuda

module spider è particolarmente utile con gerarchie di moduli, perché può mostrare anche software che diventa disponibile soltanto dopo il caricamento di altri moduli.


Visualizzare cosa modifica un modulo: module show

Prima di caricare un modulo è possibile ispezionarne la configurazione:

module show nome_modulo

Esempio:

module show gcc/11.3.0

A seconda del sistema, può essere disponibile anche:

module display nome_modulo

Questi comandi permettono di vedere le modifiche che il modulefile applica all'ambiente.


module use e MODULEPATH

I modulefile vengono cercati nei percorsi definiti dalla variabile:

MODULEPATH

Per visualizzarla:

echo $MODULEPATH

Il comando:

module use /percorso/dei/moduli

aggiunge un'altra directory al percorso in cui il sistema cerca i modulefile.

Esempio:

module use $HOME/modules
module avail

Questo può essere utile per utilizzare modulefile personali o raccolte di moduli collocate in directory aggiuntive.

Per rimuovere un percorso aggiunto tramite module use, se supportato dall'implementazione:

module unuse /percorso/dei/moduli

Moduli e variabili d'ambiente

Un modulefile non è semplicemente un alias per avviare un'applicazione. Il suo scopo è modificare l'ambiente della shell.

Ad esempio, prima di caricare un software:

which gcc

Dopo:

module load gcc/11.3.0
which gcc
gcc --version

Per verificare le variabili:

echo $PATH
echo $LD_LIBRARY_PATH
echo $MODULEPATH

module show consente di capire quali variabili vengono modificate da uno specifico modulo.


Cambiare versione di un software

Se sono disponibili più versioni:

gcc/10.4.0
gcc/11.3.0
gcc/12.2.0

è possibile rimuovere quella attiva e caricarne un'altra:

module unload gcc/11.3.0
module load gcc/12.2.0

Alcuni sistemi supportano anche comandi come module switch o module swap:

module swap gcc/11.3.0 gcc/12.2.0

La sintassi disponibile va verificata con:

module help

Moduli e dipendenze

In un cluster HPC può essere necessario caricare i moduli in un ordine coerente con le dipendenze del software.

Un esempio tipico è:

module purge
module load gcc/11.3.0
module load openmpi/4.1.5

Una libreria MPI può infatti essere compilata utilizzando uno specifico compilatore. Utilizzare combinazioni incompatibili può causare errori di compilazione, linking o esecuzione.

È quindi buona pratica verificare sempre:

module list

prima di compilare o eseguire un'applicazione.


Utilizzo dei moduli in uno script Slurm

I moduli dovrebbero essere caricati direttamente nello script batch, rendendo esplicito l'ambiente software richiesto dal job.

Esempio:

#!/bin/bash
#SBATCH --job-name=test
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --time=00:30:00

module purge
module load gcc/11.3.0
module load openmpi/4.1.5

module list

srun ./programma

Il principio importante è che lo script specifichi in maniera riproducibile l'ambiente necessario al programma.

Esempio con Python

#!/bin/bash
#SBATCH --job-name=python-test
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --time=00:30:00

module purge
module load python/3.11

python --version
python programma.py

Le versioni riportate negli esempi sono illustrative e devono essere sostituite con quelle realmente disponibili sul cluster, verificabili tramite module avail.


Procedura consigliata

Una sequenza pratica per lavorare con i moduli è:

1. Pulire l'ambiente

module purge

2. Cercare il software

module avail

oppure:

module avail nome_software

3. Caricare la versione desiderata

module load nome_software/versione

4. Controllare i moduli attivi

module list

5. Verificare l'eseguibile

which nome_software

6. Verificare la versione

nome_software --version

7. Eseguire il programma

In modalità interattiva oppure tramite uno script Slurm, in base alle regole del cluster.


Comandi principali

Comando Funzione
module avail Mostra i moduli disponibili
module load MODULO Carica un modulo
module list Mostra i moduli attualmente caricati
module unload MODULO Rimuove un modulo
module purge Rimuove tutti i moduli caricati
module show MODULO Mostra cosa modifica un modulo
module use PATH Aggiunge una directory a MODULEPATH
module unuse PATH Rimuove un percorso da MODULEPATH, se supportato
module help Mostra l'help del sistema di moduli

Buone pratiche in ambiente HPC

  1. Utilizzare module purge all'inizio degli script batch quando si desidera un ambiente controllato.
  2. Specificare la versione dei moduli quando è importante garantire la riproducibilità.
  3. Usare module list per controllare l'ambiente prima di eseguire un'applicazione.
  4. Inserire i module load direttamente negli script Slurm anziché dipendere dalla configurazione della sessione di login.
  5. Controllare con module show come un modulo modifica l'ambiente.
  6. Evitare di combinare arbitrariamente compilatori, implementazioni MPI e librerie costruite con toolchain differenti.
  7. Usare module use soltanto quando è necessario aggiungere repository di modulefile ulteriori.
  8. In caso di errore, ripartire da module purge, caricare solamente i moduli necessari e controllare nuovamente l'ambiente con module list.

Esempio completo

# Rimuove eventuali moduli precedentemente caricati
module purge

# Visualizza le versioni disponibili
module avail gcc
module avail openmpi

# Carica compilatore e MPI
module load gcc/11.3.0
module load openmpi/4.1.5

# Controlla l'ambiente
module list
which gcc
which mpirun

# Controlla le versioni
gcc --version
mpirun --version

# Esegue l'applicazione tramite Slurm
srun ./programma_mpi

Questa impostazione rende esplicito e più facilmente riproducibile l'ambiente software utilizzato dal job HPC.