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

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

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,快速建立使用預留 H4D VM 的可部署於正式環境 GKE 叢集。本節的 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. 在 GitHub 存放區的 examples/gke-h4d/gke-h4d-deployment.yaml 藍圖中,填寫 terraform_backend_defaults 和 vars 區段中的下列設定,以符合部署作業的特定值:

    • 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),請建立專屬的虛擬私有雲和子網路。按照下列操作說明建立的虛擬私有雲,會視需要使用 Falcon 虛擬私有雲網路設定檔。

    1. 為 IRDMA 網路介面建立虛擬私有雲,該介面使用 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 叢集:建立叢集。您也可以使用這個指令,明確提供 Service 和 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/19 和 POD_CIDR=10.64.0.0/19。

  3. 建立 GKE 網路物件:使用 GKE 網路參數集設定虛擬私有雲網路。套用 GKENetworkParamSet 和 Network 物件:

    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 \
        --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

CMD ["sleep", "infinity"]

如要進一步瞭解哪些映像檔支援 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 的次要 RDMA 內部 IP 位址 (eth1)。您必須使用這個次要 IP 位址,透過 RDMA 硬體傳送流量,請勿使用預設 Pod IP 位址:

    kubectl exec SERVER_POD_NAME -- ip -4 -o addr show eth1
    

    記下輸出內容中的 inet IP 位址。在下一個步驟中,您會將這個 IP 位址做為 eth1 IP 位址。

  3. 在用戶端 Pod 上執行 rping 指令:

    rping -c -C 2 -d -a SERVER_IP
    

    將 SERVER_IP 替換為您在上一個步驟中擷取的 eth1 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
    

後續步驟