Nastavení Message Passing Interface pro HPC

Upozornění

Tento článek odkazuje na CentOS, linuxovou distribuci, která se blíží stavu Konec životnosti (EOL). Zvažte své použití a odpovídajícím způsobem naplánujte. Další informace najdete v doprovodných materiálech CentOS End Of Life.

Platí pro: ✔️ Virtuální počítače s Windows s Linuxem ✔️ ✔️ – Flexibilní škálovací sady Uniform Scale Sets ✔️

Rozhraní MPI (Message Passing Interface) je otevřená knihovna a de facto standard pro paralelizaci distribuované paměti. Běžně se používá v mnoha úlohách PROSTŘEDÍ HPC. Úlohy PROSTŘEDÍ HPC na virtuálních počítačích řady HB-series a N-series s podporouRDMA můžou pomocí MPI komunikovat přes síť InfiniBand s nízkou latencí a velkou šířkou pásma.

  • Velikosti virtuálních počítačů s podporou SR-IOV v Azure umožňují téměř jakoukoli variantu MPI používat s Mellanox OFED.
  • Na virtuálních počítačích s podporou rozhraní SR-IOV používají podporované implementace MPI rozhraní Microsoft Network Direct (ND) ke komunikaci mezi virtuálními počítači. Proto se podporují jenom verze Microsoft MPI (MS-MPI) 2012 R2 nebo novější a Verze Intel MPI 5.x. Novější verze knihovny modulu runtime Intel MPI (2017, 2018) můžou nebo nemusí být kompatibilní s ovladači Azure RDMA.

Pro virtuální počítače s podporou RDMA s podporou SR-IOV jsou vhodné image virtuálních počítačů s Ubuntu-HPC a imagemi virtuálních počítačů AlmaLinux-HPC. Tyto image virtuálních počítačů jsou optimalizované a předem načtené s ovladači OFED pro RDMA a různými běžně používanými knihovnami MPI a vědeckými výpočetními balíčky a představují nejjednodušší způsob, jak začít.

I když jsou zde uvedené příklady pro RHEL/CentOS, ale postup je obecný a lze ho použít pro všechny kompatibilní operační systémy Linux, jako je Ubuntu (18.04, 20.04, 22.04) a SLES (12 SP4 a 15 SP4). Další příklady nastavení dalších implementací MPI na jiných distribucích jsou v úložišti azhpc-images.

Poznámka:

Spouštění úloh MPI na virtuálních počítačích s podporou SR-IOV s určitými knihovnami MPI (například PLATFORM MPI) může vyžadovat nastavení klíčů oddílů (p-keys) v rámci tenanta pro izolaci a zabezpečení. Podrobnosti o určení hodnot p-key a jejich správném nastavení pro úlohu MPI s danou knihovnou MPI postupujte podle kroků v části Zjistit klíče oddílů.

Poznámka:

Níže uvedené fragmenty kódu jsou příklady. Doporučujeme používat nejnovější stabilní verze balíčků nebo odkazovat na úložiště azhpc-images.

Volba knihovny MPI

Pokud aplikace HPC doporučí konkrétní knihovnu MPI, zkuste tuto verzi nejprve. Pokud máte flexibilitu ohledně toho, které MPI si můžete vybrat a chcete dosáhnout nejlepšího výkonu, vyzkoušejte HPC-X. Celkově HPC-X MPI funguje nejlépe pomocí rozhraní UCX pro rozhraní InfiniBand a využívá všechny hardwarové a softwarové funkce Mellanox InfiniBand. Kromě toho jsou prostředí HPC-X a OpenMPI kompatibilní s ABI, takže můžete dynamicky spouštět aplikaci PROSTŘEDÍ HPC s prostředím HPC-X, která byla vytvořena pomocí OpenMPI. Podobně jsou technologie Intel MPI, MVAPICH a MPICH kompatibilní s ABI.

Následující obrázek znázorňuje architekturu oblíbených knihoven MPI.

Architektura pro oblíbené knihovny MPI

HPC-X

Softwarová sada nástrojů HPC-X obsahuje UCX a HCOLL a lze ji sestavit proti 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

Následující příkaz ukazuje některé doporučené argumenty mpirun pro HPC-X a OpenMPI.

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

kde:

