Een Message Passing Interface voor HPC instellen

Van toepassing op: ✔️ Virtuele Linux-machines voor Windows-VM's ✔️ ✔️ Flexibele schaalsets Uniform schaalsets ✔️

De Message Passing Interface (MPI) is een open bibliotheek en de facto standaard voor parallellisatie van gedistribueerd geheugen. Het wordt vaak gebruikt voor veel HPC-workloads. HPC-workloads op de VM's uit de RDMA-serie en N-serie kunnen MPI gebruiken om te communiceren via het InfiniBand-netwerk met lage latentie en hoge bandbreedte.

  • Met de VM-grootten met SR-IOV in Azure kan bijna elke variant van MPI worden gebruikt met Mellanox OFED.
  • Op niet-SR-IOV ingeschakelde VM's gebruiken ondersteunde MPI-implementaties de ND-interface (Microsoft Network Direct) om te communiceren tussen VM's. Daarom worden alleen Microsoft MPI (MS-MPI) 2012 R2 of hoger en Intel MPI 5.x-versies ondersteund. Latere versies (2017, 2018) van de Intel MPI-runtimebibliotheek zijn mogelijk of niet compatibel met de Azure RDMA-stuurprogramma's.

Voor VM's die geschikt zijn voor RDMA met SR-IOV, zijn CentOS-HPC VM-installatiekopieën versie 7.6 en hoger geschikt. Deze VM-installatiekopieën zijn geoptimaliseerd en vooraf geladen met de OFED-stuurprogramma's voor RDMA en verschillende veelgebruikte MPI-bibliotheken en wetenschappelijke computingpakketten en zijn de eenvoudigste manier om aan de slag te gaan.

Hoewel de voorbeelden hier voor RHEL/CentOS zijn, maar de stappen zijn algemeen en kunnen worden gebruikt voor elk compatibel Linux-besturingssysteem zoals Ubuntu (16.04, 18.04 19.04, 20.04) en SLES (12 SP4 en 15). Meer voorbeelden voor het instellen van andere MPI-implementaties op andere distributies bevindt zich in de opslagplaats azhpc-images.

Notitie

Voor het uitvoeren van MPI-taken op VM's met SR-IOV-functionaliteit met bepaalde MPI-bibliotheken (zoals Platform MPI) is mogelijk het instellen van partitiesleutels (p-keys) in een tenant vereist voor isolatie en beveiliging. Volg de stappen in de sectie Partitiesleutels detecteren voor meer informatie over het bepalen van de p-sleutelwaarden en het correct instellen van deze MPI-taak voor een MPI-taak met die MPI-bibliotheek.

Notitie

De onderstaande codefragmenten zijn voorbeelden. U wordt aangeraden de nieuwste stabiele versies van de pakketten te gebruiken of naar de opslagplaats azhpc-images te verwijzen.

MPI-bibliotheek kiezen

Als een HPC-toepassing een bepaalde MPI-bibliotheek aanbeveelt, probeert u eerst die versie. Als u flexibiliteit hebt met betrekking tot welke MPI u kunt kiezen en u de beste prestaties wilt, kunt u HPC-X proberen. Over het algemeen presteert de HPC-X MPI het beste met behulp van het UCX-framework voor de InfiniBand-interface en maakt gebruik van alle Mellanox InfiniBand-hardware- en softwaremogelijkheden. Daarnaast zijn HPC-X en OpenMPI compatibel met ABI, zodat u dynamisch een HPC-toepassing kunt uitvoeren met HPC-X die is gebouwd met OpenMPI. Op dezelfde manier zijn Intel MPI, MVAPICH en MPICH compatibel met ABI.

In de volgende afbeelding ziet u de architectuur voor de populaire MPI-bibliotheken.

Architectuur voor populaire MPI-bibliotheken

UCX

Unified Communication X (UCX) is een framework van communicatie-API's voor HPC. Het is geoptimaliseerd voor MPI-communicatie via InfiniBand en werkt met veel MPI-implementaties zoals OpenMPI en MPICH.

wget https://github.com/openucx/ucx/releases/download/v1.4.0/ucx-1.4.0.tar.gz
tar -xvf ucx-1.4.0.tar.gz
cd ucx-1.4.0
./configure --prefix=<ucx-install-path>
make -j 8 && make install

Notitie

Recente builds van UCX hebben een probleem opgelost waarbij de juiste InfiniBand-interface wordt gekozen in de aanwezigheid van meerdere NIC-interfaces. Zie Voor meer informatie bekende problemen met HPC- en GPU-VM's oplossen bij het uitvoeren van MPI via InfiniBand wanneer versneld netwerken is ingeschakeld op de VM.

HPC-X

De HPC-X-software-toolkit bevat UCX en HCOLL en kan worden gebouwd op basis van 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

