创建使用 A4 或 A3 Ultra 的自定义 AI 优化型 GKE 集群

本页面介绍了如何创建经过 AI 优化的 Google Kubernetes Engine (GKE) 集群,该集群使用 A4 或 A3 Ultra 虚拟机 (VM) 来支持 AI 和机器学习工作负载。对于 A4X,请参阅创建使用 A4X 的自定义 AI 优化型 GKE 集群

A4 和 A3 Ultra 机器系列旨在让您能够运行大规模 AI/机器学习集群,并提供有针对性的工作负载放置、高级集群维护控制和拓扑感知调度等功能。如需了解详情,请参阅集群管理概览

GKE 提供了一个统一的平台界面,可用于运行组织中的各种工作负载,从而减轻管理多个平台的运营负担。您可以运行高性能分布式预训练、模型微调、模型推理、应用服务和支持服务等工作负载。

本页面介绍如何使用 Google Cloud CLI 创建 GKE 集群,以便根据工作负载的需求尽可能灵活地配置集群。或者,您也可以选择使用 Cluster Toolkit 快速部署集群,其默认设置反映了许多使用情形下的最佳实践。如需了解如何执行此操作,请参阅创建具有默认配置的 AI 优化型 GKE 集群

启用 GPUDirect RDMA 时的集群配置选项

如需使用 Google Cloud CLI 创建集群,您可以选择以下任一集群配置选项:

  • 如果您不打算运行分布式 AI 工作负载:请创建一个不使用 GPUDirect RDMA 的 GKE 集群。
  • 如果您计划运行分布式 AI 工作负载:请创建启用了 GPUDirect RDMA 的 GKE 集群。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

所需的角色

如需获得创建和管理 GKE 集群所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

选择使用选项并获取容量

  1. 选择使用选项。您可以根据自己获取和使用 GPU 资源的方式做出选择。如需了解详情,请参阅选择消费选项

    对于 GKE,在选择消费选项时,请考虑以下其他信息:

  2. 获取容量。了解如何为您的消费选项获取容量

要求

AI 优化型 GKE 集群必须满足以下要求:

  • 如需使用灵活启动预配模型,您必须使用 GKE 1.32.2-gke.1652000 版或更高版本。
  • 请确保您使用的 GPU 驱动程序版本不低于最低版本,具体取决于机器类型:

    • A4:A4 虚拟机中的 B200 GPU 至少需要 R570 GPU 驱动程序版本。默认情况下,GKE 会自动在所有运行 A4 所需最低版本(即 1.32.1-gke.1729000 或更高版本)的 A4 节点上安装此驱动程序版本。
    • A3 Ultra:A3 Ultra 虚拟机中的 H200 GPU 至少需要 R550 GPU 驱动程序版本,该版本在 GKE 版本 1.31 中以 latest 驱动程序版本提供。对于 A3 Ultra 虚拟机,您必须使用 GKE 版本 1.31 设置 gpu-driver-version=latest 字段的值。对于 GKE 1.31.5-gke.1169000 版及更高版本,GKE 默认会自动在 A3 Ultra 节点上安装 R550 GPU 驱动程序版本,包括在您省略 gpu-driver-version 标志时。
  • 如需使用 GPUDirect RDMA,还需满足以下要求:

    • 请使用以下最低版本,具体取决于机器类型:
      • A4:使用 1.32.2-gke.1475000 版或更高版本。
      • A3 Ultra:使用 1.31.4-gke.1183000 版或更高版本。
    • GKE 节点必须使用 Container-Optimized OS 节点映像。不支持 Ubuntu 和 Windows 节点映像。
    • 您的 GKE 工作负载必须使用所有可用的 GPU,并且您的 Pod 必须使用单个 GKE 节点上所有可用的辅助网络接口卡 (NIC)。多个 Pod 无法在单个 GKE 节点上共享 RDMA。
    • 此设置会运行 NCCL 测试。如需运行此 NCCL 测试,您必须至少拥有 2 的虚拟机配额(也就是说,如果您使用 a4-highgpu-8ga3-ultragpu-8g 机器类型,则需要 16 个 GPU)。
    • GPUDirect RDMA 与 NCCL Fast Socket 或 GPUDirect TCPX/TCPXO 不兼容。请勿在使用 GPUDirect RDMA 的集群上启用 NCCL Fast Socket 或安装 TCPX/TCPXO 插件。
  • 确保您使用的位置提供您选择的机器类型。如需了解详情,请参阅 GPU 位置

