Spack

Spack rappresenta uno strumento avanzato di gestione dei pacchetti, mirato a supportare simultaneamente diverse versioni e configurazioni di software su una vasta gamma di piattaforme e ambienti. In particolare, è stato appositamente progettato per rispondere alle esigenze dei grandi centri di supercalcolo, in cui numerosi utenti e team applicativi condividono installazioni comuni di software su cluster caratterizzati da architetture non convenzionali e l’utilizzo di librerie prive di un’ABI standardizzata. Un aspetto distintivo di Spack è la sua natura non distruttiva: l’installazione di una nuova versione non interferisce con le installazioni preesistenti, consentendo così la coesistenza di molteplici configurazioni sullo stesso sistema.

Amministrazione

L’ambiente Spack può essere ottenuto via git

git clone --depth=100 --branch=releases/v0.21 https://github.com/spack/spack.git spack

Una volta clonato, è possibile caricare l’ambiente con

cd spack
. share/spack/setup-env.sh

Adesso possiamo visualizzare quali sono i compilatori già installti sul sistema e quelli disponibili:

spack compiler find
spack compilers

Impieghiamo Spack sul cluster per l’installazione del software e la generazione di module file per Environment Modules.

Nello specifico, configuriamo la generazione dei moduli tramite il file di configurazione dei moduli in /mnt/raid/software/spack/etc/spack/modules.yaml

modules:
  default:
    enable:
      - tcl
    tcl:
      hash_length: 0
      include:
        -  gcc
      exclude_implicits: true
      projections:
        all: '{name}/{version}-{compiler.name}-{compiler.version}'
        gcc: '{name}/{version}'
        ^mpi: '{name}/{version}-{^mpi.name}-{^mpi.version}-{compiler.name}-{compiler.version}'
      all:
        conflict:
          - '{name}'
        autoload: direct

Per aggiornare i moduli si può usare il comando

spack module tcl refresh --delete-tree -y

Per rendere disponibili i file di modulo su tutti i nodi è necessario aggiungere il path alla configurazione di sistema. Questo può essere fatto creando il file addspackmodulepath.sh:

#!/bin/bash

apt-get install -y environment-modules

echo '/mnt/raid/software/spack/share/spack/modules/linux-ubuntu20.04-aarch64/ # Spack Modules' >> /etc/environment-modules/modulespath

ed eseguendo

./runsetup.sh addspackmodulepath.sh

Utenza

Per l’utenza la presenza di Spack è virtualmente invisibile, ciò a cui gli utenti hanno accesso sono i file di modulo per il caricamento nell’ambiente del software installato.

Si possono investigare i moduli disponibili con il comando

module avail

e caricare nell’ambiente con il comando

module load programma/versione-compilatore

o rimuovere con

module unload programma/versione-compilatore

Un ambiente pulito può essere ottenuto con il comando

module purge

È importante che si faccia uso sempre di catene di moduli compatibili, ovvero di moduli (software) generato/compilato con il medesimo compilatore. Altrimenti si rischia la creazione di ambienti inconsistenti e impossibili da usare. I file di modulo sono generati in modo da richiedere il caricamento delle dipendenze dirette che sono state usate nella loro creazione, tipicamente dipendenze sulla implementazione di MPI scelta (OpenMPI o MPICH).

Esempio: carichiamo un diverso compilatore, al login la richiesta

gcc --version

risponderà

gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Eseguiamo il comando

module load gcc/12.3.0

seguito da

gcc --version

che ora ci risponderà

gcc (Spack GCC) 12.3.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.