Konfigurera gränssnitt för att skicka meddelanden för HPC
Gäller för: ✔️ Virtuella Linux-datorer ✔️ med virtuella Windows-datorer ✔️ – flexibla skalningsuppsättningar ✔️ Enhetliga skalningsuppsättningar
MPI (Message Passing Interface) är ett öppet bibliotek och en defacto-standard för distribuerad minnesparallellisering. Det används ofta för många HPC-arbetsbelastningar. HPC-arbetsbelastningar på rdma-kompatibla virtuella datorer i HB-serien och N-serien kan använda MPI för att kommunicera via infiniBand-nätverket med låg svarstid och hög bandbredd.
- De SR-IOV-aktiverade VM-storlekarna i Azure gör att nästan alla typer av MPI kan användas med Mellanox OFED.
- På icke-SR-IOV-aktiverade virtuella datorer använder MPI-implementeringar som stöds gränssnittet Microsoft Network Direct (ND) för att kommunicera mellan virtuella datorer. Därför stöds endast Microsoft MPI (MS-MPI) 2012 R2 eller senare och Intel MPI 5.x-versioner. Senare versioner (2017, 2018) av Intel MPI-körningsbiblioteket kanske eller kanske inte är kompatibla med Azure RDMA-drivrutinerna.
För SR-IOV-aktiverade RDMA-kompatibla virtuella datorer är Ubuntu-HPC VM-avbildningar och AlmaLinux-HPC VM-avbildningar lämpliga. Dessa VM-avbildningar är optimerade och förinstallerade med OFED-drivrutinerna för RDMA och olika vanliga MPI-bibliotek och vetenskapliga databehandlingspaket och är det enklaste sättet att komma igång.
Även om exemplen här är för RHEL, men stegen är allmänna och kan användas för alla kompatibla Linux-operativsystem som Ubuntu (18.04, 20.04, 22.04) och SLES (12 SP4 och 15 SP4). Fler exempel för att konfigurera andra MPI-implementeringar på andra distributioner finns på lagringsplatsen azhpc-images.
Kommentar
Om du kör MPI-jobb på SR-IOV-aktiverade virtuella datorer med vissa MPI-bibliotek (till exempel Plattform MPI) kan det krävas konfiguration av partitionsnycklar (p-nycklar) i en klientorganisation för isolering och säkerhet. Följ stegen i avsnittet Identifiera partitionsnycklar för mer information om hur du fastställer p-nyckelvärdena och anger dem korrekt för ett MPI-jobb med det MPI-biblioteket.
Kommentar
Kodfragmenten nedan är exempel. Vi rekommenderar att du använder de senaste stabila versionerna av paketen eller refererar till lagringsplatsen azhpc-images.
Välja MPI-bibliotek
Om ett HPC-program rekommenderar ett visst MPI-bibliotek kan du prova den versionen först. Om du har flexibilitet när det gäller vilken MPI du kan välja, och du vill ha bästa prestanda, kan du prova HPC-X. Sammantaget presterar HPC-X MPI bäst genom att använda UCX-ramverket för InfiniBand-gränssnittet och dra nytta av alla Mellanox InfiniBand-maskinvaru- och programvarufunktioner. Dessutom är HPC-X och OpenMPI ABI-kompatibla, så du kan köra ett HPC-program dynamiskt med HPC-X som har skapats med OpenMPI. På samma sätt är Intel MPI, MVAPICH och MPICH ABI-kompatibla.
Följande bild illustrerar arkitekturen för de populära MPI-biblioteken.
HPC-X
HPC-X-programvaruverktyget innehåller UCX och HCOLL och kan byggas mot 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
Följande kommando illustrerar några rekommenderade mpirun-argument för HPC-X och OpenMPI.
mpirun -n $NPROCS --hostfile $HOSTFILE --map-by ppr:$NUMBER_PROCESSES_PER_NUMA:numa:pe=$NUMBER_THREADS_PER_PROCESS -report-bindings $MPI_EXECUTABLE
där:
Parameter | Description |
---|---|
NPROCS |
Anger antalet MPI-processer. Exempel: -n 16 . |
$HOSTFILE |
Anger en fil som innehåller värdnamnet eller IP-adressen för att ange var MPI-processerna körs. Exempel: --hostfile hosts . |
$NUMBER_PROCESSES_PER_NUMA |
Anger antalet MPI-processer som körs i varje NUMA-domän. Om du till exempel vill ange fyra MPI-processer per NUMA använder --map-by ppr:4:numa:pe=1 du . |
$NUMBER_THREADS_PER_PROCESS |
Anger antalet trådar per MPI-process. Om du till exempel vill ange en MPI-process och fyra trådar per NUMA använder --map-by ppr:1:numa:pe=4 du . |
-report-bindings |
Skriver ut MPI-processer som mappas till kärnor, vilket är användbart för att kontrollera att MPI-processens fästning är korrekt. |
$MPI_EXECUTABLE |
Anger den körbara MPI-länkningen i MPI-bibliotek. MPI-kompilatoromslutningar gör detta automatiskt. Till exempel: mpicc eller mpif90 . |
Ett exempel på hur du kör mikrobenchstämpeln för OSU-svarstid är följande:
${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
Optimera MPI-kollektiv
MPI Collective Communication primitives erbjuder ett flexibelt, portabelt sätt att implementera gruppkommunikationsåtgärder. De används ofta i olika vetenskapliga parallella program och har en betydande inverkan på den övergripande programprestandan. I techcommunity-artikeln finns information om konfigurationsparametrar för att optimera kollektiv kommunikationsprestanda med HPC-X- och HCOLL-biblioteket för kollektiv kommunikation.
Om du till exempel misstänker att ditt nära kopplade MPI-program utför en överdriven mängd kollektiv kommunikation kan du prova att aktivera hierarkiska kollektiv (HCOLL). Om du vill aktivera dessa funktioner använder du följande parametrar.
-mca coll_hcoll_enable 1 -x HCOLL_MAIN_IB=<MLX device>:<Port>
Kommentar
Med HPC-X 2.7.4+, kan det vara nödvändigt att uttryckligen skicka LD_LIBRARY_PATH om UCX-versionen på MOFED jämfört med den i HPC-X är annorlunda.
OpenMPI
Installera UCX enligt beskrivningen ovan. HCOLL är en del av HPC-X-programvaruverktyget och kräver ingen särskild installation.
OpenMPI kan installeras från de paket som är tillgängliga på lagringsplatsen.
sudo yum install –y openmpi
Vi rekommenderar att du skapar en senaste, stabil version av OpenMPI med 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
För optimala prestanda kör du OpenMPI med ucx
och hcoll
. Se även exemplet med 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
Kontrollera partitionsnyckeln enligt ovan.
Intel MPI
Ladda ned din val av version av Intel MPI. Intel MPI 2019-versionen bytte från OFA-ramverket (Open Fabrics Alliance) till RAMVERKet Open Fabrics Interfaces (OFI) och stöder för närvarande libfabric. Det finns två providers för InfiniBand-stöd: mlx och verb. Ändra I_MPI_FABRICS miljövariabel beroende på version.
- Intel MPI 2019 och 2021: use
I_MPI_FABRICS=shm:ofi
,I_MPI_OFI_PROVIDER=mlx
. Providernmlx
använder UCX. Användningen av verb har visat sig vara instabil och mindre högpresterande. Mer information finns i TechCommunity-artikeln . - Intel MPI 2018: använd
I_MPI_FABRICS=shm:ofa
- Intel MPI 2016: använd
I_MPI_DAPL_PROVIDER=ofa-v2-ib0
Här följer några föreslagna mpirun-argument för 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
där:
Parameter | Description |
---|---|
FI_PROVIDER |
Anger vilken libfabric-provider som ska användas, vilket påverkar DET API, protokoll och nätverk som används. verb är ett annat alternativ, men vanligtvis ger mlx bättre prestanda. |
I_MPI_DEBUG |
Anger nivån för extra felsökningsutdata, som kan ge information om var processer fästs och vilket protokoll och nätverk som används. |
I_MPI_PIN_DOMAIN |
Anger hur du vill fästa dina processer. Du kan till exempel fästa på kärnor, socketar eller NUMA-domäner. I det här exemplet anger du den här miljövariabeln till numa, vilket innebär att processer fästs på NUMA-noddomäner. |
Optimera MPI-kollektiv
Det finns några andra alternativ som du kan prova, särskilt om kollektiva åtgärder förbrukar mycket tid. Intel MPI 2019 update 5+ stöder provide mlx och använder UCX-ramverket för att kommunicera med InfiniBand. Det stöder också HCOLL.
export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1
Virtuella datorer som inte är SR-IOV
För virtuella datorer som inte är SR-IOV är ett exempel på hur du laddar ned den kostnadsfria utvärderingsversionen på 5.x runtime följande:
wget http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/9278/l_mpi_p_5.1.3.223.tgz
Installationssteg finns i installationsguiden för Intel MPI-bibliotek. Du kan också aktivera ptrace för icke-rotprocesser som inte är felsökningsprocesser (behövs för de senaste versionerna av Intel MPI).
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
SUSE Linux
För SUSE Linux Enterprise Server VM-avbildningsversioner – SLES 12 SP3 för HPC, SLES 12 SP3 för HPC (Premium), SLES 12 SP1 för HPC, SLES 12 SP1 för HPC (Premium), SLES 12 SP4 och SLES 15, installeras RDMA-drivrutinerna och Intel MPI-paket distribueras på den virtuella datorn. Installera Intel MPI genom att köra följande kommando:
sudo rpm -v -i --nodeps /opt/intelMPI/intel_mpi_packages/*.rpm
MVAPICH
Följande är ett exempel på hur du skapar MVAPICH2. Observera att nyare versioner kan vara tillgängliga än vad som används nedan.
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
Ett exempel på hur du kör mikrobenchstämpeln för OSU-svarstid är följande:
${INSTALL_PREFIX}/bin/mpirun_rsh -np 2 -hostfile ~/hostfile MV2_CPU_MAPPING=48 ./osu_latency
Följande lista innehåller flera rekommenderade mpirun
argument.
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
där:
Parameter | Description |
---|---|
MV2_CPU_BINDING_POLICY |
Anger vilken bindningsprincip som ska användas, vilket påverkar hur processer fästs på kärn-ID:t. I det här fallet anger scatter du , så att processerna är jämnt utspridda bland NUMA-domänerna. |
MV2_CPU_BINDING_LEVEL |
Anger var processer ska fästas. I det här fallet ställer du in den på numanode, vilket innebär att processer fästs på enheter i NUMA-domäner. |
MV2_SHOW_CPU_BINDING |
Anger om du vill hämta felsökningsinformation om var processerna fästs. |
MV2_SHOW_HCA_BINDING |
Anger om du vill få felsökningsinformation om vilket värdkanalkort varje process använder. |
Plattforms-MPI
Installera nödvändiga paket för 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
Följ installationsprocessen.
MPICH
Installera UCX enligt beskrivningen ovan. Skapa 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
Kör MPICH.
${INSTALL_PREFIX}/bin/mpiexec -n 2 -hostfile ~/hostfile -env UCX_IB_PKEY=0x0003 -bind-to hwthread ./osu_latency
Kontrollera partitionsnyckeln enligt ovan.
OSU MPI Benchmarks
Ladda ned OSU MPI Benchmarks och 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
Skapa benchmarks med ett visst MPI-bibliotek:
CC=<mpi-install-path/bin/mpicc>CXX=<mpi-install-path/bin/mpicxx> ./configure
make
MPI Benchmarks finns under mpi/
mappen .
Identifiera partitionsnycklar
Identifiera partitionsnycklar (p-nycklar) för kommunikation med andra virtuella datorer inom samma klientorganisation (tillgänglighetsuppsättning eller VM-skalningsuppsättning).
/sys/class/infiniband/mlx5_0/ports/1/pkeys/0
/sys/class/infiniband/mlx5_0/ports/1/pkeys/1
Den större av de två är klientnyckeln som ska användas med MPI. Exempel: Om följande är p-nycklar ska 0x800b användas med MPI.
cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/0
0x800b
cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/1
0x7fff
Observera att gränssnitten namnges som mlx5_ib*
i HPC VM-avbildningar.
Observera också att så länge klientorganisationen (tillgänglighetsuppsättningen eller vm-skalningsuppsättningen) finns förblir PKEY:erna desamma. Detta gäller även när noder läggs till/tas bort. Nya klienter får olika PKEY:er.
Konfigurera användargränser för MPI
Konfigurera användargränser för MPI.
cat << EOF | sudo tee -a /etc/security/limits.conf
* hard memlock unlimited
* soft memlock unlimited
* hard nofile 65535
* soft nofile 65535
EOF
Konfigurera SSH-nycklar för MPI
Konfigurera SSH-nycklar för MPI-typer som kräver det.
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
Syntaxen ovan förutsätter en delad hemkatalog, annars .ssh
måste katalogen kopieras till varje nod.
Nästa steg
- Läs mer om infiniBand-aktiverade virtuella datorer i HB-serien och N-serien.
- Granska översikten över HBv3-serien och HC-serien.
- Läs Optimal MPI-processplacering för virtuella datorer i HB-serien.
- Läs om de senaste meddelandena, HPC-arbetsbelastningsexempel och prestandaresultat på Azure Compute Tech Community-bloggarna.
- En arkitekturvy på högre nivå för att köra HPC-arbetsbelastningar finns i HPC (High Performance Computing) på Azure.