Partilhar via


Configurar o Message Passing Interface para HPC

Atenção

Este artigo faz referência ao CentOS, uma distribuição Linux com status de Fim de Vida (EOL). Por favor, considere o seu uso e planeje de acordo. Para obter mais informações, consulte as diretrizes de Fim da Vida Útil do CentOS.

Aplica-se a: ✔️ VMs ✔️ Linux VMs ✔️ do Windows Conjuntos ✔️ de escala flexíveis Conjuntos de balanças uniformes

A Message Passing Interface (MPI) é uma biblioteca aberta e padrão de facto para paralelização de memória distribuída. É normalmente utilizado em muitas cargas de trabalho de HPC. As cargas de trabalho HPC nas VMs das séries HB e N compatíveis com RDMA podem usar o MPI para se comunicar através da rede InfiniBand de baixa latência e alta largura de banda.

  • Os tamanhos de VM habilitados para SR-IOV no Azure permitem que quase qualquer tipo de MPI seja usado com o Mellanox OFED.
  • Em VMs não habilitadas para SR-IOV, as implementações MPI com suporte usam a interface Microsoft Network Direct (ND) para se comunicar entre VMs. Assim, apenas as versões Microsoft MPI (MS-MPI) 2012 R2 ou posterior e Intel MPI 5.x são suportadas. As versões posteriores (2017, 2018) da biblioteca de tempo de execução Intel MPI podem ou não ser compatíveis com os drivers RDMA do Azure.

Para VMs compatíveis com RDMA habilitadas para SR-IOV, as imagens de VM Ubuntu-HPC e as imagens de VM AlmaLinux-HPC são adequadas. Essas imagens VM vêm otimizadas e pré-carregadas com os drivers OFED para RDMA e várias bibliotecas MPI comumente usadas e pacotes de computação científica e são a maneira mais fácil de começar.

Embora os exemplos aqui sejam para RHEL / CentOS, mas as etapas são gerais e podem ser usadas para qualquer sistema operacional Linux compatível, como Ubuntu (18.04, 20.04, 22.04) e SLES (12 SP4 e 15 SP4). Mais exemplos para configurar outras implementações MPI em outras distros está no repositório azhpc-images.

Nota

A execução de trabalhos MPI em VMs habilitadas para SR-IOV com determinadas bibliotecas MPI (como a plataforma MPI) pode exigir a configuração de chaves de partição (chaves p) em um locatário para isolamento e segurança. Siga as etapas na seção Descobrir chaves de partição para obter detalhes sobre como determinar os valores de chave p e configurá-los corretamente para um trabalho MPI com essa biblioteca MPI.

Nota

Os trechos de código abaixo são exemplos. Recomendamos usar as versões estáveis mais recentes dos pacotes, ou fazer referência ao repositório azhpc-images.

Escolhendo a biblioteca MPI

Se um aplicativo HPC recomendar uma biblioteca MPI específica, tente essa versão primeiro. Se tiver flexibilidade em relação ao IPM que pode escolher e quiser o melhor desempenho, experimente o HPC-X. No geral, o HPC-X MPI tem o melhor desempenho usando a estrutura UCX para a interface InfiniBand e aproveita todos os recursos de hardware e software Mellanox InfiniBand. Além disso, HPC-X e OpenMPI são compatíveis com ABI, para que você possa executar dinamicamente um aplicativo HPC com HPC-X que foi construído com OpenMPI. Da mesma forma, Intel MPI, MVAPICH e MPICH são compatíveis com ABI.

A figura a seguir ilustra a arquitetura das populares bibliotecas MPI.

Arquitetura para bibliotecas populares do IPM

HPC-X

O kit de ferramentas de software HPC-X contém UCX e HCOLL e pode ser construído contra 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

O comando a seguir ilustra alguns argumentos mpirun recomendados para HPC-X e OpenMPI.

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

onde:

