Configurare MPI per HPC

Attenzione

Questo articolo fa riferimento a CentOS, una distribuzione Linux vicina allo stato end of life (EOL). Prendere in considerazione l'uso e la pianificazione di conseguenza. Per altre informazioni, vedere le linee guida per la fine della vita di CentOS.

Si applica a: ✔️ Macchine virtuali ✔️ Linux Macchine virtuali ✔️ Windows Set di scalabilità flessibili Set ✔️ di scalabilità uniformi

Message Passing Interface (MPI) è una libreria aperta e uno standard de facto per la parallelizzazione della memoria distribuita. Viene comunemente usato in molti carichi di lavoro HPC. I carichi di lavoro HPC nelle macchine virtuali serie HB e serie N compatibili conRDMA possono usare MPI per comunicare tramite la rete InfiniBand a bassa latenza e larghezza di banda elevata.

  • Le dimensioni delle macchine virtuali abilitate per SR-IOV in Azure consentono l'uso di quasi qualsiasi tipo di MPI con Mellanox OFED.
  • Nelle macchine virtuali non abilitate per SR-IOV, le implementazioni MPI supportate usano l'interfaccia Microsoft Network Direct (ND) per comunicare tra macchine virtuali. Di conseguenza, sono supportate solo le versioni microsoft MPI (MS-MPI) 2012 R2 o successive e Intel MPI 5.x. Le versioni successive (2017, 2018) della libreria di runtime Intel MPI potrebbero essere o meno compatibili con i driver RDMA di Azure.

Per le macchine virtuali con supporto per SR-IOV abilitate per RDMA, sono appropriate le immagini di vm Ubuntu-HPC e AlmaLinux-HPC. Queste immagini di macchina virtuale sono ottimizzate e pre-caricate con i driver OFED per RDMA e varie librerie MPI di uso comune e pacchetti di elaborazione scientifica e sono il modo più semplice per iniziare.

Anche se gli esempi sono per RHEL/CentOS, ma i passaggi sono generali e possono essere usati per qualsiasi sistema operativo Linux compatibile, ad esempio Ubuntu (18.04, 20.04, 22.04) e SLES (12 SP4 e 15 SP4). Altri esempi per la configurazione di altre implementazioni MPI in altre distribuzioni sono disponibili nel repository azhpc-images.

Nota

L'esecuzione di processi MPI in macchine virtuali abilitate per SR-IOV con determinate librerie MPI (ad esempio MPI della piattaforma) può richiedere la configurazione di chiavi di partizione (p-keys) in un tenant per l'isolamento e la sicurezza. Seguire la procedura descritta nella sezione Individuare le chiavi di partizione per informazioni dettagliate su come determinare i valori p-key e impostarli correttamente per un processo MPI con tale libreria MPI.

Nota

I frammenti di codice seguenti sono esempi. È consigliabile usare le versioni stabili più recenti dei pacchetti o fare riferimento al repository azhpc-images.

Scelta della libreria MPI

Se un'applicazione HPC consiglia una specifica libreria MPI, provare prima di tutto tale versione. Se si dispone di flessibilità per quanto riguarda l'MPI che è possibile scegliere e si vuole ottenere prestazioni ottimali, provare HPC-X. Nel complesso, HPC-X MPI offre prestazioni ottimali usando il framework UCX per l'interfaccia InfiniBand e sfrutta tutte le funzionalità hardware e software Mellanox InfiniBand. Inoltre, HPC-X e OpenMPI sono compatibili con ABI, quindi è possibile eseguire dinamicamente un'applicazione HPC con HPC-X compilata con OpenMPI. Analogamente, Intel MPI, MVAPICH e MPICH supportano ABI.

La figura seguente illustra l'architettura per le librerie MPI più diffuse.

Architettura per le librerie MPI più diffuse

HPC-X

Il toolkit software HPC-X contiene UCX e HCOLL e può essere compilato con UCX.

HPCX_VERSION="v2.6.0"
HPCX_DOWNLOAD_URL=https://azhpcstor.blob.core.windows.net/azhpc-images-store/hpcx-v2.6.0-gcc-MLNX_OFED_LINUX-5.0-1.0.0.0-redhat7.7-x86_64.tbz
wget --retry-connrefused --tries=3 --waitretry=5 $HPCX_DOWNLOAD_URL
tar -xvf hpcx-${HPCX_VERSION}-gcc-MLNX_OFED_LINUX-5.0-1.0.0.0-redhat7.7-x86_64.tbz
mv hpcx-${HPCX_VERSION}-gcc-MLNX_OFED_LINUX-5.0-1.0.0.0-redhat7.7-x86_64 ${INSTALL_PREFIX}
HPCX_PATH=${INSTALL_PREFIX}/hpcx-${HPCX_VERSION}-gcc-MLNX_OFED_LINUX-5.0-1.0.0.0-redhat7.7-x86_64

