Бөлісу құралы:


Настройка интерфейса Message Passing Interface (MPI) для HPC

Применимо к: ✔️ Виртуальные машины Linux ✔️ Виртуальные машины Windows ✔️ Универсальные масштабируемые наборы

Интерфейс передачи сообщений (MPI) — это открытая библиотека и стандарт defacto для параллелизации распределенной памяти. Она часто используется во многих рабочих нагрузках HPC. Рабочие нагрузки HPC на виртуальных машинах с поддержкой RDMA серии HB и серии N могут использовать MPI для обмена данными по сети InfiniBand с низкой задержкой и высокой пропускной способностью.

  • Размеры виртуальных машин с поддержкой SR-IOV в Azure поддерживают использование практически всех версий MPI с Mellanox OFED.
  • Для обмена данными между виртуальными машинами, которые не поддерживают SR-IOV, поддерживаемые реализации MPI используют интерфейс Microsoft Network Direct (ND). Таким образом, поддерживаются только Microsoft MPI (MS-MPI) 2012 R2 и более поздних версий, а также Intel MPI 5.x. Более поздние версии библиотеки среды выполнения Intel MPI (2017, 2018) могут быть как совместимы, так и несовместимы с драйверами Azure RDMA.

Для виртуальных машин с поддержкой RDMA с поддержкой SR-IOV образы виртуальных машин Ubuntu-HPC и образы виртуальных машин AlmaLinux-HPC подходят. Эти образы виртуальных машин оптимизированы и предварительно загружены с драйверами OFED для RDMA и различных часто используемых библиотек MPI и научных вычислительных пакетов и проще всего приступить к работе.

