创建启用了 GPUDirect 的 A3 Mega、A3 High 或 A3 Edge 实例

本文档介绍了 A3 Mega、A3 High 或 A3 Edge 虚拟机 (VM) 实例的设置,这些实例挂接了八个 NVIDIA H100 GPU,并使用以下任一 GPUDirect 技术:GPUDirect-TCPX 或 GPUDirect-TCPXO。如需创建少于 8 个 GPU 的 A3 High 实例,请参阅创建 A3 High 或 A2 实例

您使用的 GPUDirect 技术取决于您选择的 A3 机器类型。

  • GPUDirect-TCPXO:是一种类似 RDMA 的分流网络栈,在配备 8 个 H100 GPU 的 A3 Mega (a3-megagpu-8g) 机器类型上受支持。
  • GPUDirect-TCPX:是经过优化的客机 TCP 版本,可提供更低的延迟,并且在配备八个 H100 GPU 的 A3 High (a3-highgpu-8g) 和 A3 Edge (a3-edgegpu-8g) 机器类型支持。

A3 加速器优化机器系列具有 208 个 vCPU 和高达 1872 GB 的内存。a3-megagpu-8ga3-highgpu-8ga3-edgegpu-8g 机器类型可为每个 GPU 提供 80 GB 的 GPU 内存。这些机器类型的网络带宽可高达 1,800 Gbps,使它们非常适合基于 Transformer 的大语言模型、数据库和高性能计算 (HPC)。

GPUDirect-TCPX 和 GPUDirect-TCPXO 均使用 NVIDIA GPUDirect 技术来提高 A3 虚拟机的性能并缩短延迟时间。它们可让数据包载荷直接从 GPU 内存传输到网络接口,绕过 CPU 和系统内存,从而实现这一目的。这是一种远程直接内存访问 (RDMA)。与上一代 A2 或 G2 加速器优化机器类型相比,A3 虚拟机可以与 Google 虚拟 NIC (gVNIC) 结合使用,在集群中的虚拟机之间提供最高吞吐量。

本文档介绍了如何创建 A3 Mega、A3 High 或 A3 Edge 虚拟机,以及如何启用 GPUDirect-TCPX 或 GPUDirect-TCPXO 来测试经过改进的 GPU 网络性能。

准备工作

  • 如需查看创建挂接 GPU 的实例的限制和其他前提步骤(例如选择操作系统映像和检查 GPU 配额),请参阅创建挂接 GPU 的实例概览
  • 如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:
    1. 安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI:

      gcloud init

      如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

    2. Set a default region and zone.

所需的角色

如需获得创建虚拟机所需的权限,请让您的管理员为您授予项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色可提供创建虚拟机所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

创建虚拟机需要以下权限:

  • 针对项目的 compute.instances.create 权限
  • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
  • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
  • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
  • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
  • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
  • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
  • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
  • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
  • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
  • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
  • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
  • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
  • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
  • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
  • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

概览

如需使用 GPUDirect 测试网络性能,请完成以下步骤:

  1. 设置一个或多个配置了大型 MTU 的虚拟私有云 (VPC) 网络。
  2. 创建 GPU 实例。

设置 VPC 网络

如需为 GPU 虚拟机实现高效通信,您需要创建一个管理网络和一个或多个数据网络。管理网络用于外部访问(例如 SSH)和最通用的网络通信。数据网络用于不同虚拟机上的 GPU 之间的高性能通信,例如用于远程直接内存访问 (RDMA) 流量。

对于这些 VPC 网络,我们建议将最大传输单元 (MTU) 设置为更大的值。较高的 MTU 值会增加数据包大小并降低数据包标头开销,从而增加载荷数据吞吐量。 如需详细了解如何创建 VPC 网络,请参阅创建和验证巨型帧 MTU 网络

创建管理网络、子网和防火墙规则