Parâmetro Description
NPROCS Especifica o número de processos MPI. Por exemplo: -n 16.
$HOSTFILE Especifica um arquivo contendo o nome do host ou endereço IP, para indicar o local onde os processos MPI são executados. Por exemplo: --hostfile hosts.
$NUMBER_PROCESSES_PER_NUMA Especifica o número de processos MPI executados em cada domínio NUMA. Por exemplo, para especificar quatro processos MPI por NUMA, use --map-by ppr:4:numa:pe=1.
$NUMBER_THREADS_PER_PROCESS Especifica o número de threads por processo MPI. Por exemplo, para especificar um processo MPI e quatro threads por NUMA, use --map-by ppr:1:numa:pe=4.
-report-bindings Imprime o mapeamento de processos MPI para núcleos, o que é útil para verificar se a fixação do processo MPI está correta.
$MPI_EXECUTABLE Especifica o executável MPI criado vinculando em bibliotecas MPI. Os wrappers do compilador MPI fazem isso automaticamente. Por exemplo: mpicc ou mpif90.

Um exemplo de execução do microbenchmark de latência OSU é o seguinte:

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

Otimizando coletivos MPI

Os primitivos de comunicação coletiva do IPM oferecem uma maneira flexível e portátil de implementar operações de comunicação em grupo. Eles são amplamente utilizados em várias aplicações científicas paralelas e têm um impacto significativo no desempenho geral do aplicativo. Consulte o artigo TechCommunity para obter detalhes sobre parâmetros de configuração para otimizar o desempenho da comunicação coletiva usando a biblioteca HPC-X e HCOLL para comunicação coletiva.

Por exemplo, se suspeitar que a sua aplicação MPI fortemente acoplada está a fazer uma quantidade excessiva de comunicação coletiva, pode tentar ativar coletivos hierárquicos (HCOLL). Para habilitar esses recursos, use os seguintes parâmetros.

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

Nota

Com o HPC-X 2.7.4+, pode ser necessário passar explicitamente LD_LIBRARY_PATH se a versão UCX no MOFED versus a versão no HPC-X for diferente.

OpenMPI

Instale o UCX conforme descrito acima. O HCOLL faz parte do kit de ferramentas de software HPC-X e não requer instalação especial.

OpenMPI pode ser instalado a partir dos pacotes disponíveis no repo.

sudo yum install –y openmpi

Recomendamos a criação de uma versão mais recente e estável do OpenMPI com 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 um desempenho ideal, execute o OpenMPI com ucx e hcoll. Veja também o exemplo com 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

Verifique a sua chave de partição como mencionado acima.

Intel MPI

Faça o download da versão escolhida do Intel MPI. A versão Intel MPI 2019 mudou da estrutura Open Fabrics Alliance (OFA) para a estrutura Open Fabrics Interfaces (OFI) e atualmente suporta libfabric. Existem dois provedores para suporte InfiniBand: mlx e verbos. Altere a variável de ambiente I_MPI_FABRICS dependendo da versão.

  • Intel MPI 2019 e 2021: use I_MPI_FABRICS=shm:ofi, I_MPI_OFI_PROVIDER=mlx. O mlx provedor usa UCX. O uso de verbos foi considerado instável e menos eficiente. Consulte o artigo TechCommunity para obter mais detalhes.
  • Intel MPI 2018: uso I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: uso I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Aqui estão alguns argumentos mpirun sugeridos para a atualização 5+ do Intel MPI 2019.

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

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

onde:

Parâmetro Description
FI_PROVIDER Especifica qual provedor libfabric usar, o que afetará a API, o protocolo e a rede usados. verbos é outra opção, mas geralmente mlx dá-lhe melhor desempenho.
I_MPI_DEBUG Especifica o nível de saída de depuração extra, que pode fornecer detalhes sobre onde os processos são fixados e qual protocolo e rede são usados.
I_MPI_PIN_DOMAIN Especifica como você deseja fixar seus processos. Por exemplo, você pode fixar núcleos, soquetes ou domínios NUMA. Neste exemplo, você define essa variável ambiental como numa, o que significa que os processos serão fixados em domínios de nó NUMA.

