Configuración de la interfaz de paso de mensajes para HPCSet up Message Passing Interface for HPC

La interfaz de paso de mensajes (MPI) es una biblioteca abierta y con estándar de facto para operaciones de paralelización de memoria distribuida.The Message Passing Interface (MPI) is an open library and de-facto standard for distributed memory parallelization. Se suele usar en muchas cargas de trabajo de HPC.It is commonly used across many HPC workloads. Las cargas de trabajo de HPC de las máquinas virtuales de serie H y serie N compatibles con RDMA pueden usar MPI para comunicarse a través de la red InfiniBand de baja latencia y ancho de banda alto.HPC workloads on the RDMA capable H-series and N-series VMs can use MPI to communicate over the low latency and high bandwidth InfiniBand network.

  • Los tamaños de máquina virtual habilitados para SR-IOV en Azure permiten que se use prácticamente cualquier tipo de MPI con Mellanox OFED.The SR-IOV enabled VM sizes on Azure allow almost any flavor of MPI to be used with Mellanox OFED.
  • En las máquinas virtuales que no están habilitadas para SR-IOV, las implementaciones de MPI compatibles usan la interfaz Microsoft Network Direct (ND) para comunicarse entre máquinas virtuales.On non-SR-IOV enabled VMs, supported MPI implementations use the Microsoft Network Direct (ND) interface to communicate between VMs. Por lo tanto, solo se admiten las versiones de Microsoft MPI (MS-MPI) 2012 R2 o posterior e Intel MPI 5.x.Hence, only Microsoft MPI (MS-MPI) 2012 R2 or later and Intel MPI 5.x versions are supported. Las versiones posteriores (2017 y 2018) de la biblioteca en tiempo de ejecución de MPI pueden ser o no compatibles con los controladores de Azure RDMA.Later versions (2017, 2018) of the Intel MPI runtime library may or may not be compatible with the Azure RDMA drivers.

Para las VM habilitadas para RDMA con SR-IOV, las imágenes de VM de CentOS-HPC versión 7.6 y posteriores son adecuadas.For SR-IOV enabled RDMA capable VMs, CentOS-HPC VM images version 7.6 and later are suitable. Estas imágenes de máquina virtual, que se han optimizado y cargado previamente con los controladores OFED para RDMA y varias bibliotecas de MPI y paquetes de informática científica más usados, son la manera más fácil de empezar.These VM images come optimized and pre-loaded with the OFED drivers for RDMA and various commonly used MPI libraries and scientific computing packages and are the easiest way to get started.

Aunque el ejemplo que se muestra aquí es para RHEL/CentOS, los pasos son generales y se pueden usar en cualquier sistema operativo de Linux compatible, como Ubuntu (16.04, 18.04, 19.04, 20.04) y SLES (12 SP4 y 15).Though the examples here are for RHEL/CentOS, but the steps are general and can be used for any compatible Linux operating system such as Ubuntu (16.04, 18.04 19.04, 20.04) and SLES (12 SP4 and 15). Hay más ejemplos para configurar otras implementaciones de MPI en otras distribuciones en el repositorio azhpc-images.More examples for setting up other MPI implementations on others distros is on the azhpc-images repo.

Nota

La ejecución de trabajos de MPI en máquinas virtuales habilitadas para SR-IOV con ciertas bibliotecas MPI (como la plataforma MPI) puede requerir la configuración de claves de partición (claves p) en un inquilino para el aislamiento y la seguridad.Running MPI jobs on SR-IOV enabled VMs with certain MPI libraries (such as Platform MPI) may require setting up of partition keys (p-keys) across a tenant for isolation and security. Siga los pasos descritos en la sección Detección de claves de partición para obtener más información sobre cómo determinar los valores de la clave p y configurarlos correctamente para un trabajo de MPI con la biblioteca de MPI.Follow the steps in the Discover partition keys section for details on determining the p-key values and setting them correctly for an MPI job with that MPI library.

Nota

Los fragmentos de código siguientes son ejemplos.The code snippets below are examples. Se recomienda usar las versiones estables más recientes de los paquetes o hacer referencia al repositorio azhpc-images.We recommend using the latest stable versions of the packages, or referring to the azhpc-images repo.

UCXUCX

Unified Communication X (UCX) es un marco de API de comunicaciones para HPC.Unified Communication X (UCX) is a framework of communication APIs for HPC. Está optimizado para la comunicación de MPI a través de InfiniBand y funciona con muchas implementaciones de MPI, como OpenMPI y MPICH.It is optimized for MPI communication over InfiniBand and works with many MPI implementations such as OpenMPI and MPICH.

