使用 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 虚拟机。或者,如果您需要超过 90 天的资源,或者在单个请求中需要超过 256 个 H4D 虚拟机,请与您的客户支持团队联系。您还可以根据所在地区的可用容量按需预配 H4D 虚拟机。
  • 使用 GKE 版本 1.32.6-gke.1060000 或更高版本,以在 GKE Standard 模式下创建具有预留 H4D 虚拟机的节点池。
  • 使用 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 和子网

为集群配置默认 Virtual Private Cloud (VPC) 和子网。对于 RDMA 网络接口卡 (NIC),请创建专用 VPC 和子网。按照以下说明创建的 VPC 会根据需要使用 RDMA 网络配置文件

  1. 为 RDMA NIC 创建 HPC VPC:

    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 网络参数集配置 VPC 网络。 应用 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 的推荐容器映像。iRDMA 驱动程序可能尚未在其他 Linux 发行版中广泛提供。

为 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 和客户端 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 工作负载