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

訊息傳遞介面 (MPI) 為開放程式庫,也是分散式記憶體平行處理的業界標準。 該介面廣泛運用於許多 HPC 工作負載。 支援 HB 系列 N 系列 VM 的 RDMA 工作負載可以使用 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 驅動程式不相容。
  • 支援 RDMA 的 VM 已啟用 SR-IOV,則適用 CentOS-HPC VM 映像 7.6 及更高版本。 這些 VM 映像會隨 RDMA 的 OFED 驅動程式最佳化並預先載入,最簡單的入門方式則是使用各種常用的 MPI 程式庫及科學運算套件。

    此處雖為 RHEL/CentOS 範例,但屬於一般步驟,且可用於任何相容的 Linux 作業系統,例如 Ubuntu (16.04、18.04 19.04、20.04) 和 SLES (12 SP4 和 15)。 如需在其他發行版本上設定其他 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 程式庫的架構。

    整合通訊 X (UCX) 為 HPC 的通訊 API 架構。 該架構已對透過 InfiniBand 的 MPI 通訊進行最佳化,並適用於許多 MPI 實作狀況,例如 OpenMPI 和 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
    

    近期 UCX 組建已修正問題:有多個 NIC 介面存在時,將會選擇適當的 InfiniBand 介面。 如需了解 VM 啟用加速網路時透過 InfiniBand 執行 MPI 的詳細資訊,請參閱 HPC 和 GPU VM 已知問題疑難排解

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

    最佳化 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
    

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

    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
    

    使用預設 (0x7fff) 分割區索引鍵以外的資料分割。 UCX 必須清除 p 索引鍵的 MSB。 例如,將 0x800b 的 UCX_IB_PKEY 設為 0x000b。

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

    設定 MPI 的 SSH 金鑰

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

    ssh-keygen -f /home/$USER/.ssh/id_rsa -t rsa -N ''
    cat << EOF > /home/$USER/.ssh/config
    Host *
        StrictHostKeyChecking no
    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 目錄須複製至各節點。

  • 瞭解 已啟用 InfiniBand的 HB 系列N 系列 VM
  • 檢閱 HBv3 系列概觀HC 系列概觀
  • 閱讀 HB 系列 VM 的 MPI 處理序最佳位置
  • 請參閱 Azure 計算技術社群部落格的最新公告、HPC 工作負載範例和效能結果。
  • 如需執行中 HPC 工作負載較高階的架構檢視,請參閱 Azure 上的高效能運算 (HPC)
  •