wget https://github.com/openucx/ucx/releases/download/v1.4.0/ucx-1.4.0.tar.gz
tar -xvf ucx-1.4.0.tar.gz
cd ucx-1.4.0
./configure --prefix=<ucx-install-path>
make -j 8 && make install

Nota

Las compilaciones recientes de UCX han corregido un problema por el que la interfaz InfiniBand adecuada se elige en presencia de varias interfaces NIC.Recent builds of UCX have fixed an issue whereby the right InfiniBand interface is chosen in the presence of multiple NIC interfaces. Aquí encontrará más detalles sobre la ejecución de MPI a través de InfiniBand cuando las redes aceleradas están habilitadas en la máquina virtual.More details here on running MPI over InfiniBand when Accelerated Networking is enabled on the VM.

HPC-XHPC-X

El Kit de herramientas de software HPC-X contiene UCX y HCOLL y se puede compilar con UCX.The HPC-X software toolkit contains UCX and HCOLL and can be built against 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
get --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

Ejecución de HPC-XRun HPC-X

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

Optimización de las comunicaciones colectivas de MPIOptimizing MPI collectives

Las primitivas de comunicación colectiva de MPI ofrecen una forma flexible y portátil de implementar operaciones de comunicación de grupos.MPI Collective communication primitives offer a flexible, portable way to implement group communication operations. Se usan ampliamente en varias aplicaciones científicas paralelas y tienen un impacto significativo en el rendimiento general de la aplicación.They are widely used across various scientific parallel applications and have a significant impact on the overall application performance. Consulte el artículo de TechCommunity para más información sobre los parámetros de configuración para optimizar el rendimiento de la comunicación colectiva mediante HPC-X y la biblioteca HCOLL para la comunicación colectiva.Refer to the TechCommunity article for details on configuration parameters to optimize collective communication performance using HPC-X and HCOLL library for collective communication.

Nota

Con HPC-X 2.7.4 +, puede que sea necesario pasar explícitamente LD_LIBRARY_PATH si la versión de UCX en MOFED frente a la de HPC-X es diferente.With HPC-X 2.7.4+, it may be necessary to explicitly pass LD_LIBRARY_PATH if the UCX version on MOFED vs. that in HPC-X is different.

OpenMPIOpenMPI

Instale UCX como se describió anteriormente.Install UCX as described above. HCOLL forma parte del kit de herramientas de software HPC-X y no requiere una instalación especial.HCOLL is part of the HPC-X software toolkit and does not requires special installation.

Se puede instalar OpenMPI desde los paquetes disponibles en el repositorio.OpenMPI can be installed from the packages available in the repo.

sudo yum install –y openmpi

Se recomienda crear una versión más reciente y estable de OpenMPI con UCX.We recommend building a latest, stable release of OpenMPI with 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

Para obtener un rendimiento óptimo, ejecute OpenMPI con ucx y hcoll.For optimal performance, run OpenMPI with ucx and hcoll.

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

Compruebe la clave de partición como se indicó anteriormente.Check your partition key as mentioned above.

Intel MPIIntel MPI

Descargue su elección de versión de Intel MPI.Download your choice of version of Intel MPI. Cambie la variable de entorno I_MPI_FABRICS según la versión.Change the I_MPI_FABRICS environment variable depending on the version.

  • Intel MPI 2019 y 2021: uso I_MPI_FABRICS=shm:ofi, I_MPI_OFI_PROVIDER=mlx.Intel MPI 2019 and 2021: use I_MPI_FABRICS=shm:ofi, I_MPI_OFI_PROVIDER=mlx. El proveedor mlx usa UCX.The mlx provider uses UCX. Se ha descubierto que la utilización de verbos es inestable y tiene menos rendimiento.Usage of verbs has been found to be unstable and less performant. Para más detalles, consulte el artículo TechCommunity.See the TechCommunity article for more details.
  • Intel MPI 2018: uso I_MPI_FABRICS=shm:ofaIntel MPI 2018: use I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: uso I_MPI_DAPL_PROVIDER=ofa-v2-ib0Intel MPI 2016: use I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Máquinas virtuales que no son SR-IOVNon SR-IOV VMs

En el caso de las máquinas virtuales que no son SR-IOV, un ejemplo de descarga de la versión de evaluación gratuita del runtime 5.x es el siguiente:For non SR-IOV VMs, an example of downloading the 5.x runtime free evaluation version is as follows:

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