Parametr Popis
NPROCS Určuje počet procesů MPI. Například: -n 16.
$HOSTFILE Určuje soubor obsahující název hostitele nebo IP adresu, který označuje umístění, kde se spouští procesy MPI. Například: --hostfile hosts.
$NUMBER_PROCESSES_PER_NUMA Určuje počet procesů MPI, které se spouští v každé doméně NUMA. Chcete-li například zadat čtyři procesy MPI na NUMA, použijete --map-by ppr:4:numa:pe=1.
$NUMBER_THREADS_PER_PROCESS Určuje počet vláken na proces MPI. Pokud chcete například zadat jeden proces MPI a čtyři vlákna na NUMA, použijete --map-by ppr:1:numa:pe=4.
-report-bindings Vytiskne mapování procesů MPI na jádra, což je užitečné k ověření správnosti připnutí procesu MPI.
$MPI_EXECUTABLE Určuje spustitelný soubor MPI integrovaný propojování v knihovnách MPI. Obálky kompilátoru MPI to dělají automaticky. Například: mpicc nebo mpif90.

Příklad spuštění mikrobenchmarku latence OSU je následující:

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

Optimalizace kolektivní správy MPI

Primitiva kolektivní komunikace MPI nabízejí flexibilní a přenosný způsob implementace skupinových komunikačních operací. Jsou široce používány napříč různými vědeckými paralelními aplikacemi a mají významný dopad na celkový výkon aplikace. Podrobnosti o parametrech konfigurace pro optimalizaci výkonu kolektivní komunikace pomocí knihovny HPC-X a HCOLL pro kolektivní komunikaci najdete v článku TechCommunity.

Pokud máte například podezření, že vaše úzce svázaná aplikace MPI provádí nadměrné množství kolektivní komunikace, můžete zkusit povolit hierarchické kolektivní skupiny (HCOLL). Pokud chcete tyto funkce povolit, použijte následující parametry.

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

Poznámka:

U prostředí HPC-X 2.7.4+ může být nutné explicitně předat LD_LIBRARY_PATH, pokud se verze UCX na MOFED a v prostředí HPC-X liší.

OpenMPI

Nainstalujte UCX, jak je popsáno výše. HCOLL je součástí softwarové sady nástrojů HPC-X a nevyžaduje speciální instalaci.

OpenMPI je možné nainstalovat z balíčků dostupných v úložišti.

sudo yum install –y openmpi

Doporučujeme vytvořit nejnovější stabilní verzi OpenMPI s 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

Pro zajištění optimálního výkonu spusťte OpenMPI s ucx a hcoll. Podívejte se také na příklad s prostředím 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

Zkontrolujte klíč oddílu, jak je uvedeno výše.

Intel MPI

Stáhněte si svou volbu verze Intel MPI. Verze Intel MPI 2019 přešla z architektury Open Fabrics Alliance (OFA) na architekturu Open Fabrics Interfaces (OFI) a aktuálně podporuje knihovnu libfabric. Pro podporu InfiniBand existují dva poskytovatelé: mlx a slovesa. Změňte proměnnou prostředí I_MPI_FABRICS v závislosti na verzi.

  • Intel MPI 2019 a 2021: use I_MPI_FABRICS=shm:ofi, I_MPI_OFI_PROVIDER=mlx. Poskytovatel mlx používá UCX. Použití sloves bylo zjištěno, že je nestabilní a méně výkonné. Další podrobnosti najdete v článku TechCommunity.
  • Intel MPI 2018: použití I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: použití I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Tady jsou některé navrhované argumenty mpirun pro aktualizaci Intel MPI 2019 5+.

export FI_PROVIDER=mlx
export I_MPI_DEBUG=5
export I_MPI_PIN_DOMAIN=numa

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

kde:

Parametr Popis
FI_PROVIDER Určuje, který zprostředkovatele libfabric se má použít, což ovlivní použité rozhraní API, protokol a síť. Slovesa jsou další možností, ale obecně mlx vám dává lepší výkon.
I_MPI_DEBUG Určuje úroveň dalšího výstupu ladění, který může obsahovat podrobnosti o tom, kde se procesy připnou a jaký protokol a síť se používají.
I_MPI_PIN_DOMAIN Určuje, jak chcete procesy připnout. Můžete například připnout k jádrům, soketům nebo doménám NUMA. V tomto příkladu nastavíte tuto proměnnou prostředí na numa, což znamená, že procesy se připnou k doménám uzlů NUMA.