完成以下步骤以设置管理网络:

  1. 使用 networks create 命令创建管理网络:

    gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \
        --project=PROJECT_ID \
        --subnet-mode=custom \
        --mtu=8244
    
  2. 使用 networks subnets create 命令创建管理子网:

    gcloud compute networks subnets create NETWORK_NAME_PREFIX-mgmt-sub \
        --project=PROJECT_ID \
        --network=NETWORK_NAME_PREFIX-mgmt-net \
        --region=REGION \
        --range=192.168.0.0/24
    
  3. 使用 firewall-rules create 命令创建防火墙规则。

    1. 为管理网络创建防火墙规则。

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-internal \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=tcp:0-65535,udp:0-65535,icmp \
          --source-ranges=192.168.0.0/16
      
    2. 创建 tcp:22 防火墙规则,以限制哪些源 IP 地址可以通过 SSH 连接到您的虚拟机。

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ssh \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=tcp:22 \
          --source-ranges=SSH_SOURCE_IP_RANGE
      
    3. 创建可用于检查网络中数据传输问题的 icmp 防火墙规则。

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ping \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=icmp \
          --source-ranges=0.0.0.0/0
      

替换以下内容:

  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。
  • PROJECT_ID:您的项目 ID。
  • REGION:要在其中创建网络的区域。
  • SSH_SOURCE_IP_RANGE:采用 CIDR 格式的 IP 范围。 用于指定哪些来源 IP 地址可以使用 SSH 连接到虚拟机。

创建数据网络、子网和防火墙规则

数据网络的数量因您要创建的 GPU 机器类型而异。

A3 Mega

A3 Mega 需要 8 个数据网络。使用以下命令创建 8 个数据网络,每个网络都包含子网和防火墙规则。

for N in $(seq 1 8); do
gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \
    --project=PROJECT_ID \
    --subnet-mode=custom \
    --mtu=8244

gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --region=REGION \
    --range=192.168.$N.0/24

gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --action=ALLOW \
    --rules=tcp:0-65535,udp:0-65535,icmp \
    --source-ranges=192.168.0.0/16
done

A3 High 和 A3 Edge

A3 High 和 A3 Edge 需要四个数据网络。使用以下命令创建 4 个数据网络,每个网络都包含子网和防火墙规则。

for N in $(seq 1 4); do
gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \
    --project=PROJECT_ID \
    --subnet-mode=custom \
    --mtu=8244

gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --region=REGION \
    --range=192.168.$N.0/24

gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --action=ALLOW \
    --rules=tcp:0-65535,udp:0-65535,icmp \
    --source-ranges=192.168.0.0/16
done

创建 A3 Mega 实例 (GPUDirect-TCPXO)

使用 cos-121-lts 或更高版本的 Container-Optimized OS 映像创建 A3 Mega 实例。

COS

如需使用 GPUDirect-TCPXO 测试网络性能,请至少创建两个 A3 Mega 虚拟机实例。 使用 cos-121-lts 或更高版本的 Container-Optimized OS 映像并指定您在上一步中创建的 VPC 网络,创建每个虚拟机。

A3 Mega 虚拟机需要 9 个 Google 虚拟 NIC (gVNIC) 网络接口,其中 1 个用于管理网络,8 个用于数据网络。

根据您要用于创建虚拟机的预配模型,选择以下选项之一:

标准

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address

替换以下内容:

  • VM_NAME:虚拟机实例的名称。
  • PROJECT_ID:您的项目的 ID。
  • ZONE支持您的机器类型的可用区。
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如 50
  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。

Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

替换以下内容:

  • VM_NAME:虚拟机实例的名称。
  • PROJECT_ID:您的项目的 ID。
  • ZONE支持您的机器类型的可用区。
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如 50
  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。
  • TERMINATION_ACTION:在抢占时是停止还是删除虚拟机。 请指定以下值之一:
    • 停止虚拟机:STOP
    • 删除虚拟机:DELETE

灵活启动

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

