本页面介绍了如何创建经过 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 角色:
-
Kubernetes Engine Admin (
roles/container.admin) -
Cloud Build Editor (
roles/cloudbuild.builds.editor) -
Compute Admin (
roles/compute.admin) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin) -
Service Account Admin (
roles/iam.serviceAccountAdmin) -
Service Account User (
roles/iam.serviceAccountUser) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) -
Storage Admin (
roles/storage.admin)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
选择使用选项并获取容量
选择使用选项。您可以根据自己获取和使用 GPU 资源的方式做出选择。如需了解详情,请参阅选择消费选项。
对于 GKE,在选择消费选项时,请考虑以下其他信息:
- 如需详细了解灵活启动(预览版)和 GKE,请参阅灵活启动的 GPU 可获取性简介。
- 灵活启动使用尽力而为的紧凑放置。如需检查拓扑,请参阅查看 GKE 集群中节点的物理拓扑。
- 只有在配置紧凑放置时,才能在使用 Spot 虚拟机时获取拓扑信息。
获取容量。了解如何为您的消费选项获取容量。
要求
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-8g或a3-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 节点池。
- 选择驱动程序版本:
- 驱动程序版本可以是以下值之一:
- 如需详细了解 GKE 节点版本的默认和最新 GPU 驱动程序版本,请参阅手动安装 NVIDIA GPU 驱动程序。
选择预留亲和性:
- 您可以找到有关预留的信息,例如预留的名称或预留中特定块的名称。如需查找这些值,请参阅查看未来预留请求。
--reservation-affinity标志的值可以是specific或any。不过,对于高性能分布式 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 的其他节点池的集群。此方法允许默认节点池运行其他服务。
创建集群:
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替换为控制平面的可用区。
使用以下命令之一创建基于 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_TYPE:GPU 加速器的类型:- A4 虚拟机:输入
nvidia-b200。 - A3 Ultra 虚拟机:输入
nvidia-h200-141gb。
- A4 虚拟机:输入
AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于a4-highgpu-8g和a3-ultragpu-8g虚拟机,GPU 数量均为8。DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:default、latest或disabled。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_TYPE:GPU 加速器的类型:- A4 虚拟机:输入
nvidia-b200。 - A3 Ultra 虚拟机:输入
nvidia-h200-141gb。
- A4 虚拟机:输入
AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于a4-highgpu-8g和a3-ultragpu-8g虚拟机,GPU 数量均为8。DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:default、latest或disabled。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_TYPE:GPU 加速器的类型:- A4 虚拟机:输入
nvidia-b200。 - A3 Ultra 虚拟机:输入
nvidia-h200-141gb。
- A4 虚拟机:输入
AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于a4-highgpu-8g和a3-ultragpu-8g虚拟机,GPU 数量均为8。DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:default、latest或disabled。MACHINE_TYPE:节点的 Compute Engine 机器类型。例如,对于 A4 虚拟机,请使用a4-highgpu-8g;对于 A3 Ultra 虚拟机,请使用a3-ultragpu-8g。NUM_NODES:节点池的节点数。如需详细了解如何使用 Spot 虚拟机创建集群,请参阅使用 Spot 虚拟机以更低的费用运行容错工作负载。
连接到集群,以便运行下一部分中的
kubectl命令:gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION替换以下内容:
CLUSTER_NAME:您的集群的名称。COMPUTE_REGION:计算区域的名称。如需了解详情,请参阅安装 kubectl 并配置集群访问权限。
创建启用了 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 集群,请完成以下步骤(将在后续部分中介绍):
- 创建 VPC 和子网
- 创建具有多网络功能的 GKE 集群
- 创建 GKE 网络对象
- 安装 RDMA 二进制文件并配置 NCCL
- 部署并运行 NCCL 测试
- 为 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。
设置环境变量以匹配您的部署:
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。
创建两个 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
创建具有多网络功能的 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:计算区域的名称。
连接到集群,以便运行后续部分中的
kubectl命令:gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION替换以下内容:
CLUSTER_NAME:您的集群的名称。COMPUTE_REGION:计算区域的名称。
如需了解详情,请参阅安装 kubectl 并配置集群访问权限。
标准
创建具有多网络的 GKE Standard 集群和 GPU 节点池:
创建集群:
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/19和POD_CIDR=10.64.0.0/19值中的范围不会相互重叠。如需了解详情,请参阅添加 Pod IPv4 地址范围。创建节点池。您需要运行的命令取决于您为部署使用的使用选项。选择与您的使用选项的配置模式对应的标签页。
受预留约束
对于与预留绑定的配置,请运行以下命令:
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_TYPE:GPU 加速器的类型:- A4 虚拟机:输入
nvidia-b200。 - A3 Ultra 虚拟机:输入
nvidia-h200-141gb。
- A4 虚拟机:输入
AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于a4-highgpu-8g和a3-ultragpu-8g虚拟机,GPU 数量均为8。DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:default、latest或disabled。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_TYPE:GPU 加速器的类型:- A4 虚拟机:输入
nvidia-b200。 - A3 Ultra 虚拟机:输入
nvidia-h200-141gb。
- A4 虚拟机:输入
AMOUNT:要挂接到节点池中节点的 GPU 数量。例如,对于a4-highgpu-8g和a3-ultragpu-8g虚拟机,GPU 数量均为8。DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。它可以是以下值之一:default、latest或disabled。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标志。如需详细了解如何使用灵活启动,请参阅通过灵活启动(带排队配置)运行大规模工作负载。
连接到集群,以便运行后续部分中的
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 清单:
将以下注解添加到 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"} ]使用节点选择器指定所选 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 容量预留的名称。
如需使用共享预留或预留的特定块和子块,请参阅使用预留的可用区级路径资源中的相应部分。
将以下卷添加到 Pod 规范中:
spec: volumes: - name: library-dir-host hostPath: path: /home/kubernetes/bin/nvidia - name: gib hostPath: path: /home/kubernetes/bin/gib将以下卷装载、环境变量和资源添加到请求 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使用工作负载容器中的以下 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) 测试。
后续步骤
- 如需详细了解如何使用拓扑感知调度 (TAS) 和 Kueue 在 GKE 集群上调度工作负载,请参阅通过拓扑感知调度安排 GKE 工作负载。
- 如需详细了解如何管理与 GKE 集群和 AI 工作负载相关的常见事件,请参阅管理 AI 优化型 GKE 集群。
- 如需了解如何测试环境以确保设置和优化正确无误,请参阅使用 NCCL/gIB 优化集群网络。