設定 HPC 的訊息傳遞介面

警告

本文參考 CentOS,這是接近結束生命週期 (EOL) 狀態的 Linux 發行版本。 請據以考慮您的使用和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引

適用於: ✔️ Linux VM ✔️ Windows VM ✔️ 彈性擴展集 ✔️ 統一擴展集

訊息傳遞介面 (MPI) 為開放程式庫,也是分散式記憶體平行處理的業界標準。 該介面廣泛運用於許多 HPC 工作負載。 在支援 RDMAHB 系列N 系列 VM 上,HPC 工作負載可使用 MPI透過低延遲和高頻寬的 InfiniBand 網路來通訊。

  • 在 Azure 上啟用 SR-IOV 的 VM 大小,幾乎可搭配任何類型的 MPI 使用 Mellanox OFED。
  • 在未啟用 SR-IOV 的 VM 上,支援的 MPI 實作則使用 Microsoft Network Direct (ND) 介面在 VM 之間通訊。 因此,僅支援 Microsoft MPI (MS-MPI) 2012 R2 以上版本和 Intel MPI 5.x 版本。 Intel MPI 執行階段程式庫的較新版本 (2017 和 2018) 可能與 Azure RDMA 驅動程式不相容。

針對已啟用 SR-IOV 支援 RDMA 的 VMUbuntu-HPC VM 映像AlmaLinux-HPC VM 映像適用。 這些 VM 映像會隨 RDMA 的 OFED 驅動程式最佳化並預先載入,最簡單的入門方式則是使用各種常用的 MPI 程式庫及科學運算套件。

此處雖為 RHEL/CentOS 範例,但屬於一般步驟,且可用於任何相容的 Linux 作業系統,例如 Ubuntu (18.04, 20.04, 22.04) 和 SLES (12 SP4 和 15 SP4)。 如需在其他發行版本上設定其他 MPI 實作的更多範例,請參閱 azhpc-images 存放庫

注意

若在啟用 SR-IOV 的 VM 上以特定 MPI 程式庫 (如 Platform MPI) 執行 MPI 作業,則可能需要在租用戶之間設定分割區索引鍵 (p 索引鍵),以達到隔離及安全性。 如需了解判斷 p 索引鍵值、使用該 MPI 程式庫正確設定 MPI 作業值的詳細資料,請遵循探索分割區索引鍵區段中的步驟。

注意

程式碼片段範例如下。 建議使用套件的最新穩定版本,或參考 azhpc-images 存放庫

選擇 MPI 程式庫

若 HPC 應用程式建議使用特定的 MPI 程式庫,請先嘗試使用該版本。 若 MPI 的選擇有彈性空間,且要取得最佳效能,可嘗試使用 HPC-X。 整體而言,為 InfiniBand 介面使用 UCX 架構時 HPC-X MPI 的執行效能最佳,且可充份善用 Mellanox InfiniBand 硬體與軟體功能。 此外,HPC-X 及 OpenMPI 也與 ABI 相容,因此您可使用 OpenMPI 所建置的 HPC-X,以動態方式執行 HPC 應用程式。 同樣地,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

下列命令說明 HPCX 與 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 指定在每個 NUMA 網域中執行的 MPI 流程數目。 例如,若要為每個 NUMA 指定四個 MPI 處理序,可使用 --map-by ppr:4:numa:pe=1
$NUMBER_THREADS_PER_PROCESS 指定每個 MPI 處理序的執行緒數目。 例如,若要為每個 NUMA 指定一個 MPI 處理序與四個執行緒,可使用 --map-by ppr:1:numa:pe=4
-report-bindings 列印對應至核心的 MPI 處理序,如此有助於確認固定 MPI 處理序正確無誤。
$MPI_EXECUTABLE 指定在 MPI 程式庫中已建置連結的 MPI 可執行檔。 MPI 編譯器包裝函式會自動進行此作業。 例如:mpiccmpif90

執行 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 集合」通訊基本系列可為群組通訊作業提供一種可攜式、高彈性的實作方式。 這可廣泛用於各類科學平行應用程式,且對整體應用程式效能有重大影響。 請參閱 TechCommunity 一文,了解進行集合通訊時使用 HPC-X 和 HCOLL 程式庫的組態參數詳細資料,以最佳化集合通訊效能。

例如,若您懷疑緊密結合的 MPI 應用程式正在進行大量的集體通訊,可嘗試啟用階層集體 (HCOLL)。 若要啟用這些功能,請使用下列參數。

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

注意

使用 HPC-X 2.7.4+ 時,若 MOFED 上的 UCX 版本與 HPC-X 的版本不同,則可能須明確傳遞 LD_LIBRARY_PATH。

OpenMPI

依上述安裝 UCX。 HCOLL 屬於 HPC-X 軟體工具組 的一部分,無須特殊安裝。

OpenMPI 可從存放庫的可用封裝進行安裝。

sudo yum install –y openmpi

建議使用 UCX 建置穩定的最新 OpenMPI 版本。

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

若要獲得最佳效能,請使用 ucxhcoll 執行 OpenMPI。 另請參閱 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 版本從 OpenFabrics Alliance (OFA) 架構切換為 OpenFabrics Interfaces (OFI) 架構,且目前支援 Libfabric。 InfiniBand 支援有兩個提供者:mlx 與 verbs。 視版本變更 I_MPI_FABRICS 環境變數。

  • Intel MPI 2019 和 2021:使用 I_MPI_FABRICS=shm:ofiI_MPI_OFI_PROVIDER=mlxmlx 提供者使用 UCX。 使用 verbs 已證實不穩定且效能較低。 如需詳細資訊,請參閱 TechCommunity 一文。
  • Intel MPI 2018:使用 I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016:使用 I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Intel MPI 2019 Update 5+ 建議使用以下幾個 mpirun 引數。

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 Update 5+ 支援提供者 MLX,同時使用 UCX 架構與 InfiniBand 進行通訊。 其也支援 HCOLL。

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

非 SR-IOV VM

針對非 SR-IOV VM,下載 5.x 執行階段免費評估版本的範例如下所示:

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

如需安裝步驟,請參閱 Intel MPI Library 安裝指南 \(英文\)。 此外,您也可能希望針對非根、非偵錯工具的處理序啟用 ptrace (Intel MPI 最新版本所需)。

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

SUSE Linux

針對 SUSE Linux Enterprise Server VM 映像版本 - SLES 12 SP3 for HPC、SLES 12 SP3 for HPC (進階版)、SLES 12 SP1 for HPC (進階版)、SLES 12 SP4 和 SLES 15:RDMA 驅動程式會安裝於 VM,且 Intel MPI 套件會散佈至 VM。 執行下列命令以安裝 Intel 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 指定是否要取得每個處理序所使用之主機通道介面卡的相關偵錯資訊。

Platform MPI

安裝 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

請遵循安裝流程。

下列命令範例示範如何使用 CentOS-HPC 7.6、7.8 和 8.1 VM 映像,在 HBv3 VM 上使用 Platform MPI 執行 MPI pingpong 和 allreduce。

/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

依上述安裝 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 索引鍵),以便與相同租用戶 (可用性設定組或虛擬機器擴展集) 中的其他 VM 通訊。

/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

注意介面在 HPC VM 映像內命名為 mlx5_ib*

另請注意,只要租用戶 (可用性設定組或虛擬機器擴展集) 存在,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

設定 MPI 的 SSH 金鑰

設定 MPI 類型所需的 SSH 金鑰。

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 目錄須複製至各節點。

下一步