Il comando seguente illustra alcuni argomenti mpirun consigliati per HPC-X e OpenMPI.

mpirun -n $NPROCS --hostfile $HOSTFILE --map-by ppr:$NUMBER_PROCESSES_PER_NUMA:numa:pe=$NUMBER_THREADS_PER_PROCESS -report-bindings $MPI_EXECUTABLE

dove:

Parametro Descrizione
NPROCS Specifica il numero di processi MPI. Ad esempio: -n 16.
$HOSTFILE Specifica un file contenente il nome host o l'indirizzo IP, per indicare il percorso in cui vengono eseguiti i processi MPI. Ad esempio: --hostfile hosts.
$NUMBER_PROCESSES_PER_NUMA Specifica il numero di processi MPI eseguiti in ogni dominio NUMA. Per specificare, ad esempio, quattro processi MPI per NUMA, usare --map-by ppr:4:numa:pe=1.
$NUMBER_THREADS_PER_PROCESS Specifica il numero di thread per ogni processo MPI. Per specificare, ad esempio, un processo MPI e quattro thread per NUMA, usare --map-by ppr:1:numa:pe=4.
-report-bindings Stampa il mapping tra processi MPI e core, che risulta utile per verificare che l'aggiunta dei processi MPI sia corretta.
$MPI_EXECUTABLE Specifica il collegamento creato dall'eseguibile MPI nelle librerie MPI. I wrapper del compilatore MPI eseguono questa operazione automaticamente. Ad esempio, mpicc o mpif90.

Un esempio di esecuzione del microbenchmark di latenza OSU è il seguente:

${HPCX_PATH}mpirun -np 2 --map-by ppr:2:node -x UCX_TLS=rc ${HPCX_PATH}/ompi/tests/osu-micro-benchmarks-5.3.2/osu_latency

Ottimizzazione dei collettivi MPI

Le primitive di comunicazione collettiva MPI offrono un modo flessibile e portatile per implementare le operazioni di comunicazione di gruppo. Vengono ampiamente usati in varie applicazioni parallele scientifiche e hanno un impatto significativo sulle prestazioni complessive dell'applicazione. Vedere l'articolo TechCommunity per informazioni dettagliate sui parametri di configurazione per ottimizzare le prestazioni delle comunicazioni collettive usando HPC-X e la libreria HCOLL per la comunicazione collettiva.

Ad esempio, se si sospetta che l'applicazione MPI strettamente associata stia eseguendo una quantità eccessiva di comunicazione collettiva, è possibile provare ad abilitare i collettivi gerarchici (HCOLL). Per abilitare tali funzionalità, usare i parametri seguenti.

-mca coll_hcoll_enable 1 -x HCOLL_MAIN_IB=<MLX device>:<Port>

Nota

Con HPC-X 2.7.4+, potrebbe essere necessario passare in modo esplicito LD_LIBRARY_PATH se la versione UCX in MOFED e quella in HPC-X è diversa.

OpenMPI

Installare UCX come descritto in precedenza. HCOLL fa parte del toolkit software HPC-X e non richiede un'installazione speciale.

OpenMPI può essere installato dai pacchetti disponibili nel repository.

sudo yum install –y openmpi

È consigliabile creare una versione stabile più recente di OpenMPI con UCX.

OMPI_VERSION="4.0.3"
OMPI_DOWNLOAD_URL=https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-${OMPI_VERSION}.tar.gz
wget --retry-connrefused --tries=3 --waitretry=5 $OMPI_DOWNLOAD_URL
tar -xvf openmpi-${OMPI_VERSION}.tar.gz
cd openmpi-${OMPI_VERSION}
./configure --prefix=${INSTALL_PREFIX}/openmpi-${OMPI_VERSION} --with-ucx=${UCX_PATH} --with-hcoll=${HCOLL_PATH} --enable-mpirun-prefix-by-default --with-platform=contrib/platform/mellanox/optimized && make -j$(nproc) && make install

Per ottenere prestazioni ottimali, eseguire OpenMPI con ucx e hcoll. Vedere anche l'esempio con HPC-X.

${INSTALL_PREFIX}/bin/mpirun -np 2 --map-by node --hostfile ~/hostfile -mca pml ucx --mca btl ^vader,tcp,openib -x UCX_NET_DEVICES=mlx5_0:1  -x UCX_IB_PKEY=0x0003  ./osu_latency

