Настройка интерфейса 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.
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
что общий домашний каталог должен быть скопирован на каждый узел.
Следующие шаги
- Узнайте о виртуальных машинах серии HB с поддержкой InfiniBand и серии N.
- Ознакомьтесь с обзором серии HBv3 и обзором серии HC.
- Ознакомьтесь со статьей Оптимальное размещение процессов MPI для виртуальных машин серии HB.
- Ознакомьтесь с последними объявлениями, примерами рабочей нагрузки HPC, а также результатами оценки производительности в блогах технического сообщества Вычислений Azure.
- Сведения о более высоком уровне архитектурного представления выполнения рабочих нагрузок HPC см. в статье Высокопроизводительные вычисления (HPC) в Azure.