Optimalizace kolektivní správy MPI

Existují některé další možnosti, které můžete vyzkoušet, zejména pokud kolektivní operace zabírají značné množství času. Intel MPI 2019 update 5+ podporuje mlx a používá rozhraní UCX ke komunikaci s InfiniBand. Podporuje také HCOLL.

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

Virtuální počítače jiné než SR-IOV

V případě virtuálních počítačů, které nejsou sr-IOV, je příklad stažení bezplatné zkušební verze modulu runtime 5.x následující:

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

Postup instalace najdete v průvodci instalací knihovny Intel MPI. Volitelně můžete chtít povolit trasování pro procesy jiného než kořenového ladicího programu (potřebné pro nejnovější verze Intel MPI).

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

SUSE Linux

Pro verze imagí virtuálních počítačů SUSE Linux Enterprise Server – SLES 12 SP3 pro HPC, SLES 12 SP3 pro HPC (Premium), SLES 12 SP1 pro HPC, SLES 12 SP1 pro HPC (Premium), SLES 12 SP4 a SLES 15 se nainstalují ovladače RDMA a balíčky Intel MPI se distribuují na virtuálním počítači. Nainstalujte Intel MPI spuštěním následujícího příkazu:

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

MVAPICH

Následuje příklad vytváření MVAPICH2. Upozorňujeme, že novější verze můžou být k dispozici, než jaké se používá níže.

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

Příklad spuštění mikrobenchmarku latence OSU je následující:

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

Následující seznam obsahuje několik doporučených 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

kde:

Parametr Popis
MV2_CPU_BINDING_POLICY Určuje, které zásady vazby se mají použít, což ovlivní způsob připnutí procesů na základní ID. V tomto případě zadáte scatter, takže procesy jsou rovnoměrně rozptýleny mezi doménami NUMA.
MV2_CPU_BINDING_LEVEL Určuje, kam se mají připnout procesy. V tomto případě ho nastavíte na numanode, což znamená, že procesy se připnou k jednotkám domén NUMA.
MV2_SHOW_CPU_BINDING Určuje, jestli chcete získat informace o ladění o tom, kde jsou procesy připnuté.
MV2_SHOW_HCA_BINDING Určuje, jestli chcete získat informace o ladění o tom, který adaptér hostitelského kanálu každý proces používá.

Mpi platformy

Nainstalujte požadované balíčky pro platformu 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

Postupujte podle procesu instalace.

Následující příkazy jsou příklady spuštění příkazu PINGpong a allreduce s využitím MPI platformy na virtuálních počítačích HBv3 pomocí imagí virtuálních počítačů CentOS-HPC 7.6, 7.8 a 8.1.

/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

Nainstalujte UCX, jak je popsáno výše. Sestavte 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

Spuštění funkce MPICH

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

Zkontrolujte klíč oddílu, jak je uvedeno výše.

Srovnávací testy MPI OSU

Stáhněte si srovnávací testy MPI OSU a netar.

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

Sestavení srovnávacích testů pomocí konkrétní knihovny MPI:

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

Srovnávací testy MPI jsou ve mpi/ složce.

Zjišťování klíčů oddílů

Zjistěte klíče oddílů (p-keys) pro komunikaci s jinými virtuálními počítači ve stejném tenantovi (skupina dostupnosti nebo škálovací sada virtuálních počítačů).

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

Větší z těchto dvou je klíč tenanta, který by se měl použít s MPI. Příklad: Pokud jsou tyto klíče p-keys, 0x800b by se měly používat s MPI.

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

Rozhraní poznámek jsou pojmenována jako mlx5_ib* uvnitř imagí virtuálních počítačů HPC.

Mějte také na paměti, že pokud tenant (skupina dostupnosti nebo škálovací sada virtuálních počítačů) existuje, zůstanou pkey stejné. To platí i v případě, že jsou uzly přidány nebo odstraněny. Noví tenanti získají různé infrastruktury veřejných klíčů.

Nastavení uživatelských limitů pro MPI

Nastavte limity uživatelů pro MPI.

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

Nastavení klíčů SSH pro MPI

Nastavte klíče SSH pro typy MPI, které ho vyžadují.

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

Výše uvedená syntaxe předpokládá, že sdílený domovský adresář, jinak .ssh se musí adresář zkopírovat do každého uzlu.

Další kroky