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.
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=1 u . |
$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=4 u . |
-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 hcoll
voor 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
. Demlx
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
- Meer informatie over de VM's uit de H-serie en N-seriemet InfiniBand
- Bekijk het overzicht van de HBv3-serie en het overzicht van de HC-serie.
- Lees optimale MPI-procesplaatsing voor VM's uit de HB-serie.
- Lees meer over de nieuwste aankondigingen, voorbeelden van HPC-workloads en prestatieresultaten in de Blogs van de Azure Compute Tech Community.
- Zie High Performance Computing (HPC) op Azure voor een gedetailleerdere architectuurweergave van HPC-workloads die worden uitgevoerd.