创建经过 AI 优化的 GKE 集群

按照本部分中的说明创建满足 AI 优化型 GKE 集群要求的 GKE 集群。您可以选择创建启用或未启用 GPUDirect RDMA 的集群。

创建集群的注意事项

创建集群时,请考虑以下信息:

  • 选择集群位置
    • 确保您使用的位置提供您选择的机器类型。如需了解详情,请参阅 GPU 位置
    • 对于密集型预留,您可以创建区域级集群。在这种情况下,请将 --region 标志替换为 --zone=COMPUTE_ZONE 标志,其中 COMPUTE_ZONE 是控制平面的可用区。
    • 对于在 1,000 多个节点上运行且需要节点间网络延迟时间较低的工作负载,您可以创建区域级集群。 如需在物理上将对性能敏感的节点并置,请使用 --node-locations 标志在单个可用区内创建 GPU 节点池。
  • 选择驱动程序版本
    • 驱动程序版本可以是以下值之一:
      • default:为您的 GKE 节点版本安装默认驱动程序版本。如需详细了解默认驱动程序版本的相关要求,请参阅要求部分。
      • latest:为您的 GKE 版本安装最新可用的驱动程序版本。此选项仅适用于使用 Container-Optimized OS 的节点。
      • disabled:跳过自动驱动程序安装。创建节点池后,您必须手动安装驱动程序
    • 如需详细了解 GKE 节点版本的默认和最新 GPU 驱动程序版本,请参阅手动安装 NVIDIA GPU 驱动程序
  • 选择预留亲和性

    • 您可以找到有关预留的信息,例如预留的名称或预留中特定块的名称。如需查找这些值,请参阅查看未来预留请求
    • --reservation-affinity 标志的值可以是 specificany。不过,对于高性能分布式 AI 工作负载,我们建议您使用特定预留。
    • 使用特定预留(包括共享预留)时,请按以下格式指定 --reservation 标志的值:

      projects/PROJECT_ID/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME
      

      替换以下内容:

      • PROJECT_ID:您的 Google Cloud 项目 ID。
      • RESERVATION_NAME:预留的名称。
      • BLOCK_NAME:预留中特定块的名称。

创建不含 GPUDirect RDMA 的集群