Controllare la chiave di partizione come indicato in precedenza.

Intel MPI

Scarica la tua scelta di versione di Intel MPI. La versione Intel MPI 2019 è stata spostata dal framework Open Fabrics Alliance (OFA) al framework di Open Fabric Interfaces (OFI) e attualmente supporta libfabric. Sono disponibili due provider per il supporto InfiniBand: mlx e verbs. Modificare la variabile di ambiente I_MPI_FABRICS in base alla versione.

  • Intel MPI 2019 e 2021: usare I_MPI_FABRICS=shm:ofi, I_MPI_OFI_PROVIDER=mlx. Il mlx provider usa UCX. È stato rilevato che l'utilizzo dei verbi è instabile e meno efficiente. Per altri dettagli, vedere l'articolo TechCommunity.
  • Intel MPI 2018: uso I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: uso I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Ecco alcuni argomenti mpirun suggeriti per Intel MPI 2019 update 5+.

export FI_PROVIDER=mlx
export I_MPI_DEBUG=5
export I_MPI_PIN_DOMAIN=numa

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

dove:

Parametro Descrizione
FI_PROVIDER Specifica il provider libfabric da usare, che influirà sull'API, sul protocollo e sulla rete usata. verbi è un'altra opzione, ma in genere mlx offre prestazioni migliori.
I_MPI_DEBUG Specifica il livello di output di debug aggiuntivo, che può fornire informazioni dettagliate sulla posizione in cui vengono aggiunti i processi e su quale protocollo e rete vengono usati.
I_MPI_PIN_DOMAIN Specifica il modo in cui si vogliono aggiungere i processi. È, ad esempio, possibile aggiungerli a core, socket o domini NUMA. In questo esempio questa variabile di ambiente viene impostata su numa, il che significa che i processi verranno aggiunti ai domini del nodo NUMA.

Ottimizzazione dei collettivi MPI

Sono disponibili altre opzioni che è possibile provare, soprattutto se le operazioni collettive utilizzano tempo notevole. Intel MPI 2019 update5+ supporta il provider mlx e usa il framework UCX per comunicare con InfiniBand. Supporta anche HCOLL.

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

Macchine virtuali non SR-IOV

Per le macchine virtuali non SR-IOV, un esempio di download della versione di valutazione gratuita di runtime 5.x è il seguente:

wget http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/9278/l_mpi_p_5.1.3.223.tgz

