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

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

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

事前準備

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

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

設定 GKE 叢集和網路

您可以使用 Cluster Toolkit 快速建立可供正式環境使用的 GKE 叢集,該叢集會使用與預訂項目綁定的 H4D VM。本節中的 Cluster Toolkit 指令使用 GKE H4D 藍圖

或者,您也可以使用 Google Cloud CLI,以取決於預留項目或彈性啟動的 VM,彈性設定叢集環境。

Cluster Toolkit

  1. 設定 Cluster Toolkit。建議您使用 Cloud Shell 執行這項操作,因為 Cluster Toolkit 的依附元件已預先安裝。

  2. 取得安裝 Cluster Toolkit 的主體機器 IP 位址:

    curl ifconfig.me
    

    請儲存這個 IP 位址,供後續步驟中的 IP_ADDRESS 變數使用。

  3. 建立 Cloud Storage bucket,儲存 Terraform 部署作業的狀態:

    gcloud storage buckets create gs://BUCKET_NAME \
        --default-storage-class=STANDARD \
        --project=PROJECT_ID \
        --location=COMPUTE_REGION_TERRAFORM_STATE \
        --uniform-bucket-level-access
    gcloud storage buckets update gs://BUCKET_NAME --versioning
    

    請替換下列變數:

    • BUCKET_NAME:新 Cloud Storage bucket 的名稱。
    • PROJECT_ID:您的 Google Cloud 專案 ID。
    • COMPUTE_REGION_TERRAFORM_STATE:要儲存 Terraform 部署作業狀態的運算區域。
  4. examples/gke-h4d/gke-h4d-deployment.yaml 藍圖中 (位於 GitHub 存放區),填入 terraform_backend_defaultsvars 區段中的下列設定,以符合部署作業的特定值:

    • DEPLOYMENT_NAME:部署作業的專屬名稱,長度必須介於 6 到 30 個字元之間。如果部署作業名稱在專案內重複,叢集建立作業就會失敗。預設值為 gke-h4d
    • BUCKET_NAME:您在上一個步驟中建立的 Cloud Storage bucket 名稱。
    • PROJECT_ID:您的 Google Cloud 專案 ID。
    • COMPUTE_REGION:叢集的運算區域,必須與可預留機器的區域相符。
    • COMPUTE_ZONE:H4D 機器的節點集區運算可用區。請注意,這個可用區應與預留項目中可用的機器所在可用區相符。
    • NODE_COUNT:叢集中的 H4D 節點數量。
    • IP_ADDRESS/SUFFIX:您要允許連線至叢集的 IP 位址範圍。這個 CIDR 區塊必須包含您要用來呼叫 Terraform 的機器 IP 位址。詳情請參閱「授權網路的運作方式」。
    • 視您是否要在佈建節點集區時,指定預留項目中的特定區塊,請使用下列其中一個 reservation 欄位:

      • 如要在預留項目中的任何位置放置節點集區,請提供預留項目的名稱 (RESERVATION_NAME)。
      • 如要指定預訂中的特定區塊,請使用下列格式的預訂和區塊名稱:

          RESERVATION_NAME/reservationBlocks/BLOCK_NAME
        

        如要瞭解預訂中可用的區塊,請參閱「查看預訂拓撲」。

  5. 產生應用程式預設憑證 (ADC),授予 Terraform 存取權。如果您使用 Cloud Shell,可以執行下列指令:

    gcloud auth application-default login
    
  6. 部署藍圖,使用 H4D 機型佈建 GKE 基礎架構:

    ./gcluster deploy -d examples/gke-h4d/gke-h4d-deployment.yaml examples/gke-h4d/gke-h4d.yaml
    
  7. 出現提示時,請選取「(A)pply」(套用),部署藍圖。

  8. 此外,這個藍圖會佈建 Filestore 執行個體,並透過永久磁碟區 (PV) 將其連線至 GKE 叢集。這份藍圖包含工作範本範例。這個範本會執行平行工作,從這個共用儲存空間讀取及寫入資料。部署作業輸出內容中會顯示 kubectl create,可用於觸發範例工作。

Google Cloud CLI

請將本節指令中的下列值替換掉:

  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。如果是地區叢集,請提供區域;如果是區域叢集,請提供可用區。建議您將區域叢集用於正式環境工作負載。如果是地區叢集,該地區必須包含 H4D 可用的區域。如果是可用區叢集,可用區必須提供 H4D。如果您使用預留項目,區域和可用區必須與預留項目的區域和可用區相符。
  • COMPUTE_ZONE:節點集區的可用區。這必須是 H4D 適用的區域。 如果您使用預留項目,區域和可用區必須與預留項目的區域和可用區相符。如要讓 H4D 節點搭配 Cloud 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)。

請按照下列步驟,使用 gcloud CLI 建立叢集:

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

    1. 為 IRDMA 網路介面建立 VPC,並使用 RDMA over Falcon 傳輸通訊協定:

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

      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
      
  2. 建立具備多重網路功能的 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

  3. 建立 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
    
  4. 建立 H4D 節點集區:建立使用 H4D 並連線至 Falcon 虛擬私有雲網路的節點集區。您可以使用受預訂項目限制的 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 節點,並連線至 Falcon VPC 網路:

    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 docker.io/rockylinux/rockylinux:8.10

RUN dnf -y install https://depot.ciq.com/public/download/ciq-sigcloud-next-8/ciq-sigcloud-next-8.x86_64/Packages/c/ciq-sigcloud-next-release-6-1.el8_10.cld_next.noarch.rpm
    && dnf -y update ciq-sigcloud-next-release
    && dnf clean all

RUN dnf install rdma-core libibverbs-utils librdmacm-utils infiniband-diags perftest -y

如要進一步瞭解哪些映像檔支援 IRDMA,請參閱「作業系統詳細資料」中的表格,並查看「介面」分頁標籤。

設定 RDMA 的資訊清單

在 Pod 中繼資料中新增下列註解,即可啟用 Cloud 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,驗證 Cloud 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
    

後續步驟