如需创建不使用 GPUDirect RDMA 的集群,请按照以下说明创建具有基于 CPU 的默认节点池和具有 GPU 的其他节点池的集群。此方法允许默认节点池运行其他服务。

  1. 创建集群:

      gcloud container clusters create CLUSTER_NAME \
          --cluster-version=CLUSTER_VERSION \
          --region=COMPUTE_REGION
    

    替换以下内容:

    • CLUSTER_NAME:新集群的名称。
    • CLUSTER_VERSION:新集群的版本。如需详细了解哪个版本的 GKE 支持您的配置,请参阅要求部分。
    • COMPUTE_REGION:新集群所在的区域。 如果您计划创建可用区级集群,请使用 --zone 标志,而不是 --region 标志,例如: --zone=COMPUTE_ZONE。 将 COMPUTE_ZONE 替换为控制平面的可用区。
  2. 使用以下命令之一创建基于 GPU 的节点池。您需要运行的命令取决于您为部署使用的使用选项。选择与您的使用选项的配置模式对应的标签页。

    受预留约束

    对于与预留绑定的配置,请运行以下命令:

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --num-nodes=NUM_NODES \
          --reservation-affinity=specific \
          --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME
    

    替换以下内容:

    • NODE_POOL_NAME:节点池的名称。
    • COMPUTE_REGION:新集群所在的区域。
    • CLUSTER_NAME:新集群的名称。
    • COMPUTE_ZONE:节点池的可用区。
    • GPU_TYPEGPU 加速器的类型:

      • A4 虚拟机:输入 nvidia-b200
      • A3 Ultra 虚拟机:输入 nvidia-h200-141gb
    • AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于 a4-highgpu-8ga3-ultragpu-8g 虚拟机,GPU 数量均为 8

    • DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:defaultlatestdisabled

    • MACHINE_TYPE:节点的 Compute Engine 机器类型。例如,对于 A4 虚拟机,请使用 a4-highgpu-8g;对于 A3 Ultra 虚拟机,请使用 a3-ultragpu-8g

    • NUM_NODES:节点池的节点数。

    • RESERVATION_NAME:预留的名称。如需查找此值,请参阅查看未来预留请求

    • BLOCK_NAME:预留中特定块的名称。如需查找此值,请参阅查看未来预留请求

    灵活启动

    对于灵活启动配置,请运行以下命令:

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --flex-start --enable-autoscaling --num-nodes=0 \
          --total-max-nodes TOTAL_MAX_NODES \
          --no-enable-autorepair --location-policy=ANY \
          --reservation-affinity=none [\
          --enable-queued-provisioning]
    

    替换以下内容:

    • NODE_POOL_NAME:节点池的名称。
    • COMPUTE_REGION:新集群所在的区域。
    • CLUSTER_NAME:新集群的名称。
    • COMPUTE_ZONE:节点池的可用区。
    • GPU_TYPEGPU 加速器的类型:

      • A4 虚拟机:输入 nvidia-b200
      • A3 Ultra 虚拟机:输入 nvidia-h200-141gb
    • AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于 a4-highgpu-8ga3-ultragpu-8g 虚拟机,GPU 数量均为 8

    • DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:defaultlatestdisabled

    • MACHINE_TYPE:节点的 Compute Engine 机器类型。例如,对于 A4 虚拟机,请使用 a4-highgpu-8g;对于 A3 Ultra 虚拟机,请使用 a3-ultragpu-8g

    • TOTAL_MAX_NODES:整个节点池自动扩缩的节点数上限。

      如果您想使用灵活启动(带已排队的预配),请添加 --enable-queued-provisioning 标志。

      如需详细了解如何使用灵活启动,请参阅通过灵活启动(带排队配置)运行大规模工作负载

    Spot

    对于竞价型配置,请运行以下命令:

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --num-nodes=NUM_NODES \
          --spot
    

    替换以下内容:

    • NODE_POOL_NAME:节点池的名称。
    • COMPUTE_REGION:新集群所在的区域。
    • CLUSTER_NAME:新集群的名称。
    • COMPUTE_ZONE:节点池的可用区。
    • GPU_TYPEGPU 加速器的类型:

      • A4 虚拟机:输入 nvidia-b200
      • A3 Ultra 虚拟机:输入 nvidia-h200-141gb
    • AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于 a4-highgpu-8ga3-ultragpu-8g 虚拟机,GPU 数量均为 8

    • DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:defaultlatestdisabled

    • MACHINE_TYPE:节点的 Compute Engine 机器类型。例如,对于 A4 虚拟机,请使用 a4-highgpu-8g;对于 A3 Ultra 虚拟机,请使用 a3-ultragpu-8g

    • NUM_NODES:节点池的节点数。

      如需详细了解如何使用 Spot 虚拟机创建集群,请参阅使用 Spot 虚拟机以更低的费用运行容错工作负载

  3. 连接到集群,以便运行下一部分中的 kubectl 命令:

      gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

    替换以下内容:

创建启用了 GPUDirect RDMA 的集群

对于分布式 AI 工作负载,多个 GPU 节点通常会链接在一起,作为一个计算机运行。A4 虚拟机和 A3 Ultra 虚拟机随附 Titanium ML 网络适配器,该适配器基于 NVIDIA ConnectX-7 (CX7) NIC 构建。A4 虚拟机和 A3 Ultra 虚拟机均使用 RDMA over Converged Ethernet (RoCE) 提供无阻塞的 3.2 Tbps 节点间 GPU 到 GPU 流量。RoCE 可为 AI 工作负载提供高性能的云体验,从而实现跨多个 GPU 的伸缩和协作。