替换以下内容:

  • VM_NAME:虚拟机实例的名称。
  • PROJECT_ID:您的项目的 ID。
  • ZONE支持您的机器类型的可用区。
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如 50
  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。
  • TERMINATION_ACTION:在虚拟机运行时长结束时,是停止还是删除虚拟机。请指定以下值之一:
    • 停止虚拟机:STOP
    • 删除虚拟机:DELETE
  • RUN_DURATION:虚拟机在被 Compute Engine 停止或删除之前运行的最长时间。您必须将该值的格式设置为天数、小时数、分钟数或秒数,后面分别跟 dhms。例如,值 30m 定义的时间为 30 分钟,值 1h2m3s 定义的时间为 1 小时 2 分钟 3 秒。您可以指定介于 10 分钟到 7 天之间的值。
  • VALID_FOR_DURATION:等待预配所请求资源的最长时间。您必须将该值的格式设置为天数、小时数、分钟数或秒数,后面分别跟 dhms。根据工作负载的可用区要求,指定以下时长之一,以提高虚拟机创建请求成功的几率:
    • 如果您的工作负载要求您在特定可用区中创建虚拟机,请指定介于 90 秒 (90s) 到 2 小时 (2h) 之间的时长。时长越长,您获得资源的几率就越大。
    • 如果虚拟机可以在区域内的任何可用区中运行,则指定时长为零秒 (0s)。此值指定 Compute Engine 仅在资源立即可用时才分配资源。如果创建请求因资源不可用而失败,请在其他可用区中重试该请求。

受预留约束

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

替换以下内容:

  • VM_NAME:虚拟机实例的名称。
  • PROJECT_ID:您的项目的 ID。
  • ZONE支持您的机器类型的可用区。
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如 50
  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。
  • TERMINATION_ACTION:指示在预留期结束时,是停止还是删除虚拟机。请指定以下值之一:
    • 停止虚拟机:STOP
    • 删除虚拟机:DELETE
  • RESERVATION_URL:要使用的预留的网址。 请指定以下值之一:
    • 如果您在同一项目中创建了预留:example-reservation
    • 如果预留属于其他项目,并且您的项目可以使用该预留projects/PROJECT_ID/reservations/example-reservation

安装 GPU 驱动程序

在每个 A3 Mega 虚拟机上,安装 GPU 驱动程序。

  1. 安装 NVIDIA GPU 驱动程序。

    sudo cos-extensions install gpu -- --version=latest
    
  2. 重新装载路径。

    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    

授予NIC对 GPU 的访问权限

在每个 A3 Mega 虚拟机上,授予 NIC 对 GPU 的访问权限。

  1. 调整防火墙设置,以接受所有传入的 TCP 连接并启用集群中节点之间的通信:
    sudo /sbin/iptables -I INPUT -p tcp -m tcp -j ACCEPT
  2. 配置 dmabuf 模块。加载 dmabuf 框架的一部分 import-helper 模块。此框架可在 GPU 和网络接口卡 (NIC) 之间实现高速零复制内存共享,这是 GPUDirect 技术的一项关键组件:
    sudo modprobe import-helper
  3. 配置 Docker 以对向 Artifact Registry 发出的请求进行身份验证。
    docker-credential-gcr configure-docker --registries us-docker.pkg.dev
  4. 在容器中启动 RxDMRxDM 是一项与 GPU 应用并行运行的管理服务,用于管理 GPU 内存。此服务会为传入的网络流量预先分配和管理 GPU 内存,这是 GPUDirect 技术的一个关键要素,对于实现高性能网络至关重要。启动名为 rxdm 的 Docker 容器:
    docker run --pull=always --rm --detach --name rxdm \
        --network=host  --cap-add=NET_ADMIN  \
        --privileged \
        --volume /var/lib/nvidia:/usr/local/nvidia \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.19 \
        --num_hops=2 --num_nics=8

    如需验证 RxDM 是否已成功启动,请运行该命令。等待“Buffer manager initialization complete”消息,以确认 RxDM 初始化成功。

    docker container logs --follow  rxdm

    或者,检查 RxDM 初始化完成日志。

    docker container logs rxdm 2>&1 | grep "Buffer manager initialization complete"

设置 NCCL 环境

