A Message Passing Interface beállítása HPC-hez

Figyelemfelhívás

Ez a cikk a CentOS-ra, egy olyan Linux-disztribúcióra hivatkozik, amely közel áll az élettartam (EOL) állapotához. Fontolja meg a használatát, és ennek megfelelően tervezze meg. További információ: CentOS End Of Life útmutató.

A következőkre vonatkozik: ✔️ Linux rendszerű virtuális gépek ✔️ Windows rendszerű virtuális gépek Rugalmas méretezési ✔️ csoportok ✔️ Egységes méretezési csoportok

Az Üzenetátadó felület (MPI) egy nyílt kódtár és de facto szabvány az elosztott memória párhuzamosításához. Gyakran használják számos HPC-számítási feladatban. Az RDMA-képes HB-sorozatú és N sorozatú virtuális gépek HPC számítási feladatai MPI használatával kommunikálhatnak az alacsony késés és a nagy sávszélességű InfiniBand hálózaton keresztül.

  • Az SR-IOV-kompatibilis virtuálisgép-méretek az Azure-ban szinte bármilyen MPI-verzió használatát lehetővé teszik a Mellanox OFED használatával.
  • A nem SR-IOV-kompatibilis virtuális gépeken a támogatott MPI-implementációk a Microsoft Network Direct (ND) felületet használják a virtuális gépek közötti kommunikációhoz. Ezért csak a Microsoft MPI (MS-MPI) 2012 R2 vagy újabb verziók és az Intel MPI 5.x verziók támogatottak. Az Intel MPI-futtatókörnyezeti kódtár későbbi verziói (2017, 2018) esetleg nem kompatibilisek az Azure RDMA-illesztőprogramokkal.

Az SR-IOV-kompatibilis RDMA-kompatibilis virtuális gépek esetében az Ubuntu-HPC virtuálisgép-rendszerképek és az AlmaLinux-HPC virtuálisgép-rendszerképek alkalmasak. Ezek a virtuálisgép-rendszerképek optimalizálva és előre betöltve vannak az RDMA-hoz készült OFED illesztőprogramokkal, valamint különböző gyakran használt MPI-kódtárakkal és tudományos számítástechnikai csomagokkal, és a legegyszerűbb módja az első lépéseknek.

Bár az alábbi példák az RHEL/CentOS rendszerre mutatnak be példákat, a lépések általánosak, és bármilyen kompatibilis Linux operációs rendszerhez, például az Ubuntuhoz (18.04, 20.04, 22.04) és SLES-hez (12 SP4 és 15 SP4) használhatók. További példák más MPI-implementációk beállítására más disztribúciókra az azhpc-images adattárban található.

Feljegyzés

Ha MPI-feladatokat futtat az SR-IOV-kompatibilis virtuális gépeken bizonyos MPI-kódtárakkal (például a platform MPI-vel), szükség lehet partíciókulcsok (p-kulcsok) beállítására egy bérlőn az elkülönítés és a biztonság érdekében. A partíciókulcsok felderítése szakaszban található lépéseket követve állapítsa meg a p-kulcs értékeit, és helyesen állítsa be őket egy MPI-feladathoz az adott MPI-kódtárban.

Feljegyzés

Az alábbi kódrészletek példák. Javasoljuk, hogy használja a csomagok legújabb stabil verzióit, vagy hivatkozik az azhpc-images adattárra.

MPI-kódtár kiválasztása

Ha egy HPC-alkalmazás egy adott MPI-kódtárat javasol, először próbálja ki ezt a verziót. Ha rugalmasan dönti el, hogy melyik MPI-t választhatja, és a legjobb teljesítményt szeretné, próbálja ki a HPC-X-t. Összességében a HPC-X MPI a legjobb teljesítményt nyújtja az InfiniBand interfész UCX-keretrendszerének használatával, és kihasználja a Mellanox InfiniBand összes hardver- és szoftverképességét. Emellett a HPC-X és az OpenMPI ABI-kompatibilisek, így dinamikusan futtathat egy HPC-alkalmazást az OpenMPI-vel készült HPC-X használatával. Hasonlóképpen az Intel MPI, az MVAPICH és az MPICH is ABI-kompatibilis.

Az alábbi ábra a népszerű MPI-kódtárak architektúráit mutatja be.

Népszerű MPI-kódtárak architektúrája

HPC-X

A HPC-X szoftvereszközkészlet UCX-et és HCOLL-t tartalmaz, és az UCX-hez készült.

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

Az alábbi parancs néhány ajánlott mpirun argumentumot mutat be a HPC-X és az OpenMPI esetében.

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

ahol:

