使用 H4D 執行高效能運算 (HPC) 工作負載


本文說明如何在 Google Kubernetes Engine (GKE) 叢集上執行高效能運算 (HPC) 工作負載,這些叢集使用 H4D 系列機器和遠端直接記憶體存取 (RDMA)

H4D 是 Compute Engine 的 HPC 最佳化機器系列。這個機器系列經過最佳化調整,可提供高效能、低成本和擴充性。H4D 適用於跨多個節點擴充的應用程式。設定為使用 RDMA 的 H4D 執行個體,節點間的網路頻寬最高可達 200 Gbps。

本頁面的操作說明使用 Google Cloud CLI,可讓您彈性設定叢集環境。或者,您可以使用 Cluster Toolkit 快速建立使用 H4D 的正式版 GKE 叢集。詳情請參閱 GKE H4D 藍圖

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。
  • 使用彈性啟動佈建模式取得 H4D VM。或者,如果您需要超過 90 天的資源,或要求超過 256 個 H4D VM,請與帳戶團隊聯絡。您也可以視所在區域的可用容量,視需要佈建 H4D VM。
  • 使用 GKE 1.32.6-gke.1060000 以上版本,在 GKE Standard 模式中建立具有預留 H4D VM 的節點集區。
  • 使用 GKE 1.33.2-gke.4731000 以上版本建立下列項目:

  • 請僅使用提供 H4D 機器類型的地點。詳情請參閱「可用地區和區域」一文中的表格,並篩選 H4D

  • 僅使用 Container-Optimized OS 節點映像檔

  • 請參閱 H4D 限制

  • 請查看如何處理主機維護作業,因為 H4D 機器類型不支援即時遷移。詳情請參閱「H4D 執行個體的維護體驗」。

  • 在下一節的指令中,替換下列值:

    • PROJECT_ID:您的Google Cloud 專案 ID。
    • CLUSTER_NAME:叢集名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。為地區叢集提供區域,或為區域叢集提供可用區。建議您對正式環境工作負載使用區域叢集。如果是地區叢集,地區必須包含 H4D 適用的區域。如果是可用區叢集,可用區必須提供 H4D。
    • COMPUTE_ZONE:節點集區的可用區。這必須是 H4D 適用的區域。 如要讓 H4D 節點與 RDMA 搭配運作,就無法建立多區域節點集區。
    • RDMA_NETWORK_PREFIX:RDMA 網路前置字元 (例如 h4d-rdma)。
    • RDMA_SUBNET_CIDR:RDMA 子網路 CIDR 範圍。請確認這個範圍不會與叢集的預設網路重疊。
    • NODE_POOL_NAME:H4D 節點集區的名稱。
    • NODE_COUNT:要在節點集區中建立的 H4D 節點數量。
    • H4D_MACHINE_TYPE:要使用的 H4D 機器類型 (例如 h4d-highmem-192-lssd)。

建立虛擬私有雲和子網路

為叢集設定預設的虛擬私有雲 (VPC) 和子網路。如果是 RDMA 網路介面卡 (NIC),請建立專屬的虛擬私有雲和子網路。按照下列操作說明建立的 VPC 會視需要使用 RDMA 網路設定檔

  1. 為 RDMA NIC 建立 HPC 虛擬私有雲:

    gcloud compute --project=PROJECT_ID \
      networks create RDMA_NETWORK_PREFIX-net \
      --network-profile=COMPUTE_ZONE-vpc-falcon \
      --subnet-mode=custom
    
  2. 為 RDMA 網路建立子網路:

    gcloud compute --project=PROJECT_ID \
      networks subnets create \
      RDMA_NETWORK_PREFIX-sub-0 \
      --network=RDMA_NETWORK_PREFIX-net \
      --region=CONTROL_PLANE_LOCATION \
      --range=RDMA_SUBNET_CIDR
    

建立具備多網路功能的 GKE 叢集

建立啟用多網路功能的 GKE 叢集。您也可以選擇使用這個指令,明確提供服務和 Pod 的次要 CIDR 範圍。

執行下列指令:

gcloud container clusters create CLUSTER_NAME --project PROJECT_ID \
  --enable-dataplane-v2 --enable-ip-alias --location=CONTROL_PLANE_LOCATION \
  --enable-multi-networking \
  [--services-ipv4-cidr=SERVICE_CIDR \
  --cluster-ipv4-cidr=POD_CIDR]

如果您使用這些選用旗標,請替換下列額外值:

  • SERVICE_CIDR:服務的次要 CIDR 範圍。
  • POD_CIDR:Pod 的次要 CIDR 範圍。

使用這些標記時,請確認 CIDR 範圍不會與其他節點網路的子網路範圍重疊。例如 SERVICE_CIDR=10.65.0.0/19POD_CIDR=10.64.0.0/19

建立 GKE 網路物件

使用 GKE 網路參數集設定虛擬私有雲網路。 套用 GKENetworkParamSetNetwork 物件:

kubectl apply -f - <<EOF
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-0
spec:
  vpc: RDMA_NETWORK_PREFIX-net
  vpcSubnet: RDMA_NETWORK_PREFIX-sub-0
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-0
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-0
EOF

