Nastavení Message Passing Interface pro HPC
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 defacto 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 podporou RDMA 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é pomocí ovladačů OFED pro RDMA a různých běžně používaných knihoven MPI a vědeckých výpočetních balíčků a představují nejjednodušší způsob, jak začít.
I když jsou zde uvedené příklady pro RHEL, 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.
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í. Široce se používají 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
. Poskytovatelmlx
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.
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
- Přečtěte si o virtuálních počítačích řady HB-series s podporou infiniBand a N-series.
- Projděte si přehled řady HBv3 a přehled řady HC-series.
- Čtení optimálního umístění procesu MPI pro virtuální počítače řady HB-series
- Přečtěte si o nejnovějších oznámeních, příkladech úloh PROSTŘEDÍ HPC a výsledcích výkonu na blogech technické komunity Azure Compute.
- Přehled architektury vyšší úrovně spouštění úloh PROSTŘEDÍ HPC najdete v tématu Vysokovýkonné výpočetní prostředí (HPC) v Azure.