如需详细了解如何使用 Google Cloud CLI 和 GPUDirect TCPX(A3 High 虚拟机)或 TCPXO(A3 Mega 虚拟机)创建 GKE 集群,请参阅在 Autopilot 模式集群中最大限度地提高 GPU 网络带宽在 Standard 模式集群中最大限度地提高 GPU 网络带宽

如需在 Autopilot 或 Standard 模式下创建支持 GPUDirect RDMA 的 GKE 集群,请完成以下步骤(将在后续部分中介绍):

  1. 创建 VPC 和子网
  2. 创建具有多网络功能的 GKE 集群
  3. 创建 GKE 网络对象
  4. 安装 RDMA 二进制文件并配置 NCCL
  5. 部署并运行 NCCL 测试
  6. 为 GPUDirect-RDMA 配置 Pod 清单

创建 VPC 和子网

A4 虚拟机和 A3 Ultra 虚拟机均具有以下配置:

  • 每个虚拟机 8 个 NVIDIA B200 (A4) 或 H200 (A3 Ultra) GPU,通过 NVLink 连接
  • 两个 Intel Emerald Rapids CPU
  • 8 个 400 Gbps CX-7 NIC,用于 GPU 间联网
  • 两个 200 Gbps Google Titanium NIC,用于外部服务

AI 和 ML 工作负载(例如分布式训练)需要通过缩短作业完成时间来获得极大的加速,从而优化性能。对于需要高性能、高吞吐量和低延迟的工作负载,GPUDirect RDMA 可减少将载荷传输到 GPU 和从 GPU 传输载荷所需的网络跃点数,从而更高效地利用可用的网络带宽。与不使用 GPUDirect 的 GPU 相比,GPUDirect RDMA 旨在大幅提高大规模吞吐量。

与 CPU 关联的某个 Google Titanium NIC 使用 GKE 中的默认网络。如果您有足够的默认网络 IP 地址范围,则无需为此 NIC 创建新的 VPC。

您可以使用这些命令为第二个 CPU Titanium NIC (gVNIC) 创建一个 VPC,并为八个 CX-7 RDMA NIC 创建另一个 VPC。

  1. 设置环境变量以匹配您的部署:

    export REGION="COMPUTE_REGION"
    export ZONE="COMPUTE_ZONE"
    export PROJECT="PROJECT_ID"
    export GVNIC_NETWORK_PREFIX="GVNIC_NETWORK_PREFIX"
    export RDMA_NETWORK_PREFIX="RDMA_NETWORK_PREFIX"
    

    执行以下变量替换操作:

    • COMPUTE_REGION:集群所在的区域。
    • COMPUTE_ZONE:节点池的可用区。
    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • GVNIC_NETWORK_PREFIX:对于 A4 虚拟机,值为 a4high-gvnic;对于 A3 Ultra 虚拟机,值为 a3ultra-gvnic
    • RDMA_NETWORK_PREFIX:对于 A4 虚拟机,值为 a4high-rdma;对于 A3 Ultra 虚拟机,值为 a3ultra-rdma
  2. 创建两个 VPC 网络:

    # Create a VPC for the additional Google Titanium CPU NIC
    gcloud compute --project=${PROJECT} \
      networks create \
      ${GVNIC_NETWORK_PREFIX}-net \
      --subnet-mode=custom
    
    gcloud compute --project=${PROJECT} \
      networks subnets create \
      ${GVNIC_NETWORK_PREFIX}-sub \
      --network=${GVNIC_NETWORK_PREFIX}-net \
      --region=${REGION} \
      --range=192.168.0.0/24
    
    gcloud compute --project=${PROJECT} \
      firewall-rules create \
      ${GVNIC_NETWORK_PREFIX}-internal \
      --network=${GVNIC_NETWORK_PREFIX}-net \
      --action=ALLOW \
      --rules=tcp:0-65535,udp:0-65535,icmp \
      --source-ranges=192.168.0.0/16
    
    # Create HPC VPC for the RDMA NICs with 8 subnets.
    gcloud beta compute --project=${PROJECT} \
      networks create ${RDMA_NETWORK_PREFIX}-net \
      --network-profile=${ZONE}-vpc-roce \
      --subnet-mode=custom
    
    # Create subnets for the HPC VPC.
    for N in $(seq 0 7); do
      gcloud compute --project=${PROJECT} \
        networks subnets create \
        ${RDMA_NETWORK_PREFIX}-sub-$N \
        --network=${RDMA_NETWORK_PREFIX}-net \
        --region=${REGION} \
        --range=192.168.$((N+1)).0/24 &  # offset to avoid overlap with gvnics
    done
    