Paraméter Leírás
NPROCS Az MPI-folyamatok számát adja meg. Például: -n 16
$HOSTFILE Megadja a gazdagépnevet vagy IP-címet tartalmazó fájlt, amely jelzi az MPI-folyamatok futtatásának helyét. Például: --hostfile hosts
$NUMBER_PROCESSES_PER_NUMA Az egyes NUMA-tartományokban futó MPI-folyamatok számát adja meg. Ha például NUMA-nként négy MPI-folyamatot szeretne megadni, akkor a következőt kell használnia --map-by ppr:4:numa:pe=1:
$NUMBER_THREADS_PER_PROCESS Az MPI-folyamatonkénti szálak számát adja meg. Ha például egy MPI-folyamatot és négy szálat szeretne megadni NUMA-nként, akkor a következőt kell használnia --map-by ppr:1:numa:pe=4:
-report-bindings Az MPI-folyamatok magokra való leképezését nyomtatja ki, ami hasznos annak ellenőrzéséhez, hogy az MPI-folyamat rögzítése helyes-e.
$MPI_EXECUTABLE Az MPI-kódtárakban végrehajtható, beépített MPI-csatolást adja meg. Az MPI-fordítóburkolók ezt automatikusan elvégzik. Például: mpicc vagy mpif90.

Az OSU késési mikrobenchjel futtatására az alábbi példa látható:

${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-kollektívák optimalizálása

Az MPI kollektív kommunikációs primitívjei rugalmas, hordozható módot kínálnak a csoportkommunikációs műveletek implementálásához. Ezeket széles körben használják különböző tudományos párhuzamos alkalmazásokban, és jelentős hatással vannak az alkalmazások általános teljesítményére. A közös kommunikációs teljesítményt a HPC-X és a HCOLL kódtárral közös kommunikációra optimalizáló konfigurációs paraméterekkel kapcsolatos részletekért tekintse meg a TechCommunity cikket .

Ha például azt gyanítja, hogy a szorosan összekapcsolt MPI-alkalmazás túlzott mennyiségű kollektív kommunikációt végez, megpróbálhatja engedélyezni a hierarchikus kollektívákat (HCOLL). A funkciók engedélyezéséhez használja az alábbi paramétereket.

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

Feljegyzés

A HPC-X 2.7.4+ esetén előfordulhat, hogy explicit módon át kell adni LD_LIBRARY_PATH, ha az MOFED UCX-verziója és a HPC-X-ben eltérő.

OpenMPI

Telepítse az UCX-et a fent leírtak szerint. A HCOLL a HPC-X szoftvereszközkészlet része, és nem igényel speciális telepítést.

Az OpenMPI az adattárban elérhető csomagokból telepíthető.

sudo yum install –y openmpi

Javasoljuk, hogy az OpenMPI és az UCX legújabb, stabil kiadását hozzon létre.

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

Az optimális teljesítmény érdekében futtassa az OpenMPI-t és hcolla ucx . Lásd a HPC-X-et tartalmazó példát is.

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

Ellenőrizze a partíciókulcsot a fent említett módon.

Intel MPI

Töltse le az Intel MPI választott verzióját. Az Intel MPI 2019 kiadás az Open Fabrics Alliance (OFA) keretrendszerről az Open Fabrics Interfaces (OFI) keretrendszerre váltott, és jelenleg a libfabric-t támogatja. Az InfiniBand két szolgáltatót támogat: mlx és ige. Módosítsa a I_MPI_FABRICS környezeti változót a verziótól függően.

  • Intel MPI 2019 és 2021: use I_MPI_FABRICS=shm:ofi, I_MPI_OFI_PROVIDER=mlx. A mlx szolgáltató az UCX-et használja. Az igék használata instabilnak és kevésbé teljesíthetőnek bizonyult. További részletekért tekintse meg a TechCommunity cikket .
  • Intel MPI 2018: használat I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: használat I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Íme néhány javasolt mpirun argumentum az Intel MPI 2019 5+-os frissítéséhez.

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

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

ahol:

Paraméter Leírás
FI_PROVIDER Megadja, hogy melyik könyvtárszolgáltatót használja, amely hatással lesz a használt API-ra, protokollra és hálózatra. az ige egy másik lehetőség, de általában az mlx jobb teljesítményt nyújt.
I_MPI_DEBUG Megadja az extra hibakeresési kimenet szintjét, amely részletesen be tudja nyújtani, hogy hol vannak rögzítve a folyamatok, és hogy melyik protokollt és hálózatot használja a rendszer.
I_MPI_PIN_DOMAIN Meghatározza, hogyan szeretné rögzíteni a folyamatokat. Rögzíthet például magokat, szoftvercsatornákat vagy NUMA-tartományokat. Ebben a példában ezt a környezeti változót numa értékre állítja, ami azt jelenti, hogy a folyamatok NUMA-csomóponttartományokhoz lesznek rögzítve.

MPI-kollektívák optimalizálása

Vannak más lehetőségek is, amelyeket kipróbálhat, különösen akkor, ha a kollektív műveletek jelentős időt igényelnek. Az Intel MPI 2019 5+ frissítése támogatja a provide mlx szolgáltatást, és az UCX-keretrendszer használatával kommunikál az InfiniBanddel. A HCOLL-t is támogatja.

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

Nem SR-IOV rendszerű virtuális gépek

Nem SR-IOV rendszerű virtuális gépek esetén az 5.x futtatókörnyezet ingyenes próbaverziójának letöltésére a következő példa látható:

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

A telepítési lépésekért tekintse meg az Intel MPI-kódtár telepítési útmutatóját. Szükség esetén engedélyezheti a ptrace-t a nem gyökérszintű, nem hibakereső folyamatokhoz (ez az Intel MPI legújabb verzióihoz szükséges).

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

SUSE Linux

Su Standard kiadás Linux Enterprise Server rendszerű virtuálisgép-rendszerképek – SLES 12 SP3 a HPC-hez, SLES 12 SP3 a HPC-hez (Prémium), SLES 12 SP1 a HPC-hez, SLES 12 SP1 HPC (Premium), SLES 12 SP4 és SLES 15, az RDMA-illesztőprogramok telepítése és az Intel MPI-csomagok terjesztése a virtuális gépen. Telepítse az Intel MPI-t a következő parancs futtatásával:

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

MVAPICH

Az alábbi példa a MVAPICH2 építésére mutat be. Vegye figyelembe, hogy az alábbinál újabb verziók érhetők el.

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

Az OSU késési mikrobenchjel futtatására az alábbi példa látható:

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

Az alábbi lista számos ajánlott mpirun argumentumot tartalmaz.

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

ahol:

Paraméter Leírás
MV2_CPU_BINDING_POLICY Meghatározza a használni kívánt kötési szabályzatot, amely befolyásolja a folyamatok alapvető azonosítókhoz való rögzítését. Ebben az esetben meg kell adnia scatter, hogy a folyamatok egyenletesen el legyenek szórva a NUMA-tartományok között.
MV2_CPU_BINDING_LEVEL Meghatározza a folyamatok rögzítésének helyét. Ebben az esetben numanode értékre állítja, ami azt jelenti, hogy a folyamatok NUMA-tartományok egységeihez vannak rögzítve.
MV2_SHOW_CPU_BINDING Megadja, hogy szeretne-e hibakeresési információkat kapni arról, hogy hol vannak rögzítve a folyamatok.
MV2_SHOW_HCA_BINDING Megadja, hogy szeretne-e hibakeresési információkat kapni arról, hogy az egyes folyamatok melyik gazdagépcsatorna-adaptert használják.

Platform MPI

Telepítse a szükséges csomagokat a platform MPI Community Edition kiadásához.

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

Kövesse a telepítési folyamatot.

Az alábbi parancsok példák az MPI pingpong futtatására és az MPI platformmal való allreduce használatára HBv3 rendszerű virtuális gépeken CentOS-HPC 7.6, 7.8 és 8.1 virtuálisgép-rendszerképek használatával.

/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

Telepítse az UCX-et a fent leírtak szerint. MPICH létrehozása.

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

Futtassa az MPICH-t.

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

Ellenőrizze a partíciókulcsot a fent említett módon.

OSU MPI-teljesítménytesztek

Töltse le az OSU MPI-teljesítményteszteket , és törölje az elemet.

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

Teljesítménymutatók készítése egy adott MPI-kódtár használatával:

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

Az MPI-teljesítménytesztek mappában mpi/ vannak.

Partíciókulcsok felderítése

Felderítheti a partíciókulcsokat (p-kulcsokat) az azonos bérlőn belüli más virtuális gépekkel (rendelkezésre állási csoport vagy virtuálisgép-méretezési csoport) való kommunikációhoz.

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

A kettő közül a nagyobb az MPI-vel használni kívánt bérlőkulcs. Példa: Ha a p-billentyűk a következők, 0x800b kell használni az MPI-vel.

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

A megjegyzésillesztők neve mlx5_ib* HPC virtuálisgép-rendszerképeken belül található.

Azt is vegye figyelembe, hogy amíg a bérlő (rendelkezésre állási csoport vagy virtuálisgép-méretezési csoport) létezik, a PKEY-k változatlanok maradnak. Ez akkor is igaz, ha csomópontokat adnak hozzá/törölnek. Az új bérlők különböző PKEY-ket kapnak.

Az MPI felhasználói korlátainak beállítása

Állítsa be az MPI felhasználói korlátait.

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

SSH-kulcsok beállítása MPI-hez

Állítson be SSH-kulcsokat a szükséges MPI-típusokhoz.

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

A fenti szintaxis egy megosztott kezdőkönyvtárat feltételez, máskülönben .ssh a címtárat minden csomópontra át kell másolni.

Következő lépések