Software
Descrizione del software disponibile sul cluster.
Da completare
Inserire moduli, compilatori, librerie, ambienti Python e software scientifico.
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:
PATHLD_LIBRARY_PATHCPATHLIBRARY_PATHMANPATH- variabili specifiche del software
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
- Utilizzare
module purgeall'inizio degli script batch quando si desidera un ambiente controllato. - Specificare la versione dei moduli quando è importante garantire la riproducibilità.
- Usare
module listper controllare l'ambiente prima di eseguire un'applicazione. - Inserire i
module loaddirettamente negli script Slurm anziché dipendere dalla configurazione della sessione di login. - Controllare con
module showcome un modulo modifica l'ambiente. - Evitare di combinare arbitrariamente compilatori, implementazioni MPI e librerie costruite con toolchain differenti.
- Usare
module usesoltanto quando è necessario aggiungere repository di modulefile ulteriori. - In caso di errore, ripartire da
module purge, caricare solamente i moduli necessari e controllare nuovamente l'ambiente conmodule 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.