Otimizando coletivos MPI

Existem algumas outras opções que você pode tentar, especialmente se as operações coletivas estão consumindo uma quantidade significativa de tempo. A atualização 5+ do Intel MPI 2019 suporta o fornecer mlx e usa a estrutura UCX para se comunicar com o InfiniBand. Também suporta HCOLL.

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

VMs não SR-IOV

Para VMs não SR-IOV, um exemplo de download da versão de avaliação 5.x runtime free é o seguinte:

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

Para conhecer as etapas de instalação, consulte o Guia de instalação da biblioteca Intel MPI. Opcionalmente, você pode habilitar o ptrace para processos não-raiz não-depurador (necessário para as versões mais recentes do Intel MPI).

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

SUSE Linux

Para versões de imagem de VM do 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 e SLES 15, os drivers RDMA são instalados e os pacotes Intel MPI são distribuídos na VM. Instale o Intel MPI executando o seguinte comando:

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

MVAPICH

Segue-se um exemplo de construção de MVAPICH2. Observe que versões mais recentes podem estar disponíveis do que as usadas abaixo.

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

Um exemplo de execução do microbenchmark de latência OSU é o seguinte:

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

A lista a seguir contém vários argumentos recomendados mpirun .

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

onde:

Parâmetro Description
MV2_CPU_BINDING_POLICY Especifica qual política de vinculação usar, o que afetará como os processos são fixados às IDs principais. Nesse caso, você especifica scatter, para que os processos sejam distribuídos uniformemente entre os domínios NUMA.
MV2_CPU_BINDING_LEVEL Especifica onde fixar processos. Nesse caso, você o define como numanode, o que significa que os processos são fixados em unidades de domínios NUMA.
MV2_SHOW_CPU_BINDING Especifica se você deseja obter informações de depuração sobre onde os processos são fixados.
MV2_SHOW_HCA_BINDING Especifica se você deseja obter informações de depuração sobre qual adaptador de canal de host cada processo está usando.

Plataforma MPI

Instale os pacotes necessários para o 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 o processo de instalação.

Os comandos a seguir são exemplos de execução de pingue-pongue MPI e allreduce usando Platform MPI em VMs HBv3 usando imagens de VM CentOS-HPC 7.6, 7.8 e 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

Instale o UCX conforme descrito acima. Construa o 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

Executando o MPICH.

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

Verifique a sua chave de partição como mencionado acima.

OSU MPI Benchmarks

Download OSU MPI Benchmarks e 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

Crie benchmarks usando uma biblioteca MPI específica:

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

Os benchmarks do IPM estão na mpi/ pasta.

Descubra chaves de partição

Descubra chaves de partição (chaves p) para comunicação com outras VMs dentro do mesmo locatário (Conjunto de Disponibilidade ou Conjunto de Escala de Máquina Virtual).

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

A maior das duas é a chave de inquilino que deve ser usada com o IPM. Exemplo: Se as seguintes forem as chaves p, 0x800b devem ser usadas com MPI.

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

Observação As interfaces são nomeadas como mlx5_ib* dentro de imagens de VM HPC.

Observe também que, enquanto o locatário (Conjunto de Disponibilidade ou Conjunto de Escala de Máquina Virtual) existir, os PKEYs permanecerão os mesmos. Isso é verdade mesmo quando nós são adicionados/excluídos. Os novos inquilinos obtêm diferentes PKEYs.

Configurar limites de usuário para MPI

Configure limites de usuário para MPI.

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

Configurar chaves SSH para MPI

Configure chaves SSH para tipos de MPI que o exijam.

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 sintaxe acima pressupõe um diretório base compartilhado, caso contrário .ssh , o diretório deve ser copiado para cada nó.

Próximos passos