De volgende opdracht illustreert enkele aanbevolen mpirun-argumenten voor HPC-X en OpenMPI.

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

Hierbij

Parameter Beschrijving
NPROCS Hiermee geeft u het aantal MPI-processen op. Bijvoorbeeld: -n 16.
$HOSTFILE Hiermee geeft u een bestand met de hostnaam of het IP-adres op om de locatie aan te geven waar de MPI-processen worden uitgevoerd. Bijvoorbeeld: --hostfile hosts.
$NUMBER_PROCESSES_PER_NUMA Hiermee geeft u het aantal MPI-processen op dat in elk NUMA-domein wordt uitgevoerd. Als u bijvoorbeeld vier MPI-processen per NUMA wilt opgeven, gebruikt --map-by ppr:4:numa:pe=1u .
$NUMBER_THREADS_PER_PROCESS Hiermee geeft u het aantal threads per MPI-proces. Als u bijvoorbeeld één MPI-proces en vier threads per NUMA wilt opgeven, gebruikt --map-by ppr:1:numa:pe=4u .
-report-bindings MpI-processen worden toegewezen aan kernen, wat handig is om te controleren of het vastmaken van uw MPI-proces juist is.
$MPI_EXECUTABLE Hiermee geeft u het uitvoerbare MPI-uitvoerbare koppeling in MPI-bibliotheken op. MpI-compiler-wrappers doen dit automatisch. Bijvoorbeeld: mpicc of mpif90.

Een voorbeeld van het uitvoeren van de OSU-latentie microbenchmark is als volgt:

${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

MPI-collectieven optimaliseren

MPI Collectieve communicatieprimitief biedt een flexibele, draagbare manier om groepscommunicatiebewerkingen te implementeren. Ze worden veel gebruikt in verschillende wetenschappelijke parallelle toepassingen en hebben een aanzienlijke invloed op de algehele toepassingsprestaties. Raadpleeg het TechCommunity-artikel voor meer informatie over configuratieparameters om de prestaties van collectieve communicatie te optimaliseren met behulp van de HPC-X- en HCOLL-bibliotheek voor collectieve communicatie.

Als u bijvoorbeeld vermoedt dat uw nauw gekoppelde MPI-toepassing een overmatige hoeveelheid collectieve communicatie uitvoert, kunt u proberen hiërarchische collectieven (HCOLL) in te schakelen. Gebruik de volgende parameters om deze functies in te schakelen.

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

Notitie

Met HPC-X 2.7.4+ kan het nodig zijn om expliciet LD_LIBRARY_PATH door te geven als de UCX-versie op MOFED versus die in HPC-X anders is.

Openmpi

Installeer UCX zoals hierboven beschreven. HCOLL maakt deel uit van de HPC-X-software-toolkit en vereist geen speciale installatie.

OpenMPI kan worden geïnstalleerd vanuit de pakketten die beschikbaar zijn in de opslagplaats.

sudo yum install –y openmpi

We raden u aan een nieuwste, stabiele release van OpenMPI met UCX te bouwen.

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

Voer OpenMPI uit met ucx en hcollvoor optimale prestaties. Zie ook het voorbeeld met 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

Controleer de partitiesleutel zoals hierboven vermeld.

Intel MPI

Download de gewenste versie van Intel MPI. De Intel MPI 2019-release is overgeschakeld van het Open Fabrics Alliance-framework (OFA) naar het OFI-framework (Open Fabrics Interfaces) en ondersteunt momenteel libfabric. Er zijn twee providers voor InfiniBand-ondersteuning: mlx en werkwoorden. Wijzig de I_MPI_FABRICS omgevingsvariabele, afhankelijk van de versie.

  • Intel MPI 2019 en 2021: gebruik I_MPI_FABRICS=shm:ofi, I_MPI_OFI_PROVIDER=mlx. De mlx provider gebruikt UCX. Het gebruik van werkwoorden is instabiel en minder presterend. Zie het TechCommunity-artikel voor meer informatie.
  • Intel MPI 2018: gebruik I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: gebruik I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Hier volgen enkele voorgestelde mpirun-argumenten voor 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

Hierbij

Parameter Beschrijving
FI_PROVIDER Hiermee geeft u op welke libfabric-provider moet worden gebruikt, wat van invloed is op de API, het protocol en het netwerk dat wordt gebruikt. werkwoorden is een andere optie, maar over het algemeen biedt mlx u betere prestaties.
I_MPI_DEBUG Hiermee geeft u het niveau van extra foutopsporingsuitvoer op, die details kan bieden over waar processen zijn vastgemaakt en welk protocol en welk netwerk worden gebruikt.
I_MPI_PIN_DOMAIN Hiermee geeft u op hoe u uw processen wilt vastmaken. U kunt bijvoorbeeld vastmaken aan kernen, sockets of NUMA-domeinen. In dit voorbeeld stelt u deze omgevingsvariabele in op Numa, wat betekent dat processen worden vastgemaakt aan NUMA-knooppuntdomeinen.

MPI-collectieven optimaliseren

Er zijn enkele andere opties die u kunt proberen, met name als collectieve bewerkingen een aanzienlijke hoeveelheid tijd verbruiken. Intel MPI 2019 update 5+ ondersteunt het bieden van mlx en gebruikt het UCX-framework om te communiceren met InfiniBand. Het ondersteunt ook HCOLL.

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

Niet-SR-IOV-VM's

Voor niet-SR-IOV-VM's is een voorbeeld van het downloaden van de gratis evaluatieversie van 5.x runtime als volgt:

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

Zie de Installatiehandleiding voor de Intel MPI-bibliotheek voor installatiestappen. Desgewenst wilt u ptrace inschakelen voor niet-root niet-foutopsporingsprogrammaprocessen (nodig voor de meest recente versies van Intel MPI).

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

SUSE Linux

Voor SUSE Linux Enterprise Server VM-installatiekopieën - SLES 12 SP3 voor HPC, SLES 12 SP3 voor HPC (Premium), SLES 12 SP1 voor HPC, SLES 12 SP1 voor HPC (Premium), SLES 12 SP4 en SLES 15 worden de RDMA-stuurprogramma's geïnstalleerd en worden Intel MPI-pakketten gedistribueerd op de VM. Installeer Intel MPI door de volgende opdracht uit te voeren:

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

MVAPICH

Hier volgt een voorbeeld van het bouwen van MVAPICH2. Nieuwere versies zijn mogelijk beschikbaar dan hieronder wordt gebruikt.

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

Een voorbeeld van het uitvoeren van de OSU-latentie microbenchmark is als volgt:

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

De volgende lijst bevat verschillende aanbevolen mpirun argumenten.

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

Hierbij

Parameter Beschrijving
MV2_CPU_BINDING_POLICY Hiermee geeft u op welk bindingsbeleid moet worden gebruikt, wat van invloed is op de wijze waarop processen worden vastgemaakt aan kern-id's. In dit geval geeft u spreiding op, zodat processen gelijkmatig worden verdeeld over de NUMA-domeinen.
MV2_CPU_BINDING_LEVEL Hiermee geeft u aan waar processen moeten worden vastgemaakt. In dit geval stelt u deze in op numanode, wat betekent dat processen worden vastgemaakt aan eenheden van NUMA-domeinen.
MV2_SHOW_CPU_BINDING Hiermee geeft u op of u foutopsporingsinformatie wilt ophalen over waar de processen zijn vastgemaakt.
MV2_SHOW_HCA_BINDING Hiermee geeft u op of u foutopsporingsinformatie wilt ophalen over welke hostkanaaladapter elk proces gebruikt.

Platform MPI

Installeer vereiste pakketten voor 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

Volg het installatieproces.

De volgende opdrachten zijn voorbeelden van het uitvoeren van MPI pingpong en allreduce met platform-MPI op HBv3-VM's met centOS-HPC 7.6, 7.8 en 8.1 VM-installatiekopieën.

/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

Installeer UCX zoals hierboven beschreven. Bouw 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

MPICH wordt uitgevoerd.

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

Controleer de partitiesleutel zoals hierboven vermeld.

OSU MPI-benchmarks

Download OSU MPI-benchmarks en 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

Benchmarks bouwen met behulp van een bepaalde MPI-bibliotheek:

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

MPI-benchmarks staan onder mpi/ de map.

Partitiesleutels detecteren

Ontdek partitiesleutels (p-keys) voor communicatie met andere VM's binnen dezelfde tenant (beschikbaarheidsset of virtuele-machineschaalset).

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

De grootste van de twee is de tenantsleutel die moet worden gebruikt met MPI. Voorbeeld: Als het volgende de p-keys zijn, moet 0x800b worden gebruikt met MPI.

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

Gebruik de andere partitie dan de standaardpartitiesleutel (0x7fff). UCX vereist dat de MSB van p-key wordt gewist. Stel bijvoorbeeld UCX_IB_PKEY in als 0x000b voor 0x800b.

Houd er ook rekening mee dat zolang de tenant (beschikbaarheidsset of virtuele-machineschaalset) bestaat, de PKEY's hetzelfde blijven. Dit geldt zelfs wanneer knooppunten worden toegevoegd/verwijderd. Nieuwe tenants krijgen verschillende PKEY's.

Gebruikerslimieten instellen voor MPI

Gebruikerslimieten instellen voor MPI.

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

SSH-sleutels instellen voor MPI

SSH-sleutels instellen voor MPI-typen waarvoor dit is vereist.

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

In de bovenstaande syntaxis wordt ervan uitgegaan dat een gedeelde basismap, anders .ssh-map moet worden gekopieerd naar elk knooppunt.

Volgende stappen