Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. hybrid model - izvršavanje korištenjem MPI implementacije u kontejneru
  2. bind model - izvršavanje korištenjem MPI implementacije izvan kontejnera

Na Supeku je preporučuje se koristiti bind model, zbog knjižnica koje osiguravaju integraciju sa sustavom za upravljanje PBS i mrežom Slingshot. Pri tom aplikacija koja koristi MPI mora biti ABI kompatibilna (kompajlirana sa MPICH verzija => v3.1 nadalje). Način na koji se to inače postiže je dopremanjem knjižnice libmpi.so.12 putem varijable okoliša LD_LIBRARY_PATH prije poziva aplikacije:

Code Block
languagebash
# postavljanje LD_LIBRARY_PATH
[korisnik@kompjuter] $ export LD_LIBRARY_PATH=/putanja/do/libmpi.so.12:$LD_LIBRARY_PATH

# izvršavanje aplikacijom mpiexec
[korisnik@kompjuter] $ mpiexec -np 10 ./moja_ABI_kompatibilna_MPI_aplikacija

U slučaju kontejnera, varijable okoliša se uglavnom nasljeđuju od računala s kojeg se pokreće, no u ovom slučaju potrebno je dodatno namjestiti okolinu što se može učiniti na dva načina:

  • korištenjem --env ili --env-file opcije pri pokretanju kontejnera
  • namještanjem APPTAINERENV_* varijable okoliša prije pozivanja kontejnera

Na Supeku je potrebno je koristiti bind model, zbog knjižnica koje osiguravaju integraciju sa sustavom za upravljanje PBS i mrežom Slingshot. Moduli koji osiguravaju spajanje definicijom varijabli okoliša CRAY_LD_LIBRARY_PATH i LD_LIBRARY_PATH su:

  • cray-pals - integracija Craya sa sustavom PBS Professional
  • cray-mpich-abi - dostavljanje ABI kompatibilnih knjižnica
  • cray-pmi - knjižnica za spajanje s Crayevim sučeljem za pokretanje paralelnih programa
  • libfabric - mrežni API za spajanje na Slinghot

Dodatno, pri pozivu se moraju spojiti odgovarajući direktoriji u kontejner:

  • /opt - putanja za knjižnice Cray
  • /run - putanja za PBS
  • /usr/lib64 - putanja za sistemske knjižnice

Pri podnošenju posla na Crayu, to se može učiniti na sljedeći način (primjerice, u skripti PBS mpi-test.sh) :

Code Block
languagebash
#!/bin/bash

#PBS -N mpi-test
#PBS -l select=2:ncpus=1
#PBS -l place=scatter

# dopremanje modula
module load PrgEnv-gnu
module load cray-mpich-abi
module load cray-pals
module load cray-pmi
module load libfabric

# namještanje okolišne varijable LD_LIBRARY_PATH u kontejneru:
#
#     1) CRAY_LD_LIBRARY_PATH        - Cray knjižnice iz /opt
#     2) LD_LIBRARY_PATH             - sistemske knjižnice iz /usr/lib64
#     3) \$LD_LIBRARY_PATH           - očuvanje varijable ako već postoji u kontejneru
#     4) /opt/cray/pe/pals/1.2.3/lib - putanja za PALS servis
#
export APPTAINERENV_LD_LIBRARY_PATH="${CRAY_LD_LIBRARY_PATH}:${LD_LIBRARY_PATH}:\$LD_LIBRARY_PATH:/opt/cray/pe/pals/1.2.3/lib"

# izvršavanje kontejnera mpi-test.sif s aplikacijom mpiexec modula cray-pals
mpiexec --no-transfer \
  apptainer exec \
    --bind /opt \
    --bind /run \
    --bind /usr/lib64 \
    mpi-test.sif \
      /myapp/mpi-test

...

) ili kompajlirana sa openMPI 5.x.x verzijom. Isto tako, potrebno je koristiti RHEL-8.6 kompatibilne linux distribucije.

Warning
titleOsnovni operativni sustav kontejnera

Zbog bind model spajanja, potrebno je koristiti operativne sustave koji su slični operativnom sustavu Supeka Red Hat Enterprise Linux 8.6.

Neki od mogućih su:

