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.
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
%labels
Author votre.email@exemple.fr
Version 1.0
Description Image HPC avec GCC 13 et OpenBLAS
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.).
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
%labels
Author votre.email@exemple.fr
Version 1.0
Description Image HPC avec GCC 13 et OpenBLAS compilé depuis les sources
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*
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 votrenom@cluster.exemple.fr:~/
.sif directement dans votre $HOME pour un usage
intensif en production. Préférez un espace de stockage rapide (scratch) si disponible.
Pour des tests ponctuels, le $HOME est suffisant.
4. Préparer le code source
Voici un exemple de programme C utilisant OpenBLAS (multiplication de matrices DGEMM) :
/* 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("DGEMM 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 ...