Konfigurera gränssnitt för att skicka meddelanden för HPC

Varning

Den här artikeln refererar till CentOS, en Linux-distribution som närmar sig EOL-status (End Of Life). Överväg att använda och planera i enlighet med detta. Mer information finns i CentOS End Of Life-vägledningen.

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 de facto-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 paket för vetenskaplig databehandling och är det enklaste sättet att komma igång.

Även om exemplen här är för RHEL/CentOS, 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.

Arkitektur för populära MPI-bibliotek

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=1du .
$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=4du .
-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. Providern mlx 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 scatterdu , 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.

Följande kommandon är exempel på hur du kör MPI-pingpong och allreduce med hjälp av Plattform MPI på virtuella HBv3-datorer med CentOS-HPC 7.6, 7.8 och 8.1 VM-avbildningar.

/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

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