Fullmoon System

Déployer Open MPI : compilation, SSH, Slurm et validation des performances

EdwardMoon

Déployer Open MPI exige d'harmoniser compilateur, version d'Open MPI, bibliothèques d'exécution, transport réseau et intégration à l'ordonnanceur. Copier le même exécutable sur chaque nœud ne suffit pas. La validation progresse d'un petit programme jusqu'aux performances des communications.

Ce guide présente le choix entre paquets de distribution et archive officielle, les wrappers de compilation, le lancement SSH sans ordonnanceur, mpirun dans une allocation Slurm, PMIx, PRRTE, l'affinité CPU et la vérification d'UCX.

Déploiement Open MPI : wrappers de compilation, allocation Slurm, mpirun, PMIx, PRRTE et rangs MPI sur les nœuds de calcul
Compiler avec les wrappers, puis exécuter dans une allocation Slurm avec mpirun, PMIx et PRRTE

Choisir le modèle d'exécution

Environnement Lancement conseillé Prérequis
Développement sur un seul hôte mpirun -n Bibliothèques locales et emplacements disponibles
Petit cluster sans ordonnanceur mpirun + hostfile SSH, chemins identiques et vérification des clés d'hôte
Cluster Slurm en production mpirun dans l'allocation Compilation intégrée à Slurm et PMIx, et politique de ressources
Ne contournez pas l'ordonnanceur Slurm en production en utilisant des fichiers d'hôtes arbitraires et SSH pour accéder aux nœuds de calcul. Une exécution hors allocation compromet l'isolation du CPU, de la mémoire et des GPU ainsi que le suivi de l'utilisation des ressources par les jobs.

Paquets de distribution ou compilation depuis les sources

Les paquets de distribution simplifient les mises à jour et les dépendances, mais leur version ou leurs fonctions UCX et PMIx peuvent ne pas convenir. Examinez d'abord les paquets disponibles. Si des fonctions manquent, compilez l'archive de publication officielle d'Open MPI sous un préfixe distinct. Une archive de sources générée automatiquement par GitHub ne remplace pas cette archive officielle.

dnf info openmpi openmpi-devel
rpm -q openmpi openmpi-devel
module avail 2>&1 | grep -i mpi

Vérifier l'archive officielle et compiler sous un préfixe distinct

sha256sum -c openmpi-X.Y.Z.tar.bz2.sha256
tar -xjf openmpi-X.Y.Z.tar.bz2
cd openmpi-X.Y.Z

./configure   --prefix=/opt/openmpi/X.Y.Z   --with-slurm   --with-pmix   --with-ucx
make -j"$(nproc)"
make check
sudo make install

Dans le récapitulatif de configure, vérifiez que les fonctions demandées ont bien été détectées. Si les chemins UCX ou PMIx diffèrent, la détection automatique peut lier des bibliothèques différentes selon les nœuds. En production, distribuer un même paquet RPM construit à partir de cette compilation améliore la reproductibilité.

/opt/openmpi/X.Y.Z/bin/ompi_info --version
/opt/openmpi/X.Y.Z/bin/ompi_info --all   | grep -Ei 'slurm|pmix|prrte|ucx'
ldd /opt/openmpi/X.Y.Z/bin/mpirun

Modules d'environnement et cohérence entre nœuds

Harmoniser PATH ne suffit pas. Les en-têtes et bibliothèques utilisés par les wrappers, ainsi que les chemins de libmpi et des plugins à l'exécution, doivent correspondre sur tous les nœuds.

export PATH=/opt/openmpi/X.Y.Z/bin:$PATH
export LD_LIBRARY_PATH=/opt/openmpi/X.Y.Z/lib:$LD_LIBRARY_PATH

which mpicc
which mpirun
mpicc --showme:command
mpicc --showme:compile
mpicc --showme:link
ompi_info --version
for host in node01 node02 node03 node04; do
  ssh "$host" '/opt/openmpi/X.Y.Z/bin/ompi_info --version'
done
Les modules d'environnement facilitent le changement de version et la reproductibilité. Faites pointer PATH et les chemins des bibliothèques vers le préfixe d'une seule version et chargez-la explicitement dans les scripts de jobs.

Compiler un programme MPI minimal avec les wrappers

mpicc et mpicxx ne sont pas des compilateurs autonomes : ils ajoutent les options MPI nécessaires au compilateur C ou C++ choisi. Évitez d'assembler manuellement les chemins d'en-têtes et de bibliothèques avec gcc.

#include <mpi.h>
#include <stdio.h>