创建具有多网络功能的 GKE 集群

Autopilot

  1. 创建具有多网络功能的 GKE Autopilot 集群:

    gcloud container clusters create-auto CLUSTER_NAME \
        --enable-multi-networking \
        --cluster-version=CLUSTER_VERSION \
        --region=COMPUTE_REGION
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • CLUSTER_VERSION:新集群的版本。如需了解哪个版本的 GKE 支持您的配置,请参阅要求部分。
    • COMPUTE_REGION:计算区域的名称。
  2. 连接到集群,以便运行后续部分中的 kubectl 命令:

    gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • COMPUTE_REGION:计算区域的名称。

    如需了解详情,请参阅安装 kubectl 并配置集群访问权限

标准

创建具有多网络的 GKE Standard 集群和 GPU 节点池:

  1. 创建集群:

    gcloud container clusters create CLUSTER_NAME \
      --region=COMPUTE_REGION \
      --cluster-version=CLUSTER_VERSION \
      --enable-dataplane-v2 --enable-ip-alias --enable-multi-networking [\
      --services-ipv4-cidr=SERVICE_CIDR \
      --cluster-ipv4-cidr=POD_CIDR]
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • CLUSTER_VERSION:新集群的版本。如需了解哪个版本的 GKE 支持您的配置,请参阅要求部分。
    • COMPUTE_REGION:计算区域的名称。

    (可选)您可以明确指定服务和 Pod 的次要 CIDR 范围。如果您使用这些可选标志,请替换以下变量:

    • SERVICE_CIDR:服务的次要 CIDR 范围。
    • POD_CIDR:Pod 的次要 CIDR 范围。

    使用这些标志时,您必须验证 CIDR 范围是否与额外节点网络的子网范围重叠。例如,SERVICE_CIDR=10.65.0.0/19POD_CIDR=10.64.0.0/19 值中的范围不会相互重叠。如需了解详情,请参阅添加 Pod IPv4 地址范围

  2. 创建节点池。您需要运行的命令取决于您为部署使用的使用选项。选择与您的使用选项的配置模式对应的标签页。

    受预留约束

    对于与预留绑定的配置,请运行以下命令:

    gcloud container node-pools create NODE_POOL_NAME \
      --region COMPUTE_REGION --cluster CLUSTER_NAME \
      --node-locations COMPUTE_ZONE \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
      --machine-type MACHINE_TYPE \
      --num-nodes=NUM_NODES \
      --reservation-affinity=specific \
      --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME  \
      --additional-node-network network=${GVNIC_NETWORK_PREFIX}-net,subnetwork=${GVNIC_NETWORK_PREFIX}-sub \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-0 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-1 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-2 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-3 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-4 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-5 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-6 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-7
    

    替换以下内容:

    • NODE_POOL_NAME:节点池的名称。
    • COMPUTE_REGION:新集群所在的区域。
    • CLUSTER_NAME:新集群的名称。
    • COMPUTE_ZONE:节点池的可用区。
    • GPU_TYPEGPU 加速器的类型:

      • A4 虚拟机:输入 nvidia-b200
      • A3 Ultra 虚拟机:输入 nvidia-h200-141gb
    • AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于 a4-highgpu-8ga3-ultragpu-8g 虚拟机,GPU 数量均为 8

    • DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:defaultlatestdisabled

    • MACHINE_TYPE:节点的 Compute Engine 机器类型。例如,对于 A4 虚拟机,请使用 a4-highgpu-8g;对于 A3 Ultra 虚拟机,请使用 a3-ultragpu-8g

    • MACHINE_TYPE:节点的 Compute Engine 机器类型。例如,对于 A4 虚拟机,请使用 a4-highgpu-8g;对于 A3 Ultra 虚拟机,请使用 a3-ultragpu-8g

    • NUM_NODES:节点池的节点数。对于灵活启动,此值必须设置为 0

    • RESERVATION_NAME:预留的名称。如需查找此值,请参阅查看未来预留请求

    • BLOCK_NAME:预留中特定块的名称。如需查找此值,请参阅查看未来预留请求

    灵活启动

    对于灵活启动配置,请运行以下命令:

    gcloud container node-pools create NODE_POOL_NAME \
      --region COMPUTE_REGION --cluster CLUSTER_NAME \
      --node-locations COMPUTE_ZONE \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
      --machine-type MACHINE_TYPE \
      --num-nodes=NUM_NODES \
      --flex-start --num-nodes=0 --enable-autoscaling \
      --total-max-nodes TOTAL_MAX_NODES \
      --no-enable-autorepair --location-policy=ANY \
      --reservation-affinity=none \
      [--enable-queued-provisioning \]
      --additional-node-network network=${GVNIC_NETWORK_PREFIX}-net,subnetwork=${GVNIC_NETWORK_PREFIX}-sub \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-0 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-1 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-2 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-3 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-4 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-5 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-6 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-7
    

    替换以下内容:

    • NODE_POOL_NAME:节点池的名称。
    • COMPUTE_REGION:新集群所在的区域。
    • CLUSTER_NAME:新集群的名称。
    • COMPUTE_ZONE:节点池的可用区。
    • GPU_TYPEGPU 加速器的类型:

      • A4 虚拟机:输入 nvidia-b200
      • A3 Ultra 虚拟机:输入 nvidia-h200-141gb
    • AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于 a4-highgpu-8ga3-ultragpu-8g 虚拟机,GPU 数量均为 8

    • DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:defaultlatestdisabled

    • MACHINE_TYPE:节点的 Compute Engine 机器类型。例如,对于 A4 虚拟机,请使用 a4-highgpu-8g;对于 A3 Ultra 虚拟机,请使用 a3-ultragpu-8g

    • MACHINE_TYPE:节点的 Compute Engine 机器类型。例如,对于 A4 虚拟机,请使用 a4-highgpu-8g;对于 A3 Ultra 虚拟机,请使用 a3-ultragpu-8g

    • NUM_NODES:节点池的节点数。对于灵活启动,此值必须设置为 0

    • TOTAL_MAX_NODES:整个节点池自动扩缩的节点数上限。

    如果您想使用灵活启动(带已排队的预配),请添加 --enable-queued-provisioning 标志。

    如需详细了解如何使用灵活启动,请参阅通过灵活启动(带排队配置)运行大规模工作负载

  3. 连接到集群,以便运行后续部分中的 kubectl 命令:

    gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • COMPUTE_REGION:计算区域的名称。

    如需了解详情,请参阅安装 kubectl 并配置集群访问权限

