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 defacto-standaard voor parallelle uitvoering 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 Microsoft Network Direct-interface (ND) 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 MET SR-IOV geschikte RDMA-VM's zijn Ubuntu-HPC VM-installatiekopieën en AlmaLinux-HPC VM-installatiekopieën geschikt. Deze VM-installatiekopieën worden 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 zijn, maar de stappen algemeen zijn en kunnen worden gebruikt voor elk compatibel Linux-besturingssysteem zoals Ubuntu (18.04, 20.04, 22.04) en SLES (12 SP4 en 15 SP4). Meer voorbeelden voor het instellen van andere MPI-implementaties op andere distributies vindt u in de opslagplaats azhpc-images.
Notitie
Het uitvoeren van MPI-taken op VM's met SR-IOV waarvoor bepaalde MPI-bibliotheken (zoals Platform MPI) zijn ingeschakeld, vereisen mogelijk het instellen van partitiesleutels (p-keys) in een tenant 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 met die MPI-bibliotheek.
Notitie
De onderstaande codefragmenten zijn voorbeelden. We raden u aan 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.
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
waarbij geldt:
Parameter | Description |
---|---|
NPROCS |
Hiermee geeft u het aantal MPI-processen. Voorbeeld: -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. Voorbeeld: --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 |
Hiermee worden MPI-processen die zijn toegewezen aan kernen afgedrukt. Dit is handig 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. MpI-compiler-wrappers doen dit automatisch. Bijvoorbeeld: mpicc of mpif90 . |
Een voorbeeld van het uitvoeren van de OSU-latentiemicrobenenchmark 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 prestaties van toepassingen. Raadpleeg het TechCommunity-artikel voor meer informatie over configuratieparameters voor het optimaliseren van collectieve communicatieprestaties 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
Voor optimale prestaties voert u OpenMPI uit met ucx
en hcoll
. 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 omgevingsvariabele I_MPI_FABRICS, afhankelijk van de versie.
- Intel MPI 2019 en 2021: gebruik
I_MPI_FABRICS=shm:ofi
,I_MPI_OFI_PROVIDER=mlx
. Demlx
provider maakt gebruik van 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
waarbij geldt:
Parameter | Description |
---|---|
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 in beslag neemt. Intel MPI 2019 update 5+ ondersteunt het bieden van mlx en maakt gebruik van 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. U kunt eventueel 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-latentiemicrobenenchmark 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
waarbij geldt:
Parameter | Description |
---|---|
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 scatter u op, zodat processen gelijkmatig worden verspreid over de NUMA-domeinen. |
MV2_CPU_BINDING_LEVEL |
Hiermee geeft u op 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.
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
Partitiesleutels (p-sleutels) detecteren 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-sleutels 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
Opmerking-interfaces worden benoemd als mlx5_ib*
binnen HPC VM-installatiekopieën.
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
Stel SSH-sleutels in voor MPI-typen die dit vereisen.
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 er een gedeelde basismap is, anders .ssh
moet de map naar elk knooppunt worden gekopieerd.
Volgende stappen
- Meer informatie over de VM's uit de InfiniBand-serie en N-serie.
- 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-werkbelastingen 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.