Para ver los pasos de instalación, vea la guía de instalación de la Biblioteca de Intel MPI.For installation steps, see the Intel MPI Library Installation Guide. Si lo desea, habilite ptrace para los procesos que no son de depurador no raíz (necesario para las versiones más recientes de Intel MPI).Optionally, you may want to enable ptrace for non-root non-debugger processes (needed for the most recent versions of Intel MPI).

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

SUSE LinuxSUSE Linux

Para las versiones de imágenes de máquina virtual de SUSE Linux Enterprise Server SLES 12 SP3 para HPC, SLES 12 SP3 para HPC (Premium), SLES 12 SP1 para HPC, SLES 12 SP1 para HPC (Premium), SLES 12 SP4 y SLES 15, los controladores RDMA se instalan y los paquetes de Intel MPI se distribuyen en la máquina virtual.For SUSE Linux Enterprise Server VM image versions - SLES 12 SP3 for HPC, SLES 12 SP3 for HPC (Premium), SLES 12 SP1 for HPC, SLES 12 SP1 for HPC (Premium), SLES 12 SP4 and SLES 15, the RDMA drivers are installed and Intel MPI packages are distributed on the VM. Instale MPI ejecutando el comando siguiente:Install Intel MPI by running the following command:

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

MVAPICH2MVAPICH2

Compile MVAPICH2.Build MVAPICH2.

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

Ejecute MVAPICH2.Running MVAPICH2.

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

MPI de plataformaPlatform MPI

Instale los paquetes necesarios para la Plataforma MPI de edición Community.Install required packages for 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

Siga el proceso de instalación.Follow the installation process.

Los siguientes comandos son ejemplos de ejecución de MPI pingpong y admite varias mediante la plataforma MPI en VM HBv3 usando imágenes de VM de CentOS-HPC 7.6, 7.8 y 8.1.The following commands are examples of running MPI pingpong and allreduce using Platform MPI on HBv3 VMs using CentOS-HPC 7.6, 7.8, and 8.1 VM images.

/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

MPICHMPICH

Instale UCX como se describió anteriormente.Install UCX as described above. Compile MPICH.Build 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

Ejecute MPICH.Running MPICH.

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

Compruebe la clave de partición como se indicó anteriormente.Check your partition key as mentioned above.

Pruebas comparativas OSU MPIOSU MPI Benchmarks

Descargue los bancos de pruebas de MPI de OSU y descomprima el archivo.Download OSU MPI Benchmarks and 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

Compilar las pruebas comparativas con una biblioteca de MPI particular:Build Benchmarks using a particular MPI library:

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

Las pruebas comparativas de MPI están en la carpeta mpi/.MPI Benchmarks are under mpi/ folder.

Detección de claves de particiónDiscover partition keys

Detecte las claves de partición (p-keys) para comunicarse con otras máquinas virtuales dentro del mismo inquilino (conjunto de disponibilidad o conjunto de escalado de máquinas virtuales).Discover partition keys (p-keys) for communicating with other VMs within the same tenant (Availability Set or Virtual Machine Scale Set).

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

La mayor de las dos es la clave de inquilino que debe usarse con MPI.The larger of the two is the tenant key that should be used with MPI. Ejemplo: Si las siguientes son las claves p, se debe usar 0x800b con MPI.Example: If the following are the p-keys, 0x800b should be used with MPI.

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

Utilice la partición que no sea la clave de partición predeterminada (0x7fff).Use the partition other than default (0x7fff) partition key. UCX requiere el MSB de la clave p para borrarse.UCX requires the MSB of p-key to be cleared. Por ejemplo, establezca UCX_IB_PKEY como 0x000b para 0x800b.For example, set UCX_IB_PKEY as 0x000b for 0x800b.

Tenga en cuenta también que, siempre y cuando el inquilino exista (conjunto de disponibilidad o conjunto de escalado de máquinas virtuales), las PKEY seguirán siendo las mismas.Also note that as long as the tenant (Availability Set or Virtual Machine Scale Set) exists, the PKEYs remain the same. Esto sucede incluso cuando se agregan o eliminan nodos.This is true even when nodes are added/deleted. Los nuevos inquilinos obtienen PKEY diferentes.New tenants get different PKEYs.

Configuración de los límites de usuario para MPISet up user limits for MPI

Configure los límites de usuario para MPI.Set up user limits for MPI.

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

Configure las claves SSH para MPISet up SSH keys for MPI

Configure las claves SSH para los tipos MPI que lo requieran.Set up SSH keys for MPI types that require it.

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

La sintaxis anterior asume un directorio principal compartido; de lo contrario, hay que copiar el directorio.ssh a cada nodo.The above syntax assumes a shared home directory, else .ssh directory must be copied to each node.

Pasos siguientesNext steps