创建 GKE 网络对象

需要通过 GKE 网络参数集配置上一部分中创建的 VPC 网络。具体而言,第二个 CPU Titanium NIC (gVNIC) 需要配置为 NetDevice 模式,而八个 CX-7 RDMA NIC 中的每一个都需要配置为 RDMA 模式。

此命令使用以下名称:

  • CPU Titanium NIC (gVNIC) VPC 名为 ${GVNIC_NETWORK_PREFIX}-net,子网名为 ${GVNIC_NETWORK_PREFIX}-sub
  • CX-7 RDMA NIC 的 VPC 名为 ${RDMA_NETWORK_PREFIX}-net,子网名为 ${RDMA_NETWORK_PREFIX}-sub-[0…7]

运行以下命令以创建 GKE 网络对象:

kubectl apply -f - <<EOF
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: gvnic-1
spec:
  vpc: ${GVNIC_NETWORK_PREFIX}-net
  vpcSubnet: ${GVNIC_NETWORK_PREFIX}-sub
  deviceMode: NetDevice
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: gvnic-1
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: gvnic-1
---
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
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-1
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-1
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-1
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-1
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-2
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-2
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-2
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-2
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-3
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-3
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-3
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-3
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-4
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-4
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-4
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-4
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-5
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-5
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-5
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-5
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-6
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-6
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-6
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-6
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-7
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-7
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-7
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-7
EOF

