Calculons !

Principe

Lancer un calcul sur la plateforme, c’est soumettre un « job » dans la file d’attente parmi celles disponibles. Cela implique la procédure suivante : 1 : Connexion au cluster -> 2 : Transfert de données ou édition d’un programme -> 3 : Création d’un script SBATCH de paramétrage -> 4 : Lancement du job.

Contexte

Les nœuds | Les files d’attentes (partitions)

Exemple d’un job monocore : monocore.slurm

Créer un fichier sbatch ici nommé monocore.slurm

#!/bin/bash                                                                                                      
#SBATCH --nodes=1
#SBATCH --partition=short
#SBATCH --ntasks-per-node=1
#SBATCH --time=00:10:00
#SBATCH --mail-type=ALL
#SBATCH --job-name=my_serial_job
#SBATCH --output=job_seq-%j.out
#SBATCH --mail-user=votre.mail@votre.domaine
#SBATCH --mem=5M
time sleep 30
hostname

Soumission du job

sbatch monocore.slurm

Demande d’un cœur de calcul sur un nœud et de 5 Mo pour 10 minutes. Envoi d’un mail à chaque étape de la vie du job.

Exemple d’un job MPI

hello_mpi.c

hello_mpi.c
#include <mpi.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv) {
    MPI_Init(NULL, NULL);
    int world_size, world_rank;
    char hostname[256];

    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    gethostname(hostname, 256);

    printf("Bonjour du rang %d sur la machine %s (Total: %d processus)\n",
           world_rank, hostname, world_size);

    MPI_Finalize();
    return 0;
}

Compilation de votre code

ml libs/ompi gcc libs/ucx
mpicc hello_mpi.c -o hello_mpi

Soumission du job

sbatch jobompi.slurm

jobompi.slurm

#!/bin/bash
#SBATCH --nodes=2
#SBATCH --partition=normal-amd ## fonctionne aussi avec --partition=normal
#SBATCH --ntasks-per-node=16
#SBATCH --time=00:10:00
#SBATCH --job-name=my_mpi_job
#SBATCH --output=mpi_job-%j.out
#SBATCH --mem=2G
#SBATCH --mail-type=ALL
#SBATCH --mail-user=votre.mail@domaine
ml libs/ompi gcc libs/ucx

# On peut forcer l'affichage des infos UCX pour vérifier que ça fonctionne
#export UCX_LOG_LEVEL=info

echo "Lancement avec srun :"
srun ./hello_mpi

Example d’un job openMP

omp.cc

#include <iostream>
#include <omp.h>

int main() {
    // Cette directive demande au compilateur de paralléliser la section
    #pragma omp parallel
    {
        int id = omp_get_thread_num();
        int total = omp_get_num_threads();
        
        #pragma omp critical
        std::cout << "Thread " << id << " sur " << total << " est prêt !" << std::endl;
    }
    return 0;
}

Compilation de votre code

ml gcc
g++ -O3 -fopenmp omp.cc -o omp

job_openMP.slurm

#!/bin/bash                                                                                                 

#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=8
#SBATCH --time=00:10:00
#SBATCH --job-name=my_openmp_job
#SBATCH --mem=16M

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
./omp

Soumission du job

sbatch job_openMP.slurm

Utiliser les GPUs

gpu.sh

#!/bin/sh
#SBATCH --job-name=testGPU 
#SBATCH --partition=bigpu 
#SBATCH --gres=gpu:2 
#SBATCH --time=0:10:00 
#SBATCH --mail-type=ALL 
#SBATCH --output=job-%j.out 
#SBATCH --mem=60G 
#SBATCH --nodes=1 
#SBATCH --ntasks-per-node=40

hostname
nvidia-smi  # La commande nvidia-smi permet de voir l'usage des GPUs.

Soumission du job

sbatch gpu.sh

Ici gres=gpu:2 permet d’utiliser 2 GPU.

Mode interactif

Sur un nœud GPU

srun --ntasks=1 --mem=4G --gres=gpu:1 --time=1:00:00 --partition=bigpu --pty /bin/bash

Sur un nœud CPU (10 cœurs)

srun --ntasks=10 --mem=12G --time=1:00:00 --partition=short --pty /bin/bash