建立 H4D 節點集區

建立使用 H4D 並連線至 RDMA 網路的節點集區。您可以使用受預訂限制的 H4D 節點和緊湊型放置位置。或者,您也可以使用以彈性啟動佈建的 H4D 節點。選取與消費選項對應的分頁:

取決於預留項目

  1. 建立密集配置的資源政策。緊密放置可確保節點在可用區內彼此相對位置的實體位置,藉此為跨多個節點執行的緊密結合 HPC 工作負載,提升效能。

    執行下列指令:

    gcloud compute resource-policies create group-placement POLICY_NAME \
        --region REGION --collocation collocated
    

    替換下列值:

    • POLICY_NAME:資源政策的名稱 (例如 h4d-compact)。
    • REGION:叢集所在的區域。
  2. 建立使用 H4D 並連線至 RDMA 網路的節點集區:

    gcloud container node-pools create NODE_POOL_NAME --project PROJECT_ID \
      --location=CONTROL_PLANE_LOCATION --cluster CLUSTER_NAME --num-nodes=NODE_COUNT \
      --node-locations=COMPUTE_ZONE \
      --machine-type H4D_MACHINE_TYPE \
      --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-0 \
      --placement-policy POLICY_NAME \
      --max-surge-upgrade 0  \
      --max-unavailable-upgrade MAX_UNAVAILABLE
    

    MAX_UNAVAILABLE 改成節點集區升級期間,可同時無法使用的節點數量上限。如果是緊湊型放置位置,建議快速升級,不要出現尖峰流量,以盡量在升級期間找到共置節點。

彈性啟動

建立節點集區,使用以彈性啟動佈建的 H4D 節點,並連線至 RDMA 網路:

gcloud container node-pools create NODE_POOL_NAME --project PROJECT_ID \
    --location=CONTROL_PLANE_LOCATION --cluster CLUSTER_NAME \
    --node-locations=COMPUTE_ZONE \
    --machine-type H4D_MACHINE_TYPE \
    --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-0 \
    --flex-start --enable-autoscaling --reservation-affinity=none \
    --min-nodes=0 --max-nodes=MAX_NODES --num-nodes=0

MAX_NODES 替換為每個可用區中,指定節點集區可自動調度的節點數量上限。

準備 Docker 映像檔

使用下列範例 Dockerfile 準備映像檔:

FROM rockylinux:8.9

RUN dnf install https://depot.ciq.com/public/files/gce-accelerator/irdma-kernel-modules-el8-x86_64/irdma-repos.rpm -y

RUN dnf install rdma-core libibverbs-utils librdmacm-utils infiniband-diags perftest -y
最佳做法

建議使用 Rocky 8 容器映像檔,因為這類映像檔支援 RDMA。其他 Linux 發行版本可能尚未廣泛提供 iRDMA 驅動程式。

設定 RDMA 的資訊清單

在 Pod 中繼資料中新增下列註解,即可啟用 RDMA:

metadata:
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth1","network":"rdma-0"},
      ]

使用 rping 測試 RDMA

在伺服器和用戶端 Pod 之間執行 rping,驗證 RDMA 功能:

  1. 在伺服器 Pod 上執行 rping 指令:

    rping -s
    
  2. 在用戶端 Pod 上執行 rping 指令:

    rping -c -C 2 -d -a SERVER_IP
    

    SERVER_IP 替換為伺服器 Pod 的 IP 位址。

    如果成功,輸出內容會類似以下內容:

    created cm_id 0x5b597bf94800
    cma_event type RDMA_CM_EVENT_ADDR_RESOLVED cma_id 0x5b597bf94800 (parent)
    cma_event type RDMA_CM_EVENT_ROUTE_RESOLVED cma_id 0x5b597bf94800 (parent)
    rdma_resolve_addr - rdma_resolve_route successful
    created pd 0x5b597bf94fa0
    created channel 0x5b597bf96830
    created cq 0x5b597bf94ff0
    created qp 0x5b597bf96c00
    rping_setup_buffers called on cb 0x5b597bf8c820
    allocated & registered buffers...
    cq_thread started.
    cma_event type RDMA_CM_EVENT_ESTABLISHED cma_id 0x5b597bf94800 (parent)
    ESTABLISHED
    rdma_connect successful
    RDMA addr 5b597bf8cd80 rkey dadac8c4 len 64
    send completion
    recv completion
    RDMA addr 5b597bf8cff0 rkey 86ef015f len 64
    send completion
    recv completion
    RDMA addr 5b597bf8cd80 rkey dadac8c4 len 64
    send completion
    recv completion
    RDMA addr 5b597bf8cff0 rkey 86ef015f len 64
    send completion
    recv completion
    rping_free_buffers called on cb 0x5b597bf8c820
    destroy cm_id 0x5b597bf94800
    

後續步驟

  • 進一步瞭解高效能運算
  • 部分 HPC 工作負載需要訊息傳遞介面 (MPI),才能透過 RDMA 執行緊密耦合的多節點工作負載。如要進一步瞭解如何在叢集中為 H4D 節點設定 MPI,請參閱「在 GKE H4D 上執行 MPI 工作負載」。