在每个 A3 Mega 虚拟机上,完成以下步骤:

  1. 安装 nccl-net 库,这是 NCCL 的一个插件,可通过网络实现 GPUDirect 通信。以下命令会拉取安装程序映像,并将必要的库文件安装到 /var/lib/tcpxo/lib64/ 中。
    NCCL_NET_IMAGE="us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.13-1"
    
    docker run --pull=always --rm --privileged \
        --network=host --cap-add=NET_ADMIN \
        --volume /var/lib/nvidia:/usr/local/nvidia  \
        --volume /var/lib:/var/lib \
        --device /dev/nvidia0:/dev/nvidia0   \
        --device /dev/nvidia1:/dev/nvidia1  \
        --device /dev/nvidia2:/dev/nvidia2  \
        --device /dev/nvidia3:/dev/nvidia3  \
        --device /dev/nvidia4:/dev/nvidia4  \
        --device /dev/nvidia5:/dev/nvidia5  \
        --device /dev/nvidia6:/dev/nvidia6  \
        --device /dev/nvidia7:/dev/nvidia7  \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm  \
        --device /dev/nvidiactl:/dev/nvidiactl  \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper  \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} install  --install-nccl
    
    sudo mount --bind /var/lib/tcpxo /var/lib/tcpxo && sudo mount -o remount,exec /var/lib/tcpxo
    
  2. 启动专用容器 nccl-tests 以进行 NCCL 测试。 此容器预先配置了必要的工具和实用脚本,可确保环境干净且一致,以便验证 GPUDirect 设置性能。

    此命令会重复使用您在上一步中设置的 NCCL_NET_IMAGE 变量。

    docker run --pull=always --rm --detach --name nccl \
        --network=host --cap-add=NET_ADMIN \
        --privileged \
        --volume /var/lib/nvidia:/usr/local/nvidia  \
        --volume /var/lib/tcpxo:/var/lib/tcpxo \
        --shm-size=8g \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} daemon

运行 nccl-tests 基准测试

如需在单个 A3 Mega 虚拟机上运行 nccl-tests 基准测试,请完成以下步骤:

  1. nccl-tests 容器内打开交互式 bash shell。
    docker exec -it nccl bash
  2. nccl-tests 容器的 bash shell 中,完成以下步骤。

    1. 通过设置 SSH 和生成主机文件,为多节点运行配置环境。将 VM_NAME_1VM_NAME_2 替换为每个虚拟机的名称。
      /scripts/init_ssh.sh VM_NAME_1 VM_NAME_2
      /scripts/gen_hostfiles.sh VM_NAME_1 VM_NAME_2
        

      这会创建一个名为 /scripts/hostfiles2 的目录。

    2. 运行 all_gather_perf 基准测试以衡量总体通信性能:
      /scripts/run-nccl-tcpxo.sh all_gather_perf "${LD_LIBRARY_PATH}" 8 eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8 1M 512M 3 2 10 8 2 10

创建 A3 High 和 A3 Edge 实例 (GPUDirect-TCPX)

使用 cos-121-lts 或更高版本的 Container-Optimized OS 映像创建 A3 High 和 A3 Edge 实例。

COS

如需使用 GPUDirect-TCPX 测试网络性能,您至少需要创建两个 A3 High 或 A3 Edge 虚拟机。使用 cos-121-lts 或更高版本的 Container-Optimized OS 映像并指定您在上一步中创建的 VPC 网络,创建每个虚拟机。

虚拟机还必须使用 Google 虚拟 NIC (gVNIC) 网络接口。 对于 A3 High 或 A3 Edge 虚拟机,您必须使用 gVNIC 驱动程序 1.4.0rc3 版或更高版本。Container-Optimized OS 已提供此驱动程序版本。 第一个虚拟 NIC 用作常规网络和存储的主要 NIC,其他四个虚拟 NIC 是与同一 PCIe 交换机上的八个 GPU 中的两个对齐的 NUMA。

根据您要用于创建虚拟机的预配模型,选择以下选项之一:

标准

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address

替换以下内容:

  • VM_NAME:您的虚拟机的名称。
  • PROJECT_ID:您的项目的 ID。
  • ZONE支持您的机器类型的可用区。
  • MACHINE_TYPE:虚拟机的机器类型。 请指定 a3-highgpu-8ga3-edgegpu-8g
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如 50
  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。

Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

替换以下内容:

  • VM_NAME:您的虚拟机的名称。
  • PROJECT_ID:您的项目的 ID。
  • ZONE支持您的机器类型的可用区。
  • MACHINE_TYPE:虚拟机的机器类型。 请指定 a3-highgpu-8ga3-edgegpu-8g
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如 50
  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。
  • TERMINATION_ACTION:在抢占时是停止还是删除虚拟机。 请指定以下值之一:
    • 停止虚拟机:STOP
    • 删除虚拟机:DELETE

灵活启动

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

