本文档介绍了如何为 GPU 和 TPU 等加速器虚拟机使用自动化网络,以简化 Google Kubernetes Engine (GKE) 加速器工作负载的网络配置。这对于在加速器优化型机器上运行人工智能 (AI)、机器学习 (ML) 和高性能计算 (HPC) 至关重要。
本文档假定您熟悉基本的 GKE 概念、GPU 和 TPU 工作负载以及 VPC 网络。具体来说,您应熟悉以下内容:
本页面适用于为组织设计和构建网络架构的云架构师和网络专家。如需简要了解所有 GKE 文档集,请参阅探索 GKE 文档。如需详细了解我们在Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
GKE 可简化在专用加速器上运行高性能 AI 和机器学习的过程。借助加速器虚拟机的自动化网络,您可以通过单个配置标志启用高速多网络连接,这对于 RDMA 等协议至关重要。此自动化消除了为每个节点池和 Pod 设置多个 VPC 网络、管理 IP 地址范围以及配置网络接口的复杂手动过程。通过在创建节点池时使用单个参数,GKE 即可提供所有必要的云和 Kubernetes 网络资源。
术语
以下术语对于了解加速器虚拟机的网络架构至关重要。
- 虚拟私有云 (VPC):VPC 是物理网络的虚拟版本,在 Google 的生产网络内部实现。它为 Compute Engine 虚拟机 (VM) 实例、GKE 集群和其他资源提供连接。
- Titanium NIC:一种智能 NIC,可将网络处理任务从 CPU 分流,使 CPU 能够专注于处理工作负载。在 GPU 机器上,它们处理所有非直接 GPU 到 GPU 通信的流量。在 TPU 机器上,所有 NIC 都是 Titanium NIC。
- 子网:子网是较大 VPC 的一个分段部分。每个子网都与一个区域相关联,并具有已定义的 IP 地址范围。
- 网络接口控制器 (NIC):NIC 是一种将虚拟机实例连接到网络的虚拟网络接口。每个 NIC 都连接到特定的 VPC 和子网。
- 宿主网络:节点的主要网络接口 (NIC) 用于进行常规集群通信(例如控制平面流量和常规 Pod 网络)的主要网络。
- 数据网络:用于在加速器虚拟机之间进行高性能数据传输的专用网络。对于 GPU,这通常是启用 RDMA 的 GPUDirect VPC。 对于 TPU,这可能是第二个宿主网络。
- 远程直接内存访问 (RDMA):RDMA 是一种技术,可让网络设备直接与计算机的主内存交换数据,而无需操作系统或 CPU 参与。这可显著缩短延迟时间并提高吞吐量,对于 HPC 和机器学习工作负载至关重要。
- NVLink:NVLink 是 NVIDIA 开发的一种高速互连技术,用于连接单个节点内的多个 GPU,使它们能够共享内存并协同处理大型数据集。
- Kubernetes 动态资源分配 (DRA):DRA 是一项 Kubernetes 功能,可为 Pod 提供更灵活的资源(例如 GPU 和其他专用硬件)请求和使用方式。这样可以对资源分配进行精细控制。
自动化网络的工作原理
加速器优化型机器具有专门的网络架构,可支持 GPU 和 TPU 之间的高吞吐量、低延迟通信。每台物理机器都包含多个 GPU 或 TPU,通常通过 NVLink 等高速互连进行连接。这些机器还具有一个或多个用于常规网络的 NIC,以及多个用于高速互连的 GPU NIC。
当您创建使用加速器优化型机器类型的 GKE 节点时,GKE 会在底层虚拟机上配置多个 NIC。宿主 NIC 连接到宿主 VPC 网络,以进行常规集群通信和管理,从而与控制平面通信。GPU NIC 连接到专用高性能 VPC 网络,通常启用 RDMA 并设置较高的 MTU (8896),以实现 GPUDirect 通信。
当 Pod 请求 GPU 或 TPU 时,您可以配置该 Pod 以访问节点上的高性能网络接口。您可以请求所有可用的 NIC,也可以请求特定的 NIC 子集。每个声明的网络接口都专用于单个 Pod,不会共享。此网络配置可确保 Pod 独占对相应接口的完整带宽和资源的访问权限,这对于对性能敏感的工作负载来说是一项关键优势。
限制
- Autopilot 集群不支持加速器虚拟机的自动化网络。
- 自动化网络要求集群使用 GKE Dataplane V2。
- 支持的机器类型:A3、A4 和 TPU Trillium (v6e) 加速器优化型机器系列支持自动化网络。
- 要求使用单可用区节点池:您必须使用具有单个可用区的节点池。
- 使用 GKE 托管的 DRANET 配置工作负载时,请参阅 GKE 托管的 DRANET 的关键注意事项和限制。
- 您不能在同一节点池中同时使用 多网络 API 和 DRANET。您必须为 Pod 的网络连接选择其中一种方法。
加速器优化型机器的网络配置
加速器优化型机器的网络配置因其类型而异。下表总结了各种机器类型的网络规范。
GPU 加速器虚拟机
| 机器类型 | GPU 数量 | Titanium NIC 的数量 | GPU NIC 的数量 | GPUDirect 技术 | 其他 VPC |
|---|---|---|---|---|---|
| A3 | 8 (H100) | 1 | 4 | TCPX | 4(用于 GPU NIC) |
| A3 Mega | 8 (H100) | 1 | 8 | TCPXO | 8(用于 GPU NIC) |
| A3 Ultra | 8 (H200) | 2 | 8 | RDMA | 2(1 个用于第二个 NIC,1 个用于 GPU NIC) |
| A4 | 8 (B200) | 2 | 8 | RDMA | 2(1 个用于第二个 NIC,1 个用于 GPU NIC) |
| A4X | 4 (GB200) | 1 | 4 | RDMA | 2(1 个用于第二个 NIC,1 个用于 GPU NIC) |
TPU 加速器虚拟机
| 机器类型 | TPU 芯片数量 | NIC 的数量 | 其他 VPC |
|---|---|---|---|
| TPU Trillium (v6e) (ct6e-standard-4t) | 4 | 2 | 2(1 个用于第 2 个 NIC,1 个用于第 1 个 NIC 上的额外 vNIC) |
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行
gcloud components update命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
确保您的集群使用 GKE 1.34.1-gke.1829001 版或更高版本。
确保您的集群具有 GKE Dataplane V2。您可以在创建新集群或更新现有集群时启用此功能。
创建新集群:
gcloud container clusters create CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --enable-dataplane-v2替换以下内容:
CLUSTER_NAME:新集群的名称。CLUSTER_VERSION:集群的版本,必须为 1.34.1-gke.1829001 或更高版本。
更新现有集群:
gcloud container clusters update CLUSTER_NAME \ --enable-dataplane-v2将
CLUSTER_NAME替换为您的集群名称。
如果您计划部署使用 RDMA 的 GPU 工作负载,请验证是否存在
DeviceClass资源:kubectl get deviceclass mrdma.google.com
创建具有默认网络配置文件的节点池
如需自动创建连接单个可用区内所有 GPU 或 TPU 机器的网络,请创建具有 auto 加速器网络配置文件的节点池。
gcloud
如需创建具有自动配置的网络配置文件的节点池,请运行以下命令:
gcloud beta container node-pools create NODE_POOL_NAME \
--accelerator-network-profile=auto \
--node-locations=ZONE \
--machine-type=MACHINE_TYPE
如需详细了解如何创建包含加速器的节点池,请参阅在 Autopilot 节点池中运行 GPU和在 Autopilot 中部署 TPU 工作负载。按照这些文档中的说明操作时,请将 --accelerator-network-profile=auto 标志附加到 gcloud container node-pools create 命令。
对于多主机 TPU 切片节点池,您还需要添加 --tpu-topology 标志。
替换以下内容:
NODE_POOL_NAME:新节点池的名称。ZONE:节点池的可用区。MACHINE_TYPE:节点的机器类型,例如a3-ultragpu-8g。
REST
在对 nodePools.create 方法的请求中,指定 accelerator_network_profile 字段:
{
"nodePool": {
"name": "NODE_POOL_NAME",
"machineType": "MACHINE_TYPE",
...
"accelerator_network_profile": "auto"
}
}
替换以下内容:
NODE_POOL_NAME:新节点池的名称。MACHINE_TYPE:节点的机器类型,例如a3-ultragpu-8g。
安排使用 GPU 的工作负载
以下部分介绍了如何配置 GPU 节点池和工作负载,以使用 GKE 托管的 DRANET 来启用 RDMA 网络接口。如需了解详情,请参阅使用 GKE 托管的 DRANET 来分配网络资源。
在 GPU 节点池上启用 GKE 托管的 DRANET 驱动程序
如需在支持 RDMA 的 GPU 节点池上启用 GKE DRANET 驱动程序,请在创建节点池时添加 cloud.google.com/gke-networking-dra-driver=true 标签。
gcloud beta container node-pools create NODE_POOL_NAME \
--region=REGION \
--cluster=CLUSTER_NAME \
--node-locations=NODE_LOCATIONS \
--accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
--machine-type=MACHINE_TYPE \
--num-nodes=NUM_NODES \
--reservation-affinity=specific \
--reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
--accelerator-network-profile=auto \
--node-labels=cloud.google.com/gke-networking-dra-driver=true
替换以下内容:
NODE_POOL_NAME:新节点池的名称。REGION:集群的 Google Cloud 区域。CLUSTER_NAME:您的集群的名称。ACCELERATOR_TYPE:GPU 加速器的类型:例如:
- A4 虚拟机:输入
nvidia-b200。 - A3 Ultra 虚拟机:输入
nvidia-h200-141gb。
- A4 虚拟机:输入
ACCELERATOR_COUNT:要挂接到节点池中节点的 GPU 数量。 例如,对于 a4-highgpu-8g 和 a3-ultragpu-8g 虚拟机,GPU 数量均为 8。DRIVER_VERSION:要使用的 GPU 驱动程序版本。例如default或latest。MACHINE_TYPE:节点池的机器类型,例如a3-ultragpu-8g。NUM_NODES:节点池的节点数。对于灵活启动,此值必须设置为 0。RESERVATION_PROJECT:预留的项目 ID。RESERVATION_NAME:预留的名称。 如需查找此值,请参阅查看未来预留请求。RESERVATION_BLOCK:预留中特定块的名称。如需查找此值,请参阅查看未来预留请求。
此命令使用加速器网络配置文件自动为加速器虚拟机配置 VPC 网络和子网。或者,您也可以明确指定 VPC 网络和子网。
部署工作负载 RDMA 资源
如需为 Pod 分配 RDMA 资源,请指定 ResourceClaimTemplate。
创建
ResourceClaimTemplate以定义如何分配 RDMA 设备。 以下清单请求节点上的所有可用mrdma设备。将该清单保存为all-mrdma-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: all-mrdma spec: spec: devices: requests: - name: req-mrdma exactly: deviceClassName: mrdma.google.com allocationMode: All应用清单:
kubectl apply -f all-mrdma-template.yaml部署工作负载并引用
ResourceClaimTemplate。以下清单部署了一个引用all-mrdma模板的 Pod,该模板会授予 Pod 对节点上 RDMA 接口的访问权限。将该清单保存为agnhost-rdma-pod.yaml:apiVersion: v1 kind: Pod metadata: name: agnhost-rdma namespace: default labels: app: agnhost spec: containers: - name: agnhost image: registry.k8s.io/e2e-test-images/agnhost:2.39 args: ["netexec", "--http-port", "80"] ports: - name: agnhost-port containerPort: 80 resources: claims: - name: rdma limits: nvidia.com/gpu: 1 resourceClaims: - name: rdma resourceClaimTemplateName: all-mrdma应用清单:
kubectl apply -f agnhost-rdma-pod.yaml验证在 Pod 内是否可以看到额外分配的网络接口。
kubectl exec agnhost-rdma -- ls /sys/class/net以下示例输出显示了默认的
eth0和lo接口,以及分配的 RDMA 接口(例如gpu0rdma0)。网络接口 (NIC) 的数量和名称因 GKE 节点的机器类型而异。eth0 gpu0rdma0 gpu1rdma0 gpu2rdma0 gpu3rdma0 lo
安排使用 TPU 的工作负载
以下部分介绍了如何配置 TPU 节点池和工作负载,以使用 GKE 托管的 DRANET 来启用非 RDMA 网络接口。如需了解详情,请参阅使用 GKE 托管的 DRANET 来分配网络资源。
验证网络 DeviceClass
验证集群中是否存在用于网络的 DeviceClass 资源。
kubectl get deviceclass netdev.google.com
输出类似于以下内容:
NAME AGE
netdev.google.com 2d22h
在 TPU 切片节点池上启用 GKE 管理的 DRANET 驱动程序
如需在创建 TPU 切片节点池时启用 GKE DRANET 驱动程序,请添加 cloud.google.com/gke-networking-dra-driver=true 标签。
gcloud beta container node-pools create NODE_POOL_NAME \
--location=LOCATION \
--cluster=CLUSTER_NAME \
--node-locations=NODE_LOCATIONS \
--machine-type=MACHINE_TYPE \
--tpu-topology=TPU_TOPOLOGY \
--num-nodes=NUM_NODES \
--accelerator-network-profile=auto \
--node-labels=cloud.google.com/gke-networking-dra-driver=true
替换以下内容:
NODE_POOL_NAME:新节点池的名称。LOCATION:集群的 Google Cloud 区域或可用区。CLUSTER_NAME:您的集群的名称。NODE_LOCATIONS:节点池中节点的 Google Cloud 可用区。MACHINE_TYPE:要用于节点的机器类型。 如需详细了解与 TPU 兼容的机器类型,请参阅选择 TPU 版本。TPU_TOPOLOGY:TPU 拓扑,例如2x4x4。 拓扑格式取决于 TPU 版本。如需详细了解 TPU 拓扑,请参阅选择拓扑。NUM_NODES:节点池中的节点数。
如需了解详情,请参阅创建单主机 TPU 切片节点池。
部署声明所有网络设备的工作负载
如需为 Pod 分配非 RDMA 网络设备,请指定 ResourceClaimTemplate。
创建引用
netdev.google.comDeviceClass的ResourceClaimTemplate。以下清单将请求节点上的所有可用非 RDMA 网络设备。将清单保存为
all-netdev-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: all-netdev spec: spec: devices: requests: - name: req-netdev exactly: deviceClassName: netdev.google.com allocationMode: All应用清单:
kubectl apply -f all-netdev-template.yaml部署工作负载并引用
ResourceClaimTemplate。以下清单部署了一个使用all-netdev模板的 Pod,以授予该 Pod 对节点上所有非 RDMA 网络设备的访问权限。 将该清单保存为netdev-pod.yaml:apiVersion: v1 kind: Pod metadata: name: agnhost-netdev namespace: default labels: app: agnhost spec: containers: - name: agnhost image: registry.k8s.io/e2e-test-images/agnhost:2.39 args: ["netexec", "--http-port", "80"] ports: - name: agnhost-port containerPort: 80 resources: claims: - name: netdev limits: google.com/tpu: 4 nodeSelector: cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY resourceClaims: - name: netdev resourceClaimTemplateName: all-netdev替换以下内容:
TPU_ACCELERATOR:TPU 加速器类型,例如tpu-v5p-slice。TPU_TOPOLOGY:TPU 拓扑,例如2x4x4。
应用清单:
kubectl apply -f netdev-pod.yaml验证在 Pod 内是否可以看到额外分配的网络接口。
kubectl exec agnhost-netdev -- ls /sys/class/net以下示例输出显示了默认的
eth0和lo接口,以及已分配的网络设备(名称类似于eth1和eth2)。NIC 的数量及其名称会因 GKE 节点的机器类型而异。eth0 eth1 eth2 lo
问题排查
如需检查节点池的网络设置,请运行以下命令:
gcloud beta container node-pools describe NODE_POOL_NAME \
--zone=ZONE \
--cluster=CLUSTER_NAME
替换以下内容:
NODE_POOL_NAME:节点池的名称。ZONE:节点池的可用区。CLUSTER_NAME:您的集群的名称。
输出结果会显示连接到节点池的其他网络和子网。
后续步骤
- 了解加速器优化型机器。
- 了解如何使用 DRA 预配 GPU。
- 了解如何设置 Pod 的多网络支持。
- 了解如何使用 GKE 托管的 DRANET 来分配网络资源