Хотя примеры приведены для RHEL, но шаги являются общими и могут использоваться для любой совместимой операционной системы Linux, такой как Ubuntu (18.04, 20.04, 22.04) и SLES (12 с пакетом обновления 4 (SP4) и 15 с пакетом обновления 4 (SP4). Дополнительные примеры настройки других реализаций MPI на других дистрибутивах см. в репозитории azhpc-images.

Примечание.

Выполнение заданий MPI на виртуальных машинах с поддержкой SR-IOV с определенными библиотеками MPI (такими как платформа MPI) может потребовать настройки на клиенте ключей секций (p-ключей) с целью обеспечения изоляции и безопасности. Выполните действия, описанные в разделе Обнаружение ключей секций, чтобы узнать, как определить значения p-ключа и правильно их установить для задания MPI с помощью этой библиотеки MPI.

Примечание.

Следующие фрагменты кода приведены для примера. Рекомендуется использовать последние стабильные версии пакетов или обращаться к репозиторию azhpc-images.

Выбор библиотеки MPI

Если для приложения HPC рекомендуется определенная библиотека MPI, сначала попробуйте использовать эту версию. Если у вас есть возможность выбора MPI и вы хотите получить максимальную производительность, попробуйте использовать HPC-X. В целом HPC-X MPI работает лучше всего с платформой UCX для интерфейса InfiniBand и использует все возможности оборудования и программного обеспечения Mellanox InfiniBand. Кроме того, HPC-X и OpenMPI совместимы с ABI, поэтому вы можете динамически запускать приложение HPC с помощью средства HPC-X, которое было создано, используя OpenMPI. Intel MPI, MVAPICH и MPICH также совместимы с ABI.

На следующем рисунке показана архитектура популярных библиотек MPI.

Архитектура популярных библиотек MPI

HPC-X

Набор средств программного обеспечения HPC-X содержит UCX и HCOLL и может быть построен для 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

Следующая команда иллюстрирует некоторые рекомендуемые аргументы mpirun для HPC-X и OpenMPI.

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

где:

Параметр Описание
NPROCS Указывает количество процессов MPI. Например: -n 16.
$HOSTFILE Указывает файл, содержащий имя узла или IP-адрес, чтобы указать расположение, в котором выполняются процессы MPI. Например: --hostfile hosts.
$NUMBER_PROCESSES_PER_NUMA Указывает количество процессов MPI, выполняемых в каждом домене NUMA. Например, чтобы задать четыре процесса MPI для каждого домена NUMA, используйте --map-by ppr:4:numa:pe=1.
$NUMBER_THREADS_PER_PROCESS Указывает количество потоков на процесс MPI. Например, чтобы задать один процесс MPI и четыре потока на каждый домен NUMA, используйте --map-by ppr:1:numa:pe=4.
-report-bindings Выводит значение сопоставления процессов MPI с ядрами. Это полезно для проверки правильности закрепления процесса MPI.
$MPI_EXECUTABLE Указывает встроенную компоновку исполняемого файла MPI в библиотеках MPI. Программы-оболочки компилятора MPI делают это автоматически. Пример: mpicc или mpif90.

Ниже приведен пример выполнения микротестирования OSU для задержки.

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

Примитивы обмена данными в группе MPI предлагают гибкий, переносимый способ реализации операций обмена данными в группе. Они широко используются в различных научных параллельных приложениях и оказывают значительное влияние на общую производительность приложения. Сведения о параметрах конфигурации для оптимизации производительности обмена данными в группе с помощью HPC-X и библиотеки HCOLL для обмена данными в группе см. в статье TechCommunity.

Например, если у вас есть подозрение, что тесно связанное приложение MPI выполняет чрезмерное количество коллективных коммуникаций, можно попытаться включить Hierarchical Collectives (HCOLL). Чтобы включить эти функции, используйте следующие параметры.

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

Примечание.

При использовании HPC-X 2.7.4+ может потребоваться явная передача LD_LIBRARY_PATH, если версии UCX в MOFED и HPC-X отличаются.

OpenMPI

Установите UCX, как описано выше. HCOLL является частью набора средств программного обеспечения HPC-X и не требует специальной установки.

OpenMPI можно установить из пакетов, доступных в репозитории.

sudo yum install –y openmpi

Рекомендуется собрать последний, стабильный выпуск OpenMPI с 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

Для оптимальной производительности запустите OpenMPI с ucx и hcoll. См. также пример с 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

Проверьте ключ секции, как описано выше.

Intel MPI

Скачайте версию Intel MPI по своему выбору. Выпуск Intel MPI 2019 перешел с платформы Open Fabric Alliance (OFA) на платформу Open Fabric Interfaces (OFI) и сейчас поддерживает libfabric. Существует два поставщика поддержки InfiniBand: mlx и verbs. Измените переменную среды I_MPI_FABRICS в зависимости от версии.

  • Intel MPI 2019 и 2021: используйте I_MPI_FABRICS=shm:ofi, I_MPI_OFI_PROVIDER=mlx. Поставщик mlx использует UCX. Было обнаружено, что использование команд стало нестабильным и менее производительным. Дополнительные сведения см. в статье TechCommunity.
  • Intel MPI 2018: используйте I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: используйте I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Ниже приведены некоторые рекомендуемые аргументы mpirun для 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

где:

Параметр Описание
FI_PROVIDER Указывает, какой поставщик libfabric следует использовать, что влияет на используемые интерфейсы API, протокол и сеть. verbs является еще одним вариантом, но обычно mlx обеспечивает лучшую производительность.
I_MPI_DEBUG Указывает уровень дополнительных отладочных выходных данных, которые могут содержать сведения о том, где закреплены процессы и какие протокол и сеть используются.
I_MPI_PIN_DOMAIN Указывает способ закрепления процессов. Например, за ядрами, сокетами или доменами NUMA. В этом примере вы присваиваете этой переменной среде значение numa, то есть процессы будут закреплены за доменами узла NUMA.

Оптимизация групп MPI

Существуют и другие варианты, которые можно использовать, особенно если коллективные операции занимают значительное время. Intel MPI 2019 с обновлением 5+ поддерживает указанный mlx и использует платформу UCX для взаимодействия с InfiniBand. Он также поддерживает HCOLL.

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

Виртуальные машины без SR-IOV

Для виртуальных машин без SR-IOV пример загрузки бесплатной ознакомительной версии среды выполнения 5.x выглядит следующим образом:

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

Шаги установки см. в руководстве по установке библиотеки Intel MPI. Можно включить ptrace для некорневых процессов без отладчика (требуется для последних версий Intel MPI).

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

SUSE Linux

Для версий образа виртуальной машины SUSE Linux Enterprise Server SLES 12 SP3 для HPC, SLES 12 SP3 для HPC (Premium), SLES 12 SP1 для HPC, SLES 12 SP1 для HPC (Premium), SLES 12 SP4 и SLES 15 на виртуальной машине установлены драйверы RDMA и распределены пакеты Intel MPI. Установите MPI, выполнив следующую команду:

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

MVAPICH

Далее приведен пример сборки 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

Ниже приведен пример выполнения микротестирования OSU для задержки.

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

В приведенном ниже списке перечислены несколько рекомендуемых аргументов 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

где:

Параметр Описание
MV2_CPU_BINDING_POLICY Указывает используемую политику привязки, которая влияет на то, как процессы закрепляются за основными идентификаторами. В этом случае указывается scatter, поэтому процессы равномерно разбросаны между доменами NUMA.
MV2_CPU_BINDING_LEVEL Указывает, где следует закреплять процессы. В этом случае вы задаете значение numanode, то есть процессы закрепляются за элементами доменов NUMA.
MV2_SHOW_CPU_BINDING Указывает, необходимо ли получать отладочные сведения о том, где закреплены процессы.
MV2_SHOW_HCA_BINDING Указывает, необходимо ли получать отладочные сведения о том, какой хост-адаптер канала используется каждым процессом.

Платформа MPI

Установите необходимые пакеты для платформы 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

Выполните этапы процесса установки.

MPICH

Установите UCX, как описано выше. Выполните сборку 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

Запуск MPICH.

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

Проверьте ключ секции, как описано выше.

Тесты производительности OSU MPI

Скачайте и распакуйте тесты производительности OSU MPI.

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

Скомпилируйте тесты производительности с помощью определенной библиотеки MPI:

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

Тесты MPI находятся в папке mpi/.

Обнаружение ключей секций

Выполните обнаружение ключей секций (p-ключей) для обмена данными с другими виртуальными машинами в пределах одного клиента (группа доступности или масштабируемый набор виртуальных машин).

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

Больший из двух является ключом клиента, который следует использовать с MPI. Пример. Ниже представлены p-ключи. С MPI следует использовать 0x800b.

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

Интерфейсы заметок называются mlx5_ib* в образах виртуальных машин HPC.

Кроме того, обратите внимание, что, пока существует клиент (группа доступности или масштабируемый набор виртуальных машин), ключи PKEY остаются неизменными. Это справедливо даже при добавлении или удалении узлов. Новые клиенты получают разные ключи PKEY.

Настройка ограничений пользователей для MPI

Настройте ограничения пользователей для MPI.

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

Настройка ключей SSH для MPI

Настройте ключи SSH для типов MPI, которые этого требуют.

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

Приведенный выше синтаксис предполагает, .ssh что общий домашний каталог должен быть скопирован на каждый узел.

Следующие шаги