在 Compute Engine 上執行緊密結合的 HPC 應用程式的最佳做法

本文件提供調整 Google Cloud 資源的最佳做法,以獲得最佳的訊息傳遞介面 (MPI) 效能。緊密結合的高效能運算 (HPC) 工作負載通常會使用 MPI 在程序與執行個體之間進行通訊。適當地調整基礎系統和網路基礎架構是最佳化 MPI 效能的關鍵。如果您是在 Google Cloud 中執行 MPI 型程式碼,請使用下列方法取得最佳效能。

假設和相關規定

工作負載排程器 (例如 SlurmHTCondor) 則用於管理執行個體。本文中的建議和最佳做法適用於所有排程器和工作流程管理員。

使用不同排程工具或工作流程工具實作這些最佳做法,不在本文的討論範圍內。其他文件和教學課程也提供這些工具適用的工具和指南。

本文件中的指南僅為一般做法,可能不適用於部分應用程式。建議您對應用程式進行基準化,以找出最具效率或符合成本效益的設定。

使用預先設定的 HPC VM 映像檔

除了使用本文介紹的最佳做法以外,您可以使用 HPC 虛擬機器 (VM) 映像檔 (CentOS),這些映像檔已針對緊密結合的 MPI 工作負載最佳化, HPC VM 映像檔會封裝這些最佳做法,而且不會透過 Google Cloud Marketplace 免費提供。詳情請參閱建立支援 HPC 的 VM 執行個體一文。

使用 Bash 或 Ansible 套用設定

Google 提供使用 Bash 指令碼或 Ansible 指令碼套用 Compute Engine 執行個體時,可套用這些最佳化方法或最佳做法的最佳做法。這些指令碼位於 Google HPC-Tools GitHub 存放區中。指令碼支援多個選項,可讓您套用個別設定或同時套用多項設定。

Compute Engine 設定

本節包含讓應用程式發揮最佳運算效能的最佳做法。在系統中使用適當的機器類型和設定可能會對 MPI 效能造成重大影響。

使用精簡刊登位置政策

放置政策可讓您控制虛擬機器中虛擬機器 (VM) 的位置。精簡刊登位置的政策可為單一可用區域提供 VM 刊登位置的低延遲拓撲。現有的 API 可讓您建立近 22 個運算最佳化 (C2) VM,彼此靠近。如果您需要超過 22 個 C2 執行個體 (超過 660 個實體核心),請將執行個體分成多個刊登位置政策。我們建議採用符合工作負載需求的最低刊登位置政策。

如要使用刊登位置政策,首先請建立包含同一位置所需 VM 數量的共置刊登位置政策:

gcloud compute resource-policies create group-placement \
    PLACEMENT_POLICY_NAME --collocation=collocated \
    --vm-count=NUMBER_OF_VMS

然後使用適用區域中的政策建立執行個體:

gcloud compute instances create instance-1 \
    instance-2...instance-n --zone=us-central1-a \
    --resource-policies=PLACEMENT_POLICY_NAME \
    --maintenance-policy=TERMINATE ...

在某些情況下,您可能無法直接控制 VM 的建立方式。例如,可能會使用某些未整合的第三方工具建立 VM。如要將刊登位置政策套用至現有的 VM,請先停止 VM,然後執行下列指令:

gcloud compute instances add-resource-policies \
    instance-1 instance-2...instance-n --zone=us-central1-a \
    --resource-policies=PLACEMENT_POLICY_NAME

使用運算最佳化執行個體

建議您使用 C2 執行個體執行 HPC 應用程式。這些執行個體擁有固定的虛擬核心對應功能,並向訪客 OS 公開 NUMA 儲存格架構,對於效能緊密的 HPC 而言至關重要。

C2 執行個體最多可以有 60 個 vCPU (30 個實體核心) 和 240 GB RAM。也可以搭載最多 3 TB 的本機 SSD 儲存空間,並能支援高達 32 Gbps 的網路總處理量。C2 執行個體也會利用第二代 Intel Xeon 可擴充處理器 (Cascade Lake) 這種記憶體容量,以及比其他執行個體類型更高的時鐘速度 (最高可達 3.8 GHz)。與 N1 執行個體類型相比,C2 執行個體通常能提升高達 40% 的效能。

為了減少機器之間的通訊量,建議您將工作負載合併成少量的 C2-standard-60 VM (具有相同核心總數),而不要啟動較大的 C2 規模 VM。

停用超執行緒功能

