本页面介绍了如何将 Standard 集群与 GPUDirect-TCPXO、GPUDirect-TCPX、gVNIC 和多网络功能搭配使用,以便在 Google Kubernetes Engine (GKE) 中最大限度地提高高性能 GPU 工作负载的网络带宽和吞吐量。
本页面适用于为机器学习 (ML) 工作负载提供支持的机器学习工程师和平台管理员。在阅读本页面内容之前,请确保您熟悉网络接口卡 (NIC) 和 TCP 等网络技术,以及 NVIDIA Collective Communications Library (NCCL) 等加速器技术。
人工智能 (AI)、机器学习和高性能计算 (HPC) 应用需要通过缩短作业完成时间来获得极大的加速,从而优化性能。例如,用于对话式 AI 和图像生成的机器学习模型需要强大的可伸缩性和计算能力。
Google Cloud GPU 超级计算机简介
Google Cloud 提供专为可伸缩的大型模型构建的加速器优化超级计算机。这种机器具有以下优势:
- 每个机器搭载八个 NVIDIA H100 GPU。
- 主 NIC 可支持最高 200 Gbps 的带宽。
- 次要 NIC(A3 Mega 机器类型上最多 8 个,A3 High 机器类型最多 4 个),每个 NIC 支持最高 200 Gbps 的 GPU 数据传输带宽。
如需查看完整的优势列表,请参阅 Compute Engine 文档中的 A3 机器系列。
您的 GKE 工作负载必须使用单个节点上所有可用的 GPU 和所有可用的次要 NIC,并使用大部分的可用带宽。本页面中所述的解决方案非常适合需要高性能、高吞吐量和低延迟的工作负载。
最大限度地提高带宽所必需的特性和功能
如需最大限度地提高 GPU 超级计算机节点中的网络带宽,请使用以下所有功能:
- GPUDirect 网络栈:A3 机器系列支持两种网络栈,用于自定义远程直接内存访问 (RDMA):
- 在 A3 High 机器类型上,利用 GPUDirect-TCPX 减少与 GPU 来回传输数据包载荷所需的开销,这与不使用 GPUDirect 的 GPU 相比,可大规模显著提高吞吐量。
- 在 A3 Mega 机器类型上,利用 GPUDirect-TCPXO,进一步改进 GPU 到虚拟机的通信。
- gVNIC:支持 GPUDirect 功能,例如数据包标头拆分、流导向和缓冲区管理。使用 GPUDirect-TCPX 或 GPUDirect-TCPXO 需要 gVNIC。如需详细了解 gVNIC,请参阅提高 GPU 节点的网络流量速度。
- 多网络:将次要 NIC 添加到加速器优化的机器。为避免冲突,每个 NIC 都与其专属的 VPC 中的单独子网相关联。如需详细了解多网络支持,请参阅设置 Pod 的多网络支持。
- 布置政策:使用资源布置政策将特定工作负载的所有 GPU 节点放置在物理位置彼此靠近的服务器上,以最大限度地缩短延迟时间。如需了解详情,请参阅为 GKE 节点定义紧凑布置。
流程概览
如需使用所有这些功能,您需要完成以下任务:
- 创建 Virtual Private Cloud (VPC) 和子网
- 创建 GKE 环境:
- 创建启用多网络的集群
- 创建具有以下特征的节点池:
- 启用了 gVNIC
- 为每个次要 NIC 指定了多网络子网
- 具有为节点提供支持的 H100 GPU 的 A3 机器系列
- 安装了最新 NVIDIA 驱动程序
- 安装 GPUDirect 二进制文件和 NCCL 插件
- 部署 NRI 设备注入器插件
- 部署测试工作负载以验证 GPUDirect 设置
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
- 确保您有足够的 H100 GPU 配额。如需申请更多配额,请参阅 GPU 配额。
要求
除非另有说明,否则以下要求同时适用于 GPUDirect-TCPX 和 GPUDirect-TCPXO。
- GPUDirect-TCPX 在 GKE 1.27 版或更高版本上受支持,并且需要:
- A3 High 机器类型(例如
a3-highgpu-8g
)。 - 对于 GKE 1.27 版,请使用 GKE 补丁 1.27.7-gke.1121000 版或更高版本。
- 对于 GKE 1.28 版,请使用 GKE 补丁 1.28.8-gke.1095000 版或更高版本。
- 对于 GKE 1.29 版,请使用 GKE 补丁 1.29.3-gke.1093000 版或更高版本。
- 对于 GKE 1.30 版,请使用 GKE 补丁 1.30.2-gke.1023000 版或更高版本。
- A3 High 机器类型(例如
- GPUDirect-TCPXO 在 GKE 1.28 版或更高版本上受支持,并且需要:
- A3 Mega 机器类型(例如
a3-megagpu-8g
)。 - 对于 GKE 1.28 版,请使用 GKE 补丁 1.28.9-gke.1250000 版或更高版本。
- 对于 GKE 1.29 版,请使用 GKE 补丁 1.29.4-gke.1542000 版或更高版本。
- 对于 GKE 1.30 版,请使用 GKE 补丁 1.30.4-gke.1129000 版或更高版本。
- A3 Mega 机器类型(例如
- 您的 GPU 节点必须使用 535 或更高版本的 NVIDIA 驱动程序。
- 您必须使用 GKE Dataplane V2。
- GKE 节点必须使用 Container-Optimized OS (COS) 节点映像。不支持 Ubuntu 和 Windows 节点映像。
限制
存在以下限制:
- Autopilot 集群不支持 GPUDirect-TCPX 和 GPUDirect-TCPXO
- 多实例 GPU、GPU 分时或 NVIDIA MPS 不支持 GPUDirect-TCPX 和 GPUDirect-TCPXO
- 您无法使用 NCCL FastSocket
- 您的 GKE 工作负载必须使用单个节点上所有可用的 GPU 和所有可用的次要 NIC。多个 Pod 无法在单个节点上使用 GPUDirect-TCPX 或 GPUDirect-TCPXO。
创建 VPC 和子网
在项目中为将要添加到节点的每个虚拟 NIC 创建单独的 VPC 网络。每个 VPC 网络都必须具有一个子网和一条允许内部网络流量的防火墙规则。
在项目中为 GPUDirect 创建 VPC 网络,每个 VPC 网络都具有一个子网和一条防火墙规则。为 A3 High 机器类型选择 GPUDirect-TCPX 标签页,或是为 A3 Mega 机器类型选择 GPUDirect-TCPXO 标签页,然后按照以下说明操作:
GPUDirect-TCPXO
为了最大限度地提高带宽,我们建议您创建八个新网络。
for N in $(seq 1 8); do gcloud compute networks create PROJECT_ID-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PROJECT_ID-sub-$N \ --network=PROJECT_ID-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PROJECT_ID-internal-$N \ --network=PROJECT_ID-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=SOURCE_RANGE done
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目 ID。REGION
:每个子网的 Compute Engine 区域。SUBNET_RANGE
:每个子网的 IP 地址范围,采用 CIDR 表示法。此示例命令将针对八个子网进行迭代,因此您应该使用变量来更改每个子网的 IP 地址。例如,指定192.168.$N.0/24
,从而使第一个子网使用192.168.1.0/24
,第二个子网使用192.168.2.0/24
,以此类推。SOURCE_RANGE
:允许入站流量的防火墙规则的来源 IP 地址范围(采用 CIDR 表示法)。例如192.168.0.0/16
。
GPUDirect-TCPX
为了最大限度地提高带宽,我们建议您创建四个新网络。
for N in $(seq 1 4); do gcloud compute networks create PROJECT_ID-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PROJECT_ID-sub-$N \ --network=PROJECT_ID-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PROJECT_ID-internal-$N \ --network=PROJECT_ID-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=SOURCE_RANGE done
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目 ID。REGION
:每个子网的 Compute Engine 区域。SUBNET_RANGE
:每个子网的 IP 地址范围,采用 CIDR 表示法。此示例命令将针对四个子网进行迭代,因此您应该使用变量来更改每个子网的 IP 地址。例如,指定192.168.$N.0/24
,从而使第一个子网使用192.168.1.0/24
,第二个子网使用192.168.2.0/24
,以此类推。SOURCE_RANGE
:允许入站流量的防火墙规则的来源 IP 地址范围(采用 CIDR 表示法)。例如192.168.0.0/16
。
验证网络已创建:
gcloud compute networks list
创建 GKE 环境
创建一个使用多网络(预览版)的新 GKE 集群,并创建一个 GPU 节点池,该节点池使用搭载 H100 GPU 并具有额外 NIC 的 A3 机器。您无法通过更新现有集群来使用多网络。
GPUDirect-TCPXO
选择支持 GPUDirect-TCPXO 的可用 GKE 版本。如需列出版本,请运行以下命令:
gcloud container get-server-config \ --format="yaml(validMasterVersions)" \ --zone=ZONE \ --project=PROJECT_ID
替换以下内容:
ZONE
:集群控制平面的计算可用区。PROJECT_ID
:您的 Google Cloud 项目 ID。
创建集群:
gcloud --project ${PROJECT} beta container clusters create CLUSTER_NAME \ --enable-dataplane-v2 --enable-ip-alias --zone=ZONE \ --enable-multi-networking --cluster-version=VERSION --no-enable-autoupgrade
请替换以下内容:
在与您创建的 VPC 网络和子网相对应的集群中创建 Network 和 GKENetworkParamSet 资源:
kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc1 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc1 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc2 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc2 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc3 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc3 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc4 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc4 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc5 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc5 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc6 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc6 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc7 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc7 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc8 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc8 type: Device --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc1 spec: vpc: PROJECT_ID-net-1 vpcSubnet: PROJECT_ID-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PROJECT_ID-net-2 vpcSubnet: PROJECT_ID-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PROJECT_ID-net-3 vpcSubnet: PROJECT_ID-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PROJECT_ID-net-4 vpcSubnet: PROJECT_ID-sub-4 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc5 spec: vpc: PROJECT_ID-net-5 vpcSubnet: PROJECT_ID-sub-5 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc6 spec: vpc: PROJECT_ID-net-6 vpcSubnet: PROJECT_ID-sub-6 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc7 spec: vpc: PROJECT_ID-net-7 vpcSubnet: PROJECT_ID-sub-7 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc8 spec: vpc: PROJECT_ID-net-8 vpcSubnet: PROJECT_ID-sub-8 deviceMode: NetDevice EOF
这些资源会告诉 GKE 以直通模式为 GPU 流量配置 NIC。GKE 不会为此流量应用使用 eBPF 的内置网络编程。
为 H100 GPU 创建节点池:
gcloud beta container node-pools create NODE_POOL_NAME \ --zone=ZONE \ --cluster=CLUSTER_NAME \ --project=PROJECT_ID \ --accelerator=type=nvidia-h100-mega-80gb,count=8,gpu-driver-version=LATEST \ --machine-type=a3-megagpu-8g \ --num-nodes=2 \ --additional-node-network network=PREFIX-net-1,subnetwork=PREFIX-sub-1 \ --additional-node-network network=PREFIX-net-2,subnetwork=PREFIX-sub-2 \ --additional-node-network network=PREFIX-net-3,subnetwork=PREFIX-sub-3 \ --additional-node-network network=PREFIX-net-4,subnetwork=PREFIX-sub-4 \ --additional-node-network network=PREFIX-net-5,subnetwork=PREFIX-sub-5 \ --additional-node-network network=PREFIX-net-6,subnetwork=PREFIX-sub-6 \ --additional-node-network network=PREFIX-net-7,subnetwork=PREFIX-sub-7 \ --additional-node-network network=PREFIX-net-8,subnetwork=PREFIX-sub-8 \ --enable-gvnic \ --no-enable-autoupgrade \ --scopes "https://www.googleapis.com/auth/cloud-platform" \ [--placement-policy=POLICY_NAME \ --reservation-affinity=specific \ --reservation=RESERVATION_NAME \ --host-maintenance-interval=PERIODIC]
将
NODE_POOL_NAME
替换为您的节点池名称。在该示例中,为方便测试,
--scopes
“https://www.googleapis.com/auth/cloud-platform”参数将节点实例的范围设置为cloud-platform
。对于生产环境,您可能需要限制范围,以配置更精细的凭据。如果您使用预留,请使用
--placement-policy
、--reservation-affinity
和--reservation
标志。指定这些标志以在节点池中配置政策名称和预留。如果此命令失败,则您的项目中可能没有足够的 H100 GPU 配额。确保您拥有足够的配额,然后重试命令。
获取集群中的节点列表:
kubectl get nodes
验证每个 GPU 节点都有八个 GPU:
kubectl describe node NODE_NAME
输出类似于以下内容:
Capacity: ... nvidia.com/gpu: 8 Allocatable: ... nvidia.com/gpu: 8
GPUDirect-TCPX
创建 Standard 集群:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION \ --enable-dataplane-v2 --enable-ip-alias \ --enable-multi-networking \ --no-enable-autoupgrade \
替换以下内容:
CLUSTER_NAME
:新集群的名称。LOCATION
:集群的 Compute Engine 区域。VERSION
:集群的 GKE 版本。使用“要求”部分中所述的受支持版本。
在与您创建的 VPC 网络和子网相对应的集群中创建 Network 和 GKENetworkParamSet 资源:
kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc1 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc1 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc2 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc2 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc3 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc3 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc4 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc4 type: Device --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc1 spec: vpc: PROJECT_ID-net-1 vpcSubnet: PROJECT_ID-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PROJECT_ID-net-2 vpcSubnet: PROJECT_ID-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PROJECT_ID-net-3 vpcSubnet: PROJECT_ID-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PROJECT_ID-net-4 vpcSubnet: PROJECT_ID-sub-4 deviceMode: NetDevice EOF
这些资源会告诉 GKE 以直通模式为 GPU 流量配置 NIC。GKE 不会为此流量应用使用 eBPF 的内置网络编程。
为 H100 GPU 创建节点池:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --machine-type=a3-highgpu-8g \ --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \ --additional-node-network=network=PROJECT_ID-net-1,subnetwork=PROJECT_ID-sub-1 \ --additional-node-network=network=PROJECT_ID-net-2,subnetwork=PROJECT_ID-sub-2 \ --additional-node-network=network=PROJECT_ID-net-3,subnetwork=PROJECT_ID-sub-3 \ --additional-node-network=network=PROJECT_ID-net-4,subnetwork=PROJECT_ID-sub-4 \ --enable-gvnic \ --no-enable-autoupgrade
将
NODE_POOL_NAME
替换为节点池的名称。如果此命令失败,则您的项目中可能没有足够的 H100 GPU 配额。确保您拥有配额,然后重试命令。
获取集群中的节点列表:
kubectl get nodes
验证每个 GPU 节点都有八个 GPU:
kubectl describe node NODE_NAME
输出类似于以下内容:
Capacity: ... nvidia.com/gpu: 8 Allocatable: ... nvidia.com/gpu: 8
安装 GPUDirect 二进制文件并配置 NCCL
本部分介绍如何使用 DaemonSet,根据您的 A3 机器类型(GPUDirect-TCPX 适用于 A3 High,GPUDirect-TCPXO 适用于 A3 Mega)安装 GPUDirect 二进制文件以及安装特定 NCCL 库版本。
GPUDirect-TCPXO
查看 GitHub 中的
nccl-tcpxo-installer.yaml
Daemonset 清单。此 DaemonSet 会执行以下操作:- 进行预安装以设置 GPUDirect-TCPXO 相关配置。
- 在节点上安装 NCCL 库和 GPUDirect-TCPXO 二进制文件。
- 将库和二进制文件存储在虚拟机上的
/home/kubernetes/bin/nvidia/lib64
目录中。默认情况下,GKE 会将此目录装载到需要使用 NCCL 和 GPUDirect-TCPXO 的 GPU 容器中的/usr/local/nvidia/lib64
路径中。
部署 DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-tcpxo-installer.yaml
NCCL 插件大约需要两分钟才能开始运行。
验证 DaemonSet Pod 的状态:
kubectl get pods -n=kube-system -l=name=nccl-tcpxo-installer
输出类似于以下内容:
# Output nccl-tcpxo-installer-6c2pv 1/1 Running 0 2m11s nccl-tcpxo-installer-qgg82 1/1 Running 0 2m11s
GPUDirect-TCPX
查看 GitHub 中的
nccl-tcpx-installer.yaml
Daemonset 清单。此 DaemonSet 会执行以下操作:- 在节点上安装 NCCL 库和 GPUDirect-TCPX 二进制文件。
- 将库和二进制文件存储在虚拟机上的
/home/kubernetes/bin/nvidia/lib64
目录中。默认情况下,GKE 会将此目录装载到需要使用 NCCL 和 GPUDirect-TCPX 的 GPU 容器中的/usr/local/nvidia/lib64
路径中。
部署 DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer.yaml
NCCL 插件大约需要两分钟才能开始运行。
验证 DaemonSet Pod 的状态:
kubectl get pods -n=kube-system -l=name=nccl-tcpx-installer
输出类似于以下内容:
nccl-tcpx-installer-6c2pv 1/1 Running 0 2m11s nccl-tcpx-installer-qgg82 1/1 Running 0 2m11s
部署 NRI 设备注入器插件
本部分介绍如何使用 DaemonSet 安装 NRI 设备注入器。两种 H100 机器类型(GPUDirect-TCPX 适用于 A3 High,GPUDirect-TCPXO 适用于 A3 Mega)都会安装相同的 NRI 设备注入器插件。
查看 GitHub 中的
nri-device-injector.yaml
部署清单。此 DaemonSet 会执行以下操作:- 在具有 H100 GPU 的节点上启用节点资源接口 (NRI)。
- 部署 NRI 设备注入器插件容器,该容器会将 GPU 设备注入由 Pod 注解指定的容器中。
部署 DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector.yaml
NCCL 插件大约需要两分钟才能开始运行。
验证 DaemonSet Pod 的状态:
kubectl get pods -n=kube-system -l=name=device-injector
输出类似于以下内容:
# Output device-injector-md6hb 1/1 Running 0 4h54m device-injector-vh9bm 1/1 Running 0 4h54m
部署测试工作负载
在本部分中,您将部署一个示例工作负载来验证 NCCL 和 GPUDirect-TCPX 或 GPUDirect-TCPXO 是否按预期运行。
GPUDirect-TCPXO
此工作负载包含一个名为 tcpxo-daemon 的边车容器,它运行一个服务以使 Pod 能够使用 GPUDirect-TCPXO。您必须将此边车容器添加到您自己环境中需要使用 GPUDirect-TCPXO 的所有 Pod。如需查看要添加到清单的必填字段的代码段,请参阅将 GPUDirect 添加到清单。
查看 GitHub 中的
nccl-test-latest.yaml
清单。此清单执行以下操作:- 部署两个 Pod,每个 Pod 都在具有 H100 GPU 的节点中运行。
- 在每个 Pod 中部署一个名为
tcpxo-daemon
的边车容器,以使这些 Pod 能够使用 GPUDirect-TCPXO。
部署包含测试工作负载的两个 Pod:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-test-latest.yaml
运行以下命令以对两个节点触发 NCCL all-gather 测试:
kubectl exec --stdin --tty --container=nccl-test nccl-test-host-1 -- /scripts/allgather.sh nccl-host-1 nccl-host-2
输出类似于以下内容:
# out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 1048576 16384 float none -1 4654.5 0.23 0.21 0 3890.9 0.27 0.25 0 2097152 32768 float none -1 4117.2 0.51 0.48 0 5153.5 0.41 0.38 0 4194304 65536 float none -1 6417.4 0.65 0.61 0 7295.5 0.57 0.54 0 8388608 131072 float none -1 7872.1 1.07 1.00 0 6451.4 1.30 1.22 0 16777216 262144 float none -1 6990.7 2.40 2.25 0 5609.3 2.99 2.80 0 33554432 524288 float none -1 8254.0 4.07 3.81 0 7415.1 4.53 4.24 0 67108864 1048576 float none -1 5546.3 12.10 11.34 0 6484.0 10.35 9.70 0 134217728 2097152 float none -1 6507.3 20.63 19.34 0 6015.4 22.31 20.92 0 268435456 4194304 float none -1 6744.1 39.80 37.32 0 7023.1 38.22 35.83 0 536870912 8388608 float none -1 8939.8 60.05 56.30 0 11706 45.86 43.00 0 1073741824 16777216 float none -1 8241.7 130.28 122.14 0 8375.2 128.20 120.19 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 22.449
GPUDirect-TCPX
此工作负载包含一个名为 tcpx-daemon 的边车容器,它运行一个服务以使 Pod 能够使用 GPUDirect-TCPX。tcpx-daemon您必须将此边车容器添加到您自己环境中需要使用 GPUDirect-TCPX 的所有 Pod。如需查看要添加到清单的必填字段的代码段,请参阅将 GPUDirect 添加到清单。
- 查看 GitHub 中的
nccl-config.yaml
ConfigMap 清单。此清单部署初始化 NCCL all-gather 测试的脚本并设置特定于 NCCL 的配置设置。 查看 GitHub 中的
nccl-test-latest.yaml
部署清单。此清单执行以下操作:- 部署两个 Pod,每个 Pod 都在具有 H100 GPU 的节点中运行。
- 在每个 Pod 中部署一个名为
tcpx-daemon
的边车容器,以使这些 Pod 能够使用 GPUDirect-TCPX。
部署 ConfigMap 和测试工作负载:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest.yaml
运行以下命令以触发节点的 NCCL all-gather 测试:
kubectl exec \ --stdin --tty --container=nccl-test nccl-test-host-1 \ -- /configs/allgather.sh nccl-host-1 nccl-host-2
输出类似于以下内容:
# out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 1048576 16384 float none -1 696.8 1.50 1.41 0 729.0 1.44 1.35 0 2097152 32768 float none -1 776.4 2.70 2.53 0 726.7 2.89 2.71 0 4194304 65536 float none -1 774.3 5.42 5.08 0 805.1 5.21 4.88 0 8388608 131072 float none -1 812.1 10.33 9.68 0 817.6 10.26 9.62 0 16777216 262144 float none -1 1035.2 16.21 15.19 0 1067.8 15.71 14.73 0 33554432 524288 float none -1 1183.3 28.36 26.59 0 1211.8 27.69 25.96 0 67108864 1048576 float none -1 1593.4 42.12 39.49 0 1510.5 44.43 41.65 0 134217728 2097152 float none -1 2127.8 63.08 59.13 0 2312.7 58.03 54.41 0 268435456 4194304 float none -1 3603.0 74.50 69.85 0 3586.2 74.85 70.17 0 536870912 8388608 float none -1 7101.7 75.60 70.87 0 7060.9 76.03 71.28 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 29.8293
使用所需的 NCCL 配置设置提高性能
以下键值对是 GPUDirect-TCPX 和 GPUDirect-TCPXO 所需的 NCCL 配置设置。部署使用 NCCL 的工作负载时,请将其设置为环境变量以优化性能。
GPUDirect-TCPXO
## required
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64\"",
"NCCL_FASTRAK_CTRL_DEV=eth0",
"NCCL_FASTRAK_IFNAME=eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8",
"NCCL_SOCKET_IFNAME=eth0",
"NCCL_CROSS_NIC=0",
"NCCL_ALGO=Ring,Tree",
"NCCL_PROTO=Simple",
"NCCL_MIN_NCHANNELS=4",
"NCCL_TUNER_PLUGIN=libnccl-tuner.so",
"NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config.textproto",
"NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config.textproto",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_FASTRAK_NUM_FLOWS=2",
"NCCL_FASTRAK_USE_SNAP=1",
"NCCL_FASTRAK_PLUGIN_ACCEPT_TIMEOUT_MS=600000",
"NCCL_FASTRAK_ENABLE_CONTROL_CHANNEL=0",
"NCCL_BUFFSIZE=8388608",
"CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_FASTRAK_ENABLE_HOTPATH_LOGGING=0",
"NCCL_FASTRAK_USE_LLCM=1",
"NCCL_NVLS_ENABLE=0"
## recommended, to log NCCL errors
"NCCL_DEBUG=WARN",
"NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH"
(可选)您可以按照以下步骤一次性设置所有配置:
在工作负载容器清单中,将以下键值对添加为环境变量:
NCCL_LIB_DIR="/usr/local/nvidia/lib64"
确保在工作负载容器启动时执行
nccl-env-profile.sh
脚本。例如,您可以在 Pod 规范中执行此操作,方法是替换容器的命令,使其包含以下内容:source ${NCCL_LIB_DIR}/nccl-env-profile.sh
GPUDirect-TCPX
## required
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/tcpx/lib64\"",
"NCCL_SOCKET_IFNAME=\"eth0\"",
"NCCL_ALGO=Ring",
"NCCL_PROTO=Simple",
"NCCL_CROSS_NIC=0",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_P2P_PXN_LEVEL=0",
"NCCL_GPUDIRECTTCPX_SOCKET_IFNAME=eth1,eth2,eth3,eth4",
"NCCL_GPUDIRECTTCPX_CTRL_DEV=eth0",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_BUFFSIZE=4194304",
"NCCL_NSOCKS_PERTHREAD=4",
"NCCL_SOCKET_NTHREADS=1",
"NCCL_GPUDIRECTTCPX_TX_BINDINGS=\"eth1:8-21,112-125;eth2:8-21,112-125;eth3:60-73,164-177;eth4:60-73,164-177\"",
"NCCL_GPUDIRECTTCPX_RX_BINDINGS=\"eth1:22-35,126-139;eth2:22-35,126-139;eth3:74-87,178-191;eth4:74-87,178-191\"",
"NCCL_GPUDIRECTTCPX_PROGRAM_FLOW_STEERING_WAIT_MICROS=500000"
"NCCL_NVLS_ENABLE=0"
将 GPUDirect 添加到清单
本部分介绍为使 Pod 能够使用 GPUDirect 而必须添加到 Kubernetes 清单的必填字段。
GPUDirect-TCPXO
将以下注解添加到 Pod 元数据中。如果没有这些注解,Pod 需要
hostNetwork:true
,tcpxo-daemon
容器需要privileged:true
。metadata: annotations: devices.gke.io/container.tcpxo-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm - path: /dev/dmabuf_import_helper networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, {"interfaceName":"eth5","network":"vpc5"}, {"interfaceName":"eth6","network":"vpc6"}, {"interfaceName":"eth7","network":"vpc7"}, {"interfaceName":"eth8","network":"vpc8"} ]
将以下字段添加到 Pod 规范中:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys - name: aperture-devices hostPath: path: /dev/aperture_devices
将以下容器添加到清单中,以运行
tcpxo-daemon
服务。将 (TCPXO_DAEMON_IMAGE
) 替换为最新的映像us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.11
:- name: tcpxo-daemon image: TCPXO_DAEMON_IMAGE imagePullPolicy: Always command: ["/bin/sh", "-c"] args: - | set -ex chmod 755 /fts/entrypoint_rxdm_container.sh /fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr securityContext: capabilities: add: - NET_ADMIN - NET_BIND_SERVICE volumeMounts: - name: libraries mountPath: /usr/local/nvidia - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfs env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
将以下环境变量添加到每个 GPU 容器:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64 - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY value: /dev/aperture_devices
将以下 volumeMount 添加到每个 GPU 容器中。如果没有
aperture_devices
设置,GPU 容器需要privileged:true
:volumeMounts: - name: aperture-devices mountPath: /dev/aperture_devices
添加环境变量以配置 NCCL 选项。如需了解详情,请参阅使用推荐的 NCCL 配置设置提高性能。
完成后的 Pod 规范如下所示:
apiVersion: v1
kind: Pod
metadata:
name: a3plus-workloads
annotations:
devices.gke.io/container.tcpxo-daemon: |+
- path: /dev/nvidia0
- path: /dev/nvidia1
- path: /dev/nvidia2
- path: /dev/nvidia3
- path: /dev/nvidia4
- path: /dev/nvidia5
- path: /dev/nvidia6
- path: /dev/nvidia7
- path: /dev/nvidiactl
- path: /dev/nvidia-uvm
- path: /dev/dmabuf_import_helper
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"vpc1"},
{"interfaceName":"eth2","network":"vpc2"},
{"interfaceName":"eth3","network":"vpc3"},
{"interfaceName":"eth4","network":"vpc4"},
{"interfaceName":"eth5","network":"vpc5"},
{"interfaceName":"eth6","network":"vpc6"},
{"interfaceName":"eth7","network":"vpc7"},
{"interfaceName":"eth8","network":"vpc8"}
]
...
containers:
- name: tcpxo-daemon
image: TCPXO_DAEMON_IMAGE
imagePullPolicy: Always
command: ["/bin/sh", "-c"]
args:
- |
set -ex
chmod 755 /fts/entrypoint_rxdm_container.sh
/fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_BIND_SERVICE
volumeMounts:
- name: libraries
mountPath: /usr/local/nvidia
- name: sys
mountPath: /hostsysfs
- name: proc-sys
mountPath: /hostprocsysfs
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: main-application-container
...
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY
value: /dev/aperture_devices
securityContext:
volumeMounts:
- name: aperture-devices
mountPath: /dev/aperture_devices
resources:
limits:
nvidia.com/gpu: 8
volumes:
- name: libraries
hostPath:
path: /home/kubernetes/bin/nvidia
- name: sys
hostPath:
path: /sys
- name: proc-sys
hostPath:
path: /proc/sys
- name: aperture-devices
hostPath:
path: /dev/aperture_devices
GPUDirect-TCPX
将以下注解添加到 Pod 元数据中。如果没有这些注解,Pod 需要
hostNetwork:true
,tcpx-daemon
容器需要privileged:true
。metadata: annotations: devices.gke.io/container.tcpx-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, ]
将以下字段添加到 Pod 规范中:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys
将以下容器添加到清单中以运行 tcpx-daemon 服务:
- name: tcpx-daemon image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9 command: - /tcpgpudmarxd/build/app/tcpgpudmarxd - --gpu_nic_preset - a3vm - --gpu_shmem_type - fd - --uds_path - /run/tcpx - --setup_param - \"--verbose 128 2 0 \" securityContext: capabilities: add: - NET_ADMIN volumeMounts: - name: libraries mountPath: /usr/local/nvidia/lib64 - name: tcpx-socket mountPath: /run/tcpx - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfs env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
将以下卷装载添加到请求 GPU 的所有容器:
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64
将以下环境变量添加到每个 GPU 容器:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
添加环境变量以配置 NCCL 选项。如需了解详情,请参阅本页面中的使用推荐的 NCCL 配置设置提高性能部分。
完成后的 Pod 规范如下所示:
apiVersion: v1
kind: Pod
metadata:
name: a3-gpu-workloads-example
labels:
name: a3-gpu-workloads-example
annotations:
devices.gke.io/container.tcpx-daemon: |+
- path: /dev/nvidia0
- path: /dev/nvidia1
- path: /dev/nvidia2
- path: /dev/nvidia3
- path: /dev/nvidia4
- path: /dev/nvidia5
- path: /dev/nvidia6
- path: /dev/nvidia7
- path: /dev/nvidiactl
- path: /dev/nvidia-uvm
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"vpc1"},
{"interfaceName":"eth2","network":"vpc2"},
{"interfaceName":"eth3","network":"vpc3"},
{"interfaceName":"eth4","network":"vpc4"}
]
spec:
containers:
- name: tcpx-daemon
image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.11
imagePullPolicy: Always
command:
- /tcpgpudmarxd/build/app/tcpgpudmarxd
- --gpu_nic_preset
- a3vm
- --gpu_shmem_type
- fd
- --uds_path
- /run/tcpx
- --setup_param
- \"--verbose 128 2 0 \"
securityContext:
capabilities:
add:
- NET_ADMIN
volumeMounts:
- name: libraries
mountPath: /usr/local/nvidia/lib64
readOnly: true
- name: tcpx-socket
mountPath: /run/tcpx
- name: sys
mountPath: /hostsysfs
- name: proc-sys
mountPath: /hostprocsysfs
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: a3-gpu-workloads-example
...
volumeMounts:
- name: tcpx-socket
mountPath: /tmp
- name: libraries
mountPath: /usr/local/nvidia/lib64
readOnly: true
resources:
limits:
nvidia.com/gpu: 8
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
...
volumes:
- name: libraries
hostPath:
path: /home/kubernetes/bin/nvidia/lib64
- name: tcpx-socket
emptyDir:
- name: sys
hostPath:
path: /sys
- name: proc-sys
hostPath:
path: /proc/sys
后续步骤
- 了解 GKE 网络最佳实践。
- 详细了解用于在 Nvidia GPU 上移动和访问数据的 Nvidia GPUDirect 系列技术。
- 了解 GKE 中的当前 GPU 版本可用性和如何请求 GPU。