替换以下内容:

  • VM_NAME:您的虚拟机的名称。
  • PROJECT_ID:您的项目的 ID。
  • ZONE支持您的机器类型的可用区。
  • MACHINE_TYPE:虚拟机的机器类型。 请指定 a3-highgpu-8ga3-edgegpu-8g
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如 50
  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。
  • TERMINATION_ACTION:在虚拟机运行时长结束时,是停止还是删除虚拟机。请指定以下值之一:
    • 停止虚拟机:STOP
    • 删除虚拟机:DELETE
  • RUN_DURATION:虚拟机在被 Compute Engine 停止或删除之前运行的最长时间。您必须将该值的格式设置为天数、小时数、分钟数或秒数,后面分别跟 dhms。例如,值 30m 定义的时间为 30 分钟,值 1h2m3s 定义的时间为 1 小时 2 分钟 3 秒。您可以指定介于 10 分钟到 7 天之间的值。
  • VALID_FOR_DURATION:等待预配所请求资源的最长时间。您必须将该值的格式设置为天数、小时数、分钟数或秒数,后面分别跟 dhms。根据工作负载的可用区要求,指定以下时长之一,以提高虚拟机创建请求成功的几率:
    • 如果您的工作负载要求您在特定可用区中创建虚拟机,请指定介于 90 秒 (90s) 到 2 小时 (2h) 之间的时长。时长越长,您获得资源的几率就越大。
    • 如果虚拟机可以在区域内的任何可用区中运行,则指定时长为零秒 (0s)。此值指定 Compute Engine 仅在资源立即可用时才分配资源。如果创建请求因资源不可用而失败,请在其他可用区中重试该请求。

受预留约束

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

替换以下内容:

  • VM_NAME:您的虚拟机的名称。
  • PROJECT_ID:您的项目的 ID。
  • ZONE支持您的机器类型的可用区。
  • MACHINE_TYPE:虚拟机的机器类型。 请指定 a3-highgpu-8ga3-edgegpu-8g
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如 50
  • NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。
  • TERMINATION_ACTION:指示在预留期结束时,是停止还是删除虚拟机。请指定以下值之一:
    • 停止虚拟机:STOP
    • 删除虚拟机:DELETE
  • RESERVATION_URL:要使用的预留的网址。 请指定以下值之一:
    • 如果您在同一项目中创建了预留:example-reservation
    • 如果预留属于其他项目,并且您的项目可以使用该预留projects/PROJECT_ID/reservations/example-reservation

安装 GPU 驱动程序

在每个 A3 High 或 A3 Edge 虚拟机上,完成以下步骤。

  1. 通过运行以下命令来安装 NVIDIA GPU 驱动程序:
    sudo cos-extensions install gpu -- --version=latest
  2. 运行以下命令重新装载路径:
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia

授予NIC对 GPU 的访问权限

在每个 A3 High 或 A3 Edge 虚拟机上,通过完成以下步骤来授予 NIC 对 GPU 的访问权限:

  1. 配置注册表。
    • 如果您使用的是 Container Registry,请运行以下命令:
      docker-credential-gcr configure-docker
    • 如果您使用的是 Artifact Registry,请运行以下命令:
      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
  2. 配置接收数据路径管理器。管理服务 GPUDirect-TCPX Receive Data Path Manager 需要与使用 GPUDirect-TCPX 的应用一起运行。如需在每个 Container-Optimized OS 虚拟机上启动该服务,请运行以下命令:
    docker run --pull=always --rm \
        --name receive-datapath-manager \
        --detach \
        --privileged \
        --cap-add=NET_ADMIN --network=host \
        --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
        --volume /run/tcpx:/run/tcpx \
        --entrypoint /tcpgpudmarxd/build/app/tcpgpudmarxd \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd \
        --gpu_nic_preset a3vm --gpu_shmem_type fd --uds_path "/run/tcpx" --setup_param "--verbose 128 2 0"
       
  3. 验证 receive-datapath-manager 容器是否已启动。
    docker container logs --follow receive-datapath-manager

    输出应类似于以下内容:

    I0000 00:00:1687813309.406064       1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
  4. 如需停止查看日志,请按 ctrl-c
  5. 安装 IP 表规则。
    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
  6. 配置 NVIDIA Collective Communications Library (NCCL) 和 GPUDirect-TCPX 插件。

    使用支持 GPUDirect-TCPX 的 NCCL 需要特定的 NCCL 库版本和 GPUDirect-TCPX 插件二进制文件组合。 Google Cloud 提供了满足此要求的软件包。

    如需安装 Google Cloud 软件包,请运行以下命令:

    docker run --rm -v /var/lib:/var/lib us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx install --install-nccl
    sudo mount --bind /var/lib/tcpx /var/lib/tcpx
    sudo mount -o remount,exec /var/lib/tcpx

    如果此命令成功,libnccl-net.solibnccl.so 文件会放置在 /var/lib/tcpx/lib64 目录中。