Per la procedura di installazione, vedere Intel MPI Library installation guide (Guida all'installazione di Intel MPI Library). Facoltativamente, è possibile abilitare ptrace per i processi non radice non del debugger (necessari per le versioni più recenti di Intel MPI).

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

SUSE Linux

Per su edizione Standard versioni delle immagini delle macchine virtuali Linux Enterprise Server - SLES 12 SP3 per HPC, SLES 12 SP3 per HPC (Premium), SLES 12 SP1 per HPC, SLES 12 SP1 per HPC (Premium), SLES 12 SP4 e SLES 15, i driver RDMA vengono installati e i pacchetti Intel MPI vengono distribuiti nella macchina virtuale. Installare Intel MPI eseguendo il comando seguente:

sudo rpm -v -i --nodeps /opt/intelMPI/intel_mpi_packages/*.rpm

MVAPICH

Di seguito è riportato un esempio di compilazione di MVAPICH2. Si noti che le versioni più recenti potrebbero essere disponibili rispetto a quelle usate di seguito.

wget http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.3.tar.gz
tar -xv mvapich2-2.3.tar.gz
cd mvapich2-2.3
./configure --prefix=${INSTALL_PREFIX}
make -j 8 && make install

Un esempio di esecuzione del microbenchmark di latenza OSU è il seguente:

${INSTALL_PREFIX}/bin/mpirun_rsh -np 2 -hostfile ~/hostfile MV2_CPU_MAPPING=48 ./osu_latency

L'elenco seguente contiene alcuni argomenti consigliati di mpirun.

export MV2_CPU_BINDING_POLICY=scatter
export MV2_CPU_BINDING_LEVEL=numanode
export MV2_SHOW_CPU_BINDING=1
export MV2_SHOW_HCA_BINDING=1

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

dove:

Parametro Descrizione
MV2_CPU_BINDING_POLICY Specifica i criteri di associazione da usare, che influiscono sull'aggiunta dei processi agli ID core. In questo caso, si specifica scatter, in modo che i processi vengano sparsi uniformemente tra i domini NUMA.
MV2_CPU_BINDING_LEVEL Specifica la posizione in cui aggiungere i processi. In questo caso, è necessario impostarlo su numanode, ovvero i processi vengono aggiunti alle unità di domini NUMA.
MV2_SHOW_CPU_BINDING Specifica se si vogliono ottenere informazioni di debug sulla posizione in cui sono stati aggiunti i processi.
MV2_SHOW_HCA_BINDING Specifica se si vogliono ottenere informazioni di debug sulla scheda del canale host usata da ogni processo.

MPI della piattaforma

Installare i pacchetti necessari per Platform MPI Community Edition.

sudo yum install libstdc++.i686
sudo yum install glibc.i686
Download platform MPI at https://www.ibm.com/developerworks/downloads/im/mpi/index.html 
sudo ./platform_mpi-09.01.04.03r-ce.bin

Seguire il processo di installazione.

I comandi seguenti sono esempi di esecuzione di pingpong MPI e allreduce usando Platform MPI in macchine virtuali HBv3 usando immagini di VM CentOS-HPC 7.6, 7.8 e 8.1.

/opt/ibm/platform_mpi/bin/mpirun -hostlist 10.0.0.8:1,10.0.0.9:1 -np 2 -e MPI_IB_PKEY=0x800a  -ibv  /home/jijos/mpi-benchmarks/IMB-MPI1 pingpong
/opt/ibm/platform_mpi/bin/mpirun -hostlist 10.0.0.8:120,10.0.0.9:120 -np 240 -e MPI_IB_PKEY=0x800a  -ibv  /home/jijos/mpi-benchmarks/IMB-MPI1 allreduce -npmin 240

MPICH

Installare UCX come descritto in precedenza. Compilare MPICH.

wget https://www.mpich.org/static/downloads/3.3/mpich-3.3.tar.gz
tar -xvf mpich-3.3.tar.gz
cd mpich-3.3
./configure --with-ucx=${UCX_PATH} --prefix=${INSTALL_PREFIX} --with-device=ch4:ucx
make -j 8 && make install

Esecuzione di MPICH.

${INSTALL_PREFIX}/bin/mpiexec -n 2 -hostfile ~/hostfile -env UCX_IB_PKEY=0x0003 -bind-to hwthread ./osu_latency

Controllare la chiave di partizione come indicato in precedenza.

Benchmark MPI OSU

Scaricare benchmark MPI OSU e untar.

wget http://mvapich.cse.ohio-state.edu/download/mvapich/osu-micro-benchmarks-5.5.tar.gz
tar –xvf osu-micro-benchmarks-5.5.tar.gz
cd osu-micro-benchmarks-5.5

Creare benchmark usando una particolare libreria MPI:

CC=<mpi-install-path/bin/mpicc>CXX=<mpi-install-path/bin/mpicxx> ./configure 
make

I benchmark MPI si trovano nella mpi/ cartella .

Individuare le chiavi di partizione

Individuare le chiavi di partizione (p-keys) per comunicare con altre macchine virtuali all'interno dello stesso tenant (set di disponibilità o set di scalabilità di macchine virtuali).

/sys/class/infiniband/mlx5_0/ports/1/pkeys/0
/sys/class/infiniband/mlx5_0/ports/1/pkeys/1

Il più grande dei due è la chiave del tenant che deve essere usata con MPI. Esempio: se di seguito sono riportate le chiavi p, 0x800b deve essere usato con MPI.

cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/0
0x800b
cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/1
0x7fff

Le interfacce note sono denominate come mlx5_ib* all'interno delle immagini di macchine virtuali HPC.

Si noti anche che, purché il tenant (set di disponibilità o set di scalabilità di macchine virtuali) esista, le unità PKEY rimangono invariate. Questo vale anche quando i nodi vengono aggiunti/eliminati. I nuovi tenant ottengono diversi PKEY.

Configurare i limiti utente per MPI

Configurare i limiti utente per MPI.

cat << EOF | sudo tee -a /etc/security/limits.conf
*               hard    memlock         unlimited
*               soft    memlock         unlimited
*               hard    nofile          65535
*               soft    nofile          65535
EOF

Configurare le chiavi SSH per MPI

Configurare le chiavi SSH per i tipi MPI che lo richiedono.

ssh-keygen -f /home/$USER/.ssh/id_rsa -t rsa -N ''
cat << EOF > /home/$USER/.ssh/config
Host *
    StrictHostKeyChecking no
EOF
cat /home/$USER/.ssh/id_rsa.pub >> /home/$USER/.ssh/authorized_keys
chmod 600 /home/$USER/.ssh/authorized_keys
chmod 644 /home/$USER/.ssh/config

La sintassi precedente presuppone che una home directory condivisa, altrimenti .ssh la directory deve essere copiata in ogni nodo.

Passaggi successivi