部分 MPI 應用程式會在客體 OS 中停用 Hyper-Thread 來提升效能。超執行緒會在節點上的每個實體核心分配兩個虛擬核心 (vCPU)。針對需要進行大量 I/O 的廣泛運算工作或工作,超執行緒功能可以大幅增加應用程式的總處理量。針對由兩個虛擬核心運算運算的運算工作,Hyper-Thread 可能會阻礙整體應用程式效能,並導致工作產生非確定性變異數。關閉超執行緒功能可以提高預測效能,並減少工作時間。

您可以透過線上或重新啟動的方式停用 C2、N1-Ultramem 和 N2 執行個體上的超執行緒功能。

如要停用線上超執行緒功能,請使用 Manage_Hyperthreading.sh 之類的指令碼,該指令碼會設定有效的 CPU。

如要停用「超執行緒」功能,請在 /etc/default/grubGRUB_CMDLINE_LINUX 字串中加入以下內容,其中 NUM_CPU 是執行個體中的 vCPU 數除以 2。例如,如果是 C2-standard-60 執行個體,NUM_CPU 會是 30。

noht nosmt nr_cpus=NUM_CPU

變更 grub 檔案之後,請執行下列指令來更新 GRUB 系統設定檔,然後重新啟動系統:

sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

如果系統使用的是舊版 BIOS 啟動模式,請改為執行下列指令:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

重新啟動後,如要確認在系統中停用 SMP (超執行緒) 功能,請使用下列指令:

lscpu | grep -e Socket -e Core -e Thread

輸出結果類似以下內容,其中停用超執行緒功能時,Thread(s) per core1,而啟用超執行緒功能時則為 2

Thread(s) per core:    1
Core(s) per socket:    15
Socket(s):             2

調整使用者限制

Unix 系統對系統資源 (例如開放檔案) 和任何使用者數量的程序數量均設有預設限制。這些限制可以防止一位使用者濫用系統資源以及影響其他使用者的工作。然而在 HPC 環境中,這些限制通常不需要必要,因為使用者直接在叢集裡共用運算節點。

您可以編輯 /etc/security/limits.conf 檔案並重新登入節點,即可調整使用者限制。如果是自動化作業,您可以將這些變更導入 VM 映像檔中,或使用 Deployment Manager、Terraform 或 Ansible 等工具來調整部署中的限制。

調整使用者限制時,變更下列限制的值:

  • nproc:程序數量上限
  • memlock - 鎖定記憶體內位址空間 (KB)
  • stack:最大堆疊大小 (KB)
  • nofile:可開啟的檔案數量上限
  • cpu:CPU 時間上限 (分鐘)
  • rtprio:允許未獲得授權的程序即時優先順序 (Linux 2.6.12 以上版本)

這些限制適用於大多數 Unix 和 Linux 系統 (包括 Debian、CentOS 和 Red Hat) 的 /etc/security/limits.conf 系統設定檔。

如要變更使用者人數限制,請使用文字編輯器變更下列值:

  • /etc/security/limits.conf 中:

    *            -     nproc     unlimited
    *            -     memlock   unlimited
    *            -     stack     unlimited
    *            -     nofile    1048576
    *            -     cpu       unlimited
    *            -     rtprio    unlimited
    
  • /etc/security/limits.d/20-nproc.conf 中:

    *            -    nproc      unlimited
    

設定 SSH 主機金鑰

Intel MPI 需要執行 mpirun 的節點 ~/.ssh/known_hosts 檔案中所有叢集節點的主機金鑰。您也必須將安全殼層金鑰儲存在 authorized_keys 中。

如要新增主機金鑰,請執行下列指令:

ssh-keyscan -H 'cat HOSTFILE' >> ~/.ssh/known_hosts

另一種做法是將StrictHostKeyChecking=no~/.ssh/config的檔案:

Host *
StrictHostKeyChecking no

儲存

許多 HPC 應用程式的效能主要取決於基礎儲存系統的效能。特別適合讀取或寫入大量資料,或者建立或存取多個檔案或物件的應用程式。而許多排名同時存取儲存系統也是如此。

選擇 NFS 檔案系統或平行檔案系統

