====== Utilisation d'Apptainer ====== Cette page décrit comment utiliser Apptainer pour faire tourner un programme C utilisant la bibliothèque OpenBLAS sur le cluster. Elle couvre la création de l'image conteneur, sa construction sur votre machine personnelle, son transfert sur le cluster, et la soumission d'un job Slurm. OpenBLAS n'étant pas installé sur les nœuds de calcul, Apptainer permet d'embarquer la bibliothèque dans une image portable et de l'utiliser sans intervention de l'administrateur système. ===== Prérequis ===== * Avoir Apptainer installé sur sa machine Linux personnelle (voir [[https://apptainer.org/docs/user/latest/quick_start.html|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éé. Le fichier ''.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: /* Évitez de stocker les images ''.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) : /* bench_dgemm.c */ #include #include #include #include #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 --nodes=1 #SBATCH --ntasks=1 #SBATCH --cpus-per-task=1 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 dans le conteneur apptainer exec $IMG $BIN Adaptez le chemin des includes et des libs selon l'option choisie : * **Option A** (paquets Ubuntu) : ''-I/usr/include'' et ''-L/usr/lib/x86_64-linux-gnu'' * **Option B** (compilation depuis les sources) : ''-I/usr/local/include'' et ''-L/usr/local/lib'' Soumettez le job : sbatch bench_apptainer.sh Ensuite tout se déroule comme un job classique. ===== Références ===== * [[https://apptainer.org/docs/|Documentation officielle Apptainer]] * [[https://www.openblas.net/|Site officiel OpenBLAS]]