Kako bi korisnicima olakšali izgradnju kontejnera i pokretanje aplikacija sa bind modelom, pripremili smo početne slike kontejnera povrh kojih je moguće instalirati i kompajlirati aplikacije. Pripremljene slike sadrže MPICH i openMPI kompatibilne verzije sa MPI implementacijama dostupnim na Supeku. Osim slika, pripremljeni su i odgovarajući moduli koji će spojiti potrebne knjižnice i direktorije na Supeku sa kontejnerom.

U tablici su prikazane putanje slika za izgranju kontejnera i odgovarajući moduli ovisno o MPI implementaciji:

MPI kontejnerOS kontejnerMPI modelMPI SupekPolazni kontejnerBind modul
mpich-4.1.1Rocky-8Bindcray-mpich-8.1.26

/apps/utils/apptainer-images/rockylinux-8-mpich-4.1.1.sif

utils/apptainer-bind/cray-mpich

openMPI-5.0.1Rocky-8Bind

Openmpi- 5.0.1-gnu-8.5.0

/apps/utils/apptainer-images/rockylinux-8-openmpi-5.0.1.sif

utils/apptainer-bind/openmpi-5.0.1

openMPI-4.1.2Ubuntu-22.04Hybrid

OpenMPI 4.x.x

/apps/utils/apptainer-images/ubuntu-22.04-openmpi-4.1.2.sif

X


Primjer izgradnje kontejnera koristeći MPICH(v4.1.1) :

Code Block
languagebash
titlempi-test.sif
collapsetrue
Definicijska datoteka (recept)
Bootstrap: dockerlocalimage
From: rockylinux:8/apps/utils/apptainer-images/rockylinux-8-mpich-4.1.1.sif

%files

  #kopiranje datoteka
  mpi-test.latency.c /myapp/

%environment
     export LD_LIBRARY_PATH=/usr/lib64/mpich/lib:$LD_LIBRARY_PATH
  export PATH=/usr/lib64/mpich/bin:$PATH/testmpi/

%post

  # osvježi i instaliraj knjižnice za kompilaciju
  dnf update -y
  dnf install mpich-devel -y

  # namjesti okolinu za razvoj MPICHom
  export LD_LIBRARY_PATH=/usr/lib64/mpich/lib:$LD_LIBRARY_PATH
  export PATH=/usr/lib64/mpich/bin:$PATH
  
  # prevedi aplikaciju u izvršnu datoteku
  mpicc -o /myapp/mpi-test /myappprevedi aplikaciju u izvršnu datoteku
  mpicc     /testmpi/mpi.latency.c             -o /testmpi/mpi.latency
Code Block
languagebash
titlerun_cray-mpich.sh
#PBS -q cpu
#PBS -l select=2:ncpus=1
#PBS -l place=scatter

cd $PBS_O_WORKDIR

module load utils/apptainer-bind/cray-mpich

mpiexec --no-transfer apptainer exec mpich.sif /testmpi/mpi.latency/mpi-test.c
Code Block
languagec#
titlempi-test.latency.c
collapsetrue
// Author: Wes Kendall
// Copyright 2011 www.mpitutorial.com
// This code is provided freely with the tutorials on mpitutorial.com. Feel
// free to modify it for your own use. Any distribution of the code must
// either provide a link to www.mpitutorial.com or keep this header intact.
//
// An intro MPI hello world program that uses MPI_Init, MPI_Comm_size,
// MPI_Comm_rank, MPI_Finalize, and MPI_Get_processor_name.
//
#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
  // Initialize the MPI environment. The two arguments to MPI Init are not
  // currently used by MPI implementations, but are there in case future
  // implementations might need the arguments.
  MPI_Init(NULL, NULL);
  
  // Get the number of processes
  int world_size;
  MPI_Comm_size(MPI_COMM_WORLD, &world_size);
  
  // Get the rank of the process
  int world_rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

  // Get the name of the processor
  char processor_name[MPI_MAX_PROCESSOR_NAME];
  int name_len;
  MPI_Get_processor_name(processor_name, &name_len);

  // Print off a hello world message
  printf("Hello world from processor %s, rank %d out of %d processors\n",
         processor_name, world_rank, world_size);

  // Finalize the MPI environment. No more MPI calls can be made after this
  MPI_Finalize();
}
Warning
titleOsnovni operativni sustav kontejnera

Zbog bind model spajanja, potrebno je koristiti operativne sustave koji su slični operativnom sustavu Supeka Red Hat Enterprise Linux 8.6.

Neki od mogućih su:

  • Rocky Linux 8
  • AlmaLinux 8
  • CentOS Stream 8

    Grafički procesori i CUDA

    ...