运行测试

在每个 A3 High 或 A3 Edge 虚拟机上,通过完成以下步骤来运行 NCCL 测试:

  1. 启动容器。
    #!/bin/bash
    
    function run_tcpx_container() {
    docker run \
       -u 0 --network=host \
       --cap-add=IPC_LOCK \
       --userns=host \
       --volume /run/tcpx:/tmp \
       --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
       --volume /var/lib/tcpx/lib64:/usr/local/tcpx/lib64 \
       --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
       --device /dev/nvidia0:/dev/nvidia0 \
       --device /dev/nvidia1:/dev/nvidia1 \
       --device /dev/nvidia2:/dev/nvidia2 \
       --device /dev/nvidia3:/dev/nvidia3 \
       --device /dev/nvidia4:/dev/nvidia4 \
       --device /dev/nvidia5:/dev/nvidia5 \
       --device /dev/nvidia6:/dev/nvidia6 \
       --device /dev/nvidia7:/dev/nvidia7 \
       --device /dev/nvidia-uvm:/dev/nvidia-uvm \
       --device /dev/nvidiactl:/dev/nvidiactl \
       --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/usr/local/tcpx/lib64 \
       "$@"
    }
    

    上述命令会完成以下操作:

    • 将 NVIDIA 设备从 /dev 装载到容器中
    • 将容器的网络命名空间设置为主机
    • 将容器的用户命名空间设置为主机
    • 向容器的功能添加 CAP_IPC_LOCK
    • 将主机的 /tmp 装载到容器的 /tmp
    • 将 NCCL 和 GPUDirect-TCPX NCCL 插件的安装路径装载到容器中,并将装载的路径添加到 LD_LIBRARY_PATH
  2. 启动容器后,使用 NCCL 的应用可在容器内运行。例如,如需运行 run-allgather 测试,请完成以下步骤:
    1. 在每个 A3 High 或 A3 Edge 虚拟机上,运行以下命令:
      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
    2. 在一个虚拟机上,运行以下命令:
      1. 设置虚拟机之间的连接。将 VM-0VM-1 替换为每个虚拟机的名称。
        /scripts/init_ssh.sh VM-0 VM-1
        pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd

        这会在每个虚拟机上创建一个 /scripts/hostfiles2 目录。

      2. 运行脚本。
        /scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2

    run-allgather 脚本大约需要两分钟才能完成运行。在日志末尾,您会看到 all-gather 结果。

    如果您在 NCCL 日志中看到以下行,则说明 GPUDirect-TCPX 已成功初始化。

    NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.
    

多实例 GPU

多实例 GPU 可将同一虚拟机中的单个 NVIDIA A100 GPU 划分为最多七个独立的 GPU 实例。这些实例同时运行,每个实例都有自己的内存、缓存和流式多处理器。与以前的 GPU 型号相比,此设置可让 NVIDIA H100 GPU 以最多 7 倍的利用率提供一致的服务质量 (QoS)。

您最多可以创建七个多实例 GPU。对于 H100 80GB GPU,每个多实例 GPU 都分配了 10 GB 内存。

如需详细了解如何使用多实例 GPU,请参阅 NVIDIA 多实例 GPU 用户指南

要创建多实例 GPU,请完成以下步骤:

  1. 创建 A3 Mega、A3 High 或 A3 Edge 实例。

  2. 安装 GPU 驱动程序。

  3. 启用 MIG 模式。如需查看相关说明,请参阅启用 MIG

  4. 配置 GPU 分区。如需查看相关说明,请参阅使用 GPU 分区