安装 RDMA 二进制文件并配置 NCCL

应用以下 DaemonSet 以在每个节点上安装 RDMA 二进制文件和 NCCL 库。在每个底层虚拟机上,RDMA 二进制文件安装在 /home/kubernetes/bin/gib 目录中,NCCL 库安装在 /home/kubernetes/bin/nvidia/lib64 目录中。

Autopilot

对于 GKE Autopilot 模式,请运行以下命令:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/gpudirect-rdma/nccl-rdma-installer-autopilot.yaml

标准

对于 GKE Standard 模式,请运行以下命令:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/gpudirect-rdma/nccl-rdma-installer.yaml

运行 NCCL 测试

如需验证已配置集群的功能,您可以运行 NCCL 测试。如需了解相关说明,请参阅部署和运行 NCCL 测试

为 GPUDirect RDMA 配置 Pod 清单

如需使用 GPUDirect RDMA 运行工作负载,请按照以下步骤配置 Pod 清单:

  1. 将以下注解添加到 Pod 元数据中。

    Autopilot

    对于 GKE Autopilot 模式,请使用以下注解:

    metadata:
    annotations:
      networking.gke.io/default-interface: 'eth0'
      networking.gke.io/interfaces: |
        [
          {"interfaceName":"eth0","network":"default"},
          {"interfaceName":"eth1","network":"gvnic-1"},
          {"interfaceName":"eth2","network":"rdma-0"},
          {"interfaceName":"eth3","network":"rdma-1"},
          {"interfaceName":"eth4","network":"rdma-2"},
          {"interfaceName":"eth5","network":"rdma-3"},
          {"interfaceName":"eth6","network":"rdma-4"},
          {"interfaceName":"eth7","network":"rdma-5"},
          {"interfaceName":"eth8","network":"rdma-6"},
          {"interfaceName":"eth9","network":"rdma-7"}
        ]
    

    标准

    以下适用于 GKE Standard 模式的注解不包含 gvnic-1 规范,但您可以根据工作负载的需要添加该规范。

    对于 GKE Standard 模式,请使用以下注解:

    metadata:
    annotations:
      networking.gke.io/default-interface: 'eth0'
      networking.gke.io/interfaces: |
        [
          {"interfaceName":"eth0","network":"default"},
          {"interfaceName":"eth2","network":"rdma-0"},
          {"interfaceName":"eth3","network":"rdma-1"},
          {"interfaceName":"eth4","network":"rdma-2"},
          {"interfaceName":"eth5","network":"rdma-3"},
          {"interfaceName":"eth6","network":"rdma-4"},
          {"interfaceName":"eth7","network":"rdma-5"},
          {"interfaceName":"eth8","network":"rdma-6"},
          {"interfaceName":"eth9","network":"rdma-7"}
        ]
    
  2. 使用节点选择器指定所选 GPU 类型和特定预留:

    spec:
      nodeSelector:
        cloud.google.com/gke-accelerator: ACCELERATOR
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-affinity: "specific"
    

    替换以下内容:

    • ACCELERATOR:您在 Compute Engine 容量预留中预留的加速器。您必须使用以下值之一:
      • nvidia-b200:适用于 A4 虚拟机的 NVIDIA B200 (180GB)
      • nvidia-h200-141gb:适用于 A3 Ultra 虚拟机的 NVIDIA H200 (141GB)
    • RESERVATION_NAME:Compute Engine 容量预留的名称。

    如需使用共享预留或预留的特定块和子块,请参阅使用预留的可用区级路径资源中的相应部分。

  3. 将以下卷添加到 Pod 规范中:

    spec:
      volumes:
        - name: library-dir-host
          hostPath:
            path: /home/kubernetes/bin/nvidia
        - name: gib
          hostPath:
            path: /home/kubernetes/bin/gib
    
  4. 将以下卷装载、环境变量和资源添加到请求 GPU 的容器。工作负载容器必须请求所有 8 个 GPU:

    Autopilot

    对于 GKE Autopilot 模式,请配置以下资源:

    containers:
      - name: my-container
        volumeMounts:
          - name: library-dir-host
            mountPath: /usr/local/nvidia
            readOnly: true
          - name: gib
            mountPath: /usr/local/gib
            readOnly: true
        env:
          - name: LD_LIBRARY_PATH
            value: /usr/local/nvidia/lib64
        resources:
          limits:
            nvidia.com/gpu: 8
    

    标准

    对于 GKE 标准模式,请配置以下资源:

    containers:
      - name: my-container
        volumeMounts:
          - name: library-dir-host
            mountPath: /usr/local/nvidia
          - name: gib
            mountPath: /usr/local/gib
        env:
          - name: LD_LIBRARY_PATH
            value: /usr/local/nvidia/lib64
        resources:
          limits:
            nvidia.com/gpu: 8
    
  5. 使用工作负载容器中的以下 shell 脚本设置所有必需的环境变量,以配置 NCCL:

    source /usr/local/gib/scripts/set_nccl_env.sh
    