以下是緊密結合的應用程式的主要儲存空間選項。每個選項都有自己的費用、效能設定檔、API 以及一致性語意:

  • NFS 型解決方案 (例如 Filestore 和 NetApp Cloud Volumes) 是部署共用儲存空間選項的最簡單。這兩個選項都在 Google Cloud 中全代管,當應用程式沒有對單一資料集有極大的 I/O 需求時,而且在應用程式的每個運算節點之間沒有共用資料進行更新和更新。如要瞭解效能限制,請參閱 FilestoreNetApp Cloud Volumes 說明文件。
  • MPI 應用程式大多使用 POSIX 平行檔案系統。POSIX 型選項包括開放原始碼 Lustre,以及完整支援的 Lustre 服務 DDN Storage EXAScaler Cloud。運算節點產生和共用資料時,通常會依賴平行檔案系統提供的延伸效能,並且支援完整的 POSIX 語意。平行檔案系統 (例如 Lustre) 會將資料提供給最大的超級電腦,並支援數千個用戶端。Lustre 也支援資料和 I/O 程式庫,例如 NetCDFHDF5 ,以及 磁振米指數,可為各種應用程式網域啟用平行 I/O。

選擇儲存基礎架構

應用程式效能要求應針對所選檔案系統使用儲存基礎架構或儲存空間級別。例如,如果您為不需要每秒高 I/O 作業的應用程式 (IOPS) 部署 SSD,您可能需要增加成本,但並不會增加好處。

代管儲存服務 FilestoreNetApp Cloud Volumes 提供多個容量可以依據容量調度資源。

如要判斷開放原始碼 LustreDDN Storage EXAScaler Cloud 的正確基礎架構,您必須先瞭解必須使用標準永久磁碟、SSD 永久磁碟或本機 SSD 來達到所需的效能。如要進一步瞭解如何判定基礎架構,請參閱區塊儲存空間效能資訊最佳化永久磁碟效能。舉例來說,如果您使用 Lustre,則可針對中繼資料伺服器使用 SSD 永久磁碟,以及儲存伺服器 (OSS) 的標準永久磁碟,藉此部署低成本及高頻寬解決方案。

網路設定

對於許多 HPC 應用程式而言,MPI 網路效能非常重要。如果不同節點的 MPI 處理程序頻繁地通訊或具有大量資料,這項功能就特別實用。本節包含調整網路設定的最佳做法,以獲得最佳 MPI 效能。

增加 tcp_*mem 設定

C2 機器最多支援 32 Gbps 頻寬,且需要比預設的 Linux 設定更大的 TCP 記憶體。如要提高網路效能,請增加 tcp_mem 值。

如要提高 TCP 記憶體限制,請在 /etc/sysctl.conf 中更新下列值:

net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216

如要在 /etc/sysctl.conf 中載入新值,請執行 sysctl -p

使用網路延遲設定檔

如要提升部分應用程式的效能,可以啟用忙碌輪詢。 忙碌輪詢可讓通訊端層程式碼輪詢網路裝置的接收佇列,並停用網路中斷,藉此降低網路接收路徑的延遲時間。評估應用程式延遲狀況,瞭解是否有輪詢輪詢資源能提供協助。

重新啟動後,網路延遲設定檔會持續存在。如果您的系統已安裝 tuned-adm,則可在 CentOS 中執行下列指令,啟用網路延遲設定檔:

tuned-adm profile network-latency

如果您的系統未安裝 tuned-adm,您可以將下列指令新增至 /etc/sysctl.conf 來啟用輪詢功能:

net.core.busy_poll = 50
net.core.busy_read = 50

如要在 /etc/sysctl.conf 中載入新值,請執行 sysctl -p

MPI 程式庫和使用者應用程式

MPI 程式庫設定與 HPC 應用程式設定可能會影響應用程式效能。如要讓 HPC 應用程式發揮最佳效能,您必須微調這些設定或設定。本節包含調整 MPI 程式庫和使用者應用程式的最佳做法,以提供最佳 MPI 效能。

使用 Intel MPI

為獲得最佳效能,建議您使用 Intel MPI

針對 Intel MPI 2018 版本,指定基礎通訊布料,以便在 Google Cloud 上執行時,僅使用共用記憶體的共用服務供應商:

mpirun -hostfile HOSTFILE -np NUM_PROCESSES \
    -ppn PROCESSES_PER_NODE -genv I_MPI_FABRICS "shm:tcp" APPLICATION

如果是 Intel MPI 2019+ 版本,請指定基礎通訊布料,使其使用 RxM OFI 供應商做為 TCP 以提高效能:

mpirun -hostfile HOSTFILE -np NUM_PROCESSES \
    -ppn PROCESSES_PER_NODE -genv I_MPI_FABRICS "ofi_rxm;tcp" APPLICATION