int main(int argc, char **argv) {
    int rank, size, name_len;
    char name[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Get_processor_name(name, &name_len);
    printf("rank=%d size=%d host=%s\n", rank, size, name);
    MPI_Finalize();
    return 0;
}
mpicc -O2 -Wall -Wextra hello_mpi.c -o hello_mpi
ldd ./hello_mpi | grep -E 'libmpi|open-rte|pmix'
mpirun -n 4 ./hello_mpi
N'exécutez pas Open MPI en tant que root. Même dans un conteneur, utilisez un compte dédié non privilégié et les limites de ressources de l'ordonnanceur. N'intégrez pas les options autorisant l'exécution root au standard de production.

Lancement SSH sur un cluster sans ordonnanceur

Réservez les fichiers hostfile aux clusters d'essai sans ordonnanceur. L'exécutable et les bibliothèques dynamiques doivent être présents aux mêmes chemins absolus sur tous les nœuds. Validez auparavant l'authentification SSH par clé et les clés d'hôte.

node01 slots=8
node02 slots=8
mpirun --hostfile hosts.txt   --map-by ppr:4:node   --bind-to core   ./hello_mpi

Ne lancez pas implicitement davantage de rangs que d'emplacements disponibles. La surallocation peut être volontaire pendant le développement, mais elle fausse les mesures de production et peut provoquer une pression mémoire.

Utiliser mpirun dans une allocation Slurm

Open MPI 5 recommande mpirun également dans un environnement Slurm. Au sein d'une allocation, mpirun lit les informations de nœuds et de tâches fournies par Slurm : il n'est donc pas nécessaire de répéter hostfile, –host ou -n.

#!/usr/bin/env bash
#SBATCH --job-name=mpi-smoke
#SBATCH --partition=compute
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=1
#SBATCH --time=00:05:00
#SBATCH --output=mpi-%j.out

set -euo pipefail
module purge
module load openmpi/X.Y.Z

echo "nodes=${SLURM_JOB_NODELIST} tasks=${SLURM_NTASKS}"
mpirun --bind-to core --map-by slot ./hello_mpi
JOB_ID=$(sbatch --parsable mpi-smoke.sbatch)
squeue --job "$JOB_ID"
sacct --jobs "$JOB_ID"   --format=JobID,State,Elapsed,AllocCPUS,ExitCode
cat "mpi-${JOB_ID}.out"

Choisir le lancement direct avec srun après vérification de PMIx

Le lancement direct avec srun est possible si Slurm et Open MPI sont compilés avec des versions compatibles de PMIx. Vérifiez d'abord les plugins disponibles et documentez un mode de lancement de référence pour le site, mpirun ou srun.

srun --mpi=list
ompi_info --all | grep -Ei 'pmix|slurm'
srun --mpi=pmix ./hello_mpi

Vérifier TCP, UCX et l'affinité CPU

TCP peut être utilisé sur Ethernet, et UCX sur InfiniBand ou RoCE. Avant d'imposer un transport, vérifiez la configuration détectée par Open MPI, l'état des cartes réseau, le MTU et les permissions des périphériques RDMA.

ompi_info --param pml all
ompi_info --param btl all
ompi_info --param osc all
ucx_info -d
ibv_devinfo
ip -br link
mpirun --report-bindings   --display-map   --bind-to core   --map-by slot   ./hello_mpi

Sur les nœuds avec SMT, NUMA ou GPU, mesurez les politiques map-by et bind-to selon le profil réel de l'application. Ne dépassez pas le nombre de cœurs physiques en supposant que davantage de rangs accélère nécessairement le calcul.

Séparer validation fonctionnelle et mesures de performance

  1. Vérifier l'initialisation et l'arrêt avec deux à quatre rangs sur un seul nœud.
  2. Exécuter un programme hello sur deux nœuds pour vérifier la résolution de noms et le démarrage des processus.
  3. Mesurer latence et bande passante avec un petit test ping-pong.
  4. Mesurer CPU, mémoire, réseau et passage à l'échelle avec des entrées réelles de l'application.
  5. Vérifier qu'aucun processus ne subsiste après une panne de nœud ou de carte réseau, ou après l'annulation d'un job.
mpirun -n 2 osu_latency
mpirun -n 2 osu_bw
sstat --jobs "${SLURM_JOB_ID}.batch"   --format=JobID,AveCPU,MaxRSS,AveRSS

Résoudre les problèmes Open MPI

mpirun --version
mpicc --showme
ompi_info --version
ldd ./hello_mpi
env | grep -E '^(PATH|LD_LIBRARY_PATH|OPAL|OMPI|PMIX|PRTE|SLURM)'
scontrol show job "$SLURM_JOB_ID"
hostnamectl --static
getent hosts node01
  • Si les versions de libmpi diffèrent, corriger les modules et LD_LIBRARY_PATH, puis redéployer la même compilation.
  • En cas d'échec du lancement distant, vérifier les clés d'hôte, SSH non interactif, les chemins identiques et le pare-feu.
  • Si un job Slurm vise des nœuds hors allocation, retirer hostfile et l'option –host.
  • Pour les erreurs UCX, examiner périphériques, pilotes, MTU, verrouillage mémoire et droits sur les périphériques dans les conteneurs.
  • En cas de performances insuffisantes, mesurer ensemble l'affinité CPU, NUMA, la surallocation et les communications applicatives.

Documentation officielle et articles associés

Un déploiement Open MPI est validé lorsque la même compilation, le respect des allocations, l'affinité CPU, le transport, le suivi des ressources et les performances réelles sont reproductibles. Documentez versions, modules, options de compilation et résultats des mesures afin de comparer les états avant et après chaque mise à jour.