以下标签页包含已完成的 Pod 清单示例。

Autopilot

对于 GKE Autopilot 模式,完成后的 Pod 清单应类似于以下内容:

apiVersion: apps/v1
kind: Pod
metadata:
  name: my-pod
  labels:
    k8s-app: my-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth1","network":"gvnic-1"},
        {"interfaceName":"eth2","network":"rdma-0"},
        {"interfaceName":"eth3","network":"rdma-1"},
        {"interfaceName":"eth4","network":"rdma-2"},
        {"interfaceName":"eth5","network":"rdma-3"},
        {"interfaceName":"eth6","network":"rdma-4"},
        {"interfaceName":"eth7","network":"rdma-5"},
        {"interfaceName":"eth8","network":"rdma-6"},
        {"interfaceName":"eth9","network":"rdma-7"}
      ]
spec:
  ...
  volumes:
    - name: library-dir-host
      hostPath:
        path: /home/kubernetes/bin/nvidia
    - name: gib
      hostPath:
        path: /home/kubernetes/bin/gib
  containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
          readOnly: true
        - name: gib
          mountPath: /usr/local/gib
          readOnly: true
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 8
          ...

标准

对于 GKE Standard 模式,完成后的 Pod 清单应类似于以下内容:

apiVersion: apps/v1
kind: Pod
metadata:
  name: my-pod
  labels:
    k8s-app: my-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth2","network":"rdma-0"},
        {"interfaceName":"eth3","network":"rdma-1"},
        {"interfaceName":"eth4","network":"rdma-2"},
        {"interfaceName":"eth5","network":"rdma-3"},
        {"interfaceName":"eth6","network":"rdma-4"},
        {"interfaceName":"eth7","network":"rdma-5"},
        {"interfaceName":"eth8","network":"rdma-6"},
        {"interfaceName":"eth9","network":"rdma-7"}
      ]
spec:
  ...
  volumes:
    - name: library-dir-host
      hostPath:
        path: /home/kubernetes/bin/nvidia
    - name: gib
      hostPath:
        path: /home/kubernetes/bin/gib
  containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
        - name: gib
          mountPath: /usr/local/gib
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 8
          ...

测试使用 GPUDirect RDMA 的集群的网络性能

我们建议您验证已配置集群的功能。为此,请使用 NCCL/gIB 测试,这些测试是针对 Google 环境优化的 NVIDIA Collective Communications Library (NCCL) 测试

后续步骤