Ceci est une ancienne révision du document !
Table des matières
Utilisation d'Apptainer
Cette page décrit comment créer et utiliser un conteneur Apptainer sur le cluster.
Prérequis
- Avoir Apptainer installé sur sa machine Linux personnelle (voir documentation officielle)
1. Créer le fichier de définition (.def)
Le fichier `.def` est la recette de construction du conteneur. Il décrit le système de base et les logiciels à installer. Pour cet exemple on souhaite un conteneur qui peut compiler et faire tourner un code qui nécessite la bibliothèque OpenBLAS.
Créez un fichier openblas.def sur votre machine personnelle.
Option A — Installation via les paquets Ubuntu (recommandée)
Simple et rapide. Utilise la version d'OpenBLAS fournie par Ubuntu.
Bootstrap: docker
From: ubuntu:24.04
%post
apt-get update -y
apt-get install -y gcc-13 libopenblas-dev
%environment
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
Option B — Compilation d'OpenBLAS depuis les sources
Recommandée si vous souhaitez contrôler précisément les options de compilation (optimisations CPU, support multithread, etc.), ou que votre bibliothèque n'est pas dans les packages standard.
Bootstrap: docker
From: ubuntu:24.04
%post
apt-get update -y
apt-get install -y gcc-13 make wget tar
cd /tmp
wget https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.26/OpenBLAS-0.3.26.tar.gz
tar xzf OpenBLAS-0.3.26.tar.gz
cd OpenBLAS-0.3.26
make CC=gcc-13
make PREFIX=/usr/local install
%environment
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
2. Construire l'image sur sa machine personnelle
La construction de l'image nécessite les droits root. Elle doit donc être effectuée sur votre machine personnelle (Linux), et non sur le cluster.
sudo apptainer build openblas.sif openblas.def
La construction prend quelques minutes. À l'issue, un fichier openblas.sif est créé.
.sif est une image au format SquashFS — compressée, en lecture seule,
et totalement portable. Il contient un système Ubuntu complet avec GCC et OpenBLAS.
Vérifiez que l'image est correcte avant de la transférer :
apptainer exec openblas.sif gcc-13 --version apptainer exec openblas.sif ls /usr/lib/x86_64-linux-gnu/libopenblas*
La première commande doit afficher la version de GCC, par exemple :
gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
La seconde doit afficher le chemin de la bibliothèque OpenBLAS, par exemple :
/usr/lib/x86_64-linux-gnu/libopenblas.so /usr/lib/x86_64-linux-gnu/libopenblas.so.0
Si l'une des deux commandes retourne une erreur, l'image est incomplète — recommencez la construction.
3. Transférer l'image sur le cluster
Copiez l'image depuis votre machine personnelle vers votre répertoire de travail sur le cluster :
scp openblas.sif login@frontalhpc2025:
4. Préparer le code source
Voici un exemple de programme C utilisant OpenBLAS (multiplication de matrices) :
/* bench_dgemm.c */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <cblas.h> #define N 8192 int main() { openblas_set_num_threads(1); double *A = malloc(N * N * sizeof(double)); double *B = malloc(N * N * sizeof(double)); double *C = calloc(N * N, sizeof(double)); for (int i = 0; i < N * N; i++) { A[i] = (double)rand() / RAND_MAX; B[i] = (double)rand() / RAND_MAX; } struct timespec t0, t1; clock_gettime(CLOCK_MONOTONIC, &t0); cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, N, N, N, 1.0, A, N, B, N, 0.0, C, N); clock_gettime(CLOCK_MONOTONIC, &t1); double elapsed = (t1.tv_sec - t0.tv_sec) + (t1.tv_nsec - t0.tv_nsec) * 1e-9; double gflops = (2.0 * N * N * N) / elapsed / 1e9; printf("N=%d : %.3f s | %.2f GFLOPS\n", N, elapsed, gflops); free(A); free(B); free(C); return 0; }
Placez ce fichier dans votre répertoire de travail sur le cluster :
~/mon_projet/bench_dgemm.c
5. Soumettre le job Slurm
Créez le script de soumission bench_apptainer.sh :
#!/bin/bash #SBATCH --job-name=bench_apptainer #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --cpus-per-task=1 #SBATCH --account=votre_compte #SBATCH --output=bench_apptainer_%j.out #SBATCH --error=bench_apptainer_%j.err IMG=~/openblas.sif SRC=~/mon_projet/bench_dgemm.c BIN=~/mon_projet/bench_dgemm # Compilation dans le conteneur apptainer exec $IMG \ gcc-13 -O3 -march=native -o $BIN $SRC \ -I/usr/local/include \ -L/usr/local/lib \ -lopenblas \ -Wl,-rpath,/usr/local/lib # Exécution (10 runs) for i in $(seq 1 10); do echo -n "Run $i : " apptainer exec $IMG $BIN done
- Option A (paquets Ubuntu) :
-I/usr/includeet-L/usr/lib/x86_64-linux-gnu - Option B (compilation depuis les sources) :
-I/usr/local/includeet-L/usr/local/lib
Soumettez le job :
sbatch bench_apptainer.sh
Surveillez l'avancement :
squeue -u $USER
Consultez les résultats une fois le job terminé :
cat bench_apptainer_<jobid>.out
Résultats attendus
Run 1 : DGEMM N=8192 : xx.xxx s | xx.xx GFLOPS Run 2 : DGEMM N=8192 : xx.xxx s | xx.xx GFLOPS ...