Outils pour utilisateurs

Outils du site


apptainer

Ceci est une ancienne révision du document !


Utilisation d'Apptainer

Cette page décrit comment créer et utiliser un conteneur Apptainer sur le cluster.

On donne ici un exemple complet que vous pouvez tester : programme C nécessitant OpenBLAS.

Prérequis

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:

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 --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
 
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

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
...

Références

apptainer.1774014561.txt.gz · Dernière modification : 2026/03/20 14:49 de admin