使用 Impune 進行 MPI 收集

Intel MPI 和 OpenMPI 等 MPI 實作了許多會影響通訊效能的內部設定參數。這些參數與 MPI 收集功能特別相關,後者可讓您指定可在 Google Cloud 環境中執行的演算法和設定參數。強烈建議您根據應用程式的特性來調整設定參數。

如要手動指定 MPI 收集通訊的演算法和設定參數,建議您使用 mpitune。如要執行 mpitune 指令,您必須擁有目錄的寫入權限,或是以 root 身分執行指令。

當您使用 mpitune 時,我們會調整每個 VM 數量和 VM 程序數量的組合。舉例來說,如果您使用的是 2018 MPI 2018 版本,您可以執行下列指令,為每個 VM 微調 22 個 VM 和 30 個程序:

mpitune -hf HOSTFILE -fl 'shm:tcp' -pr 30:30 -hr 22:22

上述 mpitune 指令會在 Intel MPI 目錄中產生設定檔,方便您稍後執行應用程式。

如要使用應用程式的調整設定,請將 -tune 選項新增至 mpirun 指令:

mpirun -tune -hostfile HOSTFILE -genv I_MPI_FABRICS 'shm:tcp' -np 660 -ppn 30 ./app

如要啟用調整功能,您必須明確提供 I_MPI_FABRICS 環境變數,以及每個 VM 的節點數量和調整期間使用的值數必須相符。

您可以在 Intel MPI 安裝目錄 (intel/mpi/2018.1/etc64) 中找到產生的調整檔案。

檔案名稱會將裝置、節點數量和其他資訊進行編碼,例如:

mpiexec_shm-tcp_nn_22_np_660_ppn_30.conf

您可以將檔案複製到對應的目錄,並將 -tune 選項新增至 mpirun 指令,即可在一組具有類似配置的 VM 上重複使用檔案。您也可以選擇在 -tune 參數之後,將設定檔新增為引數。

使用 MPI OpenMP 混合模式

許多 MPI 應用程式都支援一種混合模式,可用於在 MPI 應用程式中啟用 OpenMP。在混合模式下,每個 MPI 程序都可以利用固定數量的執行緒來加快特定循環結構的執行作業。

如要最佳化應用程式效能,我們建議您探索混合模式選項。使用混合模式可減少每個 VM 的 MPI 程序,進而減少跨程序的通訊,並降低整體溝通時間。

請務必啟用混合模式或 OpenMP。在大多數情況下,您可以透過設定下列環境變數來啟用混合模式:

export OMP_NUM_THREADS=NUM_THREADS

當您使用這種混合型方法時,建議執行緒總數不應超過 VM 中的實體核心數量。C2-standard-60 VM 有 2 個 NUMA 通訊端,共 15 個核心,30 個 vCPU。建議您使用沒有任何 NUMA 節點的 OpenMP 執行緒來處理任何 MPI 程序。

使用向量指示和 Math Kernel 程式庫編譯應用程式

C2 VM 支援 AVX2, AVX512 向量操作說明。您可以利用填充式操作說明編譯這些 HPC 應用程式的效能。但當您使用 AVX2 時而不是 AVX512,則部分應用程式的效能較佳。我們建議您嘗試為工作負載採用這兩個操作說明。如要提昇科學運算成效,我們還建議使用 Intel Math Kernel Library (Intel MKL)

使用適當的 CPU 編號

C2-standard-60 具有兩個 NUMA 通訊端,而 CPU 是依 NUMA 節點數來計算,如下所示:

NUMA node0 CPU(s):     0-14,30-44
NUMA node1 CPU(s):     15-29,45-59

下圖說明 C2standard-60 執行個體的 NUMA 節點中每個 CPU 的指派作業。通訊端 0 對應於 CPU 0-4 和 3044 的 NUMA 節點 0。通訊端 1 對應於 CPU 15-29 和 45-59 個 CPU 的 NUMA 節點 1。

C2-standard-60 節點的虛擬核心編號。

對應至 VM 中單一核心的超執行緒間執行緒 (0,30)(1,31)..(29,59) ,才能使用 Android 手機或平板電腦尋找另一部裝置。

Intel MPI 使用 NUMA CPU 號碼做為 MPI 工作的處理器。如果您想在所有執行中,所有節點之間都使用單一超執行緒,請使用 0 到 29 版的 CPU 號碼。

