Outils pour utilisateurs

Outils du site


apptainer

Ceci est une ancienne révision du document !


Utilisation d'Apptainer avec OpenBLAS

Cette page décrit comment créer et utiliser un conteneur Apptainer contenant OpenBLAS pour soumettre des jobs de calcul sur le cluster.

Prérequis

  • Avoir Apptainer installé sur sa machine Linux personnelle (voir documentation officielle)
  • Avoir accès au cluster via SSH

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
Compiler depuis les sources (Option B) permet d'utiliser exactement le même compilateur et les mêmes options que sur le cluster, ce qui est utile pour des benchmarks de performance.

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*

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:~/
É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 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
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.1774013772.txt.gz · Dernière modification : 2026/03/20 14:36 de admin