開放式 MPI 會使用可攜式硬體位置 (hwloc) 回報的邏輯 CPU 數字。 如果您使用 Open MPI,則每個執行緒的同層級連結都會按以下方式連續編號:

  • 通訊端 0:0 (核心 0 HT 0)、1 (核心 0 HT 1)、2 (核心 1 HT 0) 、...,28 (核心 14 HT 0)、29 (核心 14 HT 1)

  • 通訊端 1:30 (核心 0 HT 0)、31 (核心 0 HT 1)、2 (核心 1 HT 0) 、...,58 (核心 14 HT 0)、59 (核心 14 HT 1)

輸出內容如下:

lstopo-no-graphics
Machine (240GB total)
  NUMANode L#0 (P#0 120GB) + Package L#0 + L3 L#0 (25MB)
    L2 L#0 (1024KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
      PU L#0 (P#0)
      PU L#1 (P#30)
    L2 L#1 (1024KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
      PU L#2 (P#1)
      PU L#3 (P#31)

使用 Open MPI 時,您可以使用 CPU 編號 0,2,4,..58,在所有節點之間使用一致執行緒的超執行緒, 如要強制 MPI 將程序固定到核心,請在執行 openMPI 時使用 --bind-to core 選項,然後使用 --report-bindings 選項驗證正確的繫結。

安全性設定

您可以停用一些內建的 Linux 安全性功能來改善 MPI 效能。因為停用這些功能會對成效帶來極大好處。 如果您確信自己的系統受到充分保護,則可評估下列安全性功能。

停用 Linux 防火牆

如果使用的是 Google Cloud CentOS Linux 映像檔,防火牆預設為啟用。如要停用防火牆,請停止並停用 firewalld Daemon:

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask --now firewalld

停用 SELinux

CentOS 中的 SELinux 預設為開啟。如要停用 SELinux,請編輯 /etc/selinux/config 檔案,並將 SELINUX=enforcingSELINUX=permissive 行替換為 SELINUX=disabled

您必須重新啟動,這項變更才會生效。

關閉 Metredown 和 Spectre 緩解方法

Linux 系統預設會啟用下列安全性修補程式:

  • 版本 1、Spectre:CVE-2017-5753
  • 版本 2 (規格):CVE-2017-5715
  • 版本 3、Meltdown:CVE-2017-5754
  • 版本 4,規格儲存庫:CVE-2018-3639

現代化微處理器中可能指出這些 CVE 中所列出的安全漏洞,包括部署在 Google Cloud 中的處理器。您可以停用一或多個這些緩解方法,並產生關聯的安全性風險,方法是在啟動時使用核心指令列 (每次重新啟動時) 或使用 debugfs ( 。

如要永久停用上述安全緩解措施,請按照下列步驟操作:

  1. 修改 /etc/default/grub 檔案:

    sudo sed -i 's/^GRUB_CMDLINE_LINUX=\"\(.*\)\"/GRUB_CMDLINE_LINUX=\"\1 spectre_v2=off nopti spec_store_bypass_disable=off\"/' /etc/default/grub
    
  2. 變更 grub 檔案之後,請執行下列指令以更新 GRUB 系統設定檔,然後重新啟動系統:

    sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
    

    如果系統使用的是舊版 BIOS 啟動模式,請改為執行下列指令:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  3. 重新啟動。

如果系統已經執行,您可以執行下列指令停用先前的安全性緩解措施。這種情況不會因重新啟動而遺失。

echo 0 > /sys/kernel/debug/x86/pti_enabled
echo 0 > /sys/kernel/debug/x86/retp_enabled
echo 0 > /sys/kernel/debug/x86/ibrs_enabled
echo 0 > /sys/kernel/debug/x86/ssbd_enabled

如要瞭解不同緩解方式如何影響系統及控制的方式,請參閱 Red Hat 說明文件控制微程式碼和安全性修補程式的效能影響略過使用推薦商店的核心通道攻擊,才能使用 Android 手機或平板電腦尋找另一部裝置。

如要找出 CPU 的安全漏洞,請執行下列指令:

grep . /sys/devices/system/cpu/vulnerabilities/*

如要找出已啟用的緩解方法,請執行下列指令:

grep . /sys/kernel/debug/x86/*_enabled

檢查清單摘要

下表摘要說明在 Compute Engine 上使用 MPI 的最佳做法。

區 (Area) 工作
Compute Engine 設定
儲存
網路設定
MPI 程式庫和使用者應用程式
安全性設定

後續步驟