本文档介绍了 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-8g、a3-highgpu-8g 和 a3-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 进行身份验证:
-
安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI:
gcloud init如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
- 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 测试网络性能,请完成以下步骤:
- 设置一个或多个配置了大型 MTU 的虚拟私有云 (VPC) 网络。
- 创建 GPU 实例。
设置 VPC 网络
如需为 GPU 虚拟机实现高效通信,您需要创建一个管理网络和一个或多个数据网络。管理网络用于外部访问(例如 SSH)和最通用的网络通信。数据网络用于不同虚拟机上的 GPU 之间的高性能通信,例如用于远程直接内存访问 (RDMA) 流量。
对于这些 VPC 网络,我们建议将最大传输单元 (MTU) 设置为更大的值。较高的 MTU 值会增加数据包大小并降低数据包标头开销,从而增加载荷数据吞吐量。 如需详细了解如何创建 VPC 网络,请参阅创建和验证巨型帧 MTU 网络。
创建管理网络、子网和防火墙规则
完成以下步骤以设置管理网络:
使用
networks create命令创建管理网络:gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \ --project=PROJECT_ID \ --subnet-mode=custom \ --mtu=8244使用
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使用
firewall-rules create命令创建防火墙规则。为管理网络创建防火墙规则。
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创建
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创建可用于检查网络中数据传输问题的
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 停止或删除之前运行的最长时间。您必须将该值的格式设置为天数、小时数、分钟数或秒数,后面分别跟d、h、m和s。例如,值30m定义的时间为 30 分钟,值1h2m3s定义的时间为 1 小时 2 分钟 3 秒。您可以指定介于 10 分钟到 7 天之间的值。VALID_FOR_DURATION:等待预配所请求资源的最长时间。您必须将该值的格式设置为天数、小时数、分钟数或秒数,后面分别跟d、h、m和s。根据工作负载的可用区要求,指定以下时长之一,以提高虚拟机创建请求成功的几率:- 如果您的工作负载要求您在特定可用区中创建虚拟机,请指定介于 90 秒 (
90s) 到 2 小时 (2h) 之间的时长。时长越长,您获得资源的几率就越大。 - 如果虚拟机可以在区域内的任何可用区中运行,则指定时长为零秒 (
0s)。此值指定 Compute Engine 仅在资源立即可用时才分配资源。如果创建请求因资源不可用而失败,请在其他可用区中重试该请求。
- 如果您的工作负载要求您在特定可用区中创建虚拟机,请指定介于 90 秒 (
受预留约束
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 驱动程序。
安装 NVIDIA GPU 驱动程序。
sudo cos-extensions install gpu -- --version=latest
重新装载路径。
sudo mount --bind /var/lib/nvidia /var/lib/nvidia sudo mount -o remount,exec /var/lib/nvidia
授予NIC对 GPU 的访问权限
在每个 A3 Mega 虚拟机上,授予 NIC 对 GPU 的访问权限。
- 调整防火墙设置,以接受所有传入的 TCP 连接并启用集群中节点之间的通信:
sudo /sbin/iptables -I INPUT -p tcp -m tcp -j ACCEPT
- 配置
dmabuf模块。加载dmabuf框架的一部分import-helper模块。此框架可在 GPU 和网络接口卡 (NIC) 之间实现高速零复制内存共享,这是 GPUDirect 技术的一项关键组件:sudo modprobe import-helper
- 配置 Docker 以对向 Artifact Registry 发出的请求进行身份验证。
docker-credential-gcr configure-docker --registries us-docker.pkg.dev
- 在容器中启动
RxDM。RxDM是一项与 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 虚拟机上,完成以下步骤:
- 安装
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 - 启动专用容器
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 基准测试,请完成以下步骤:
- 在
nccl-tests容器内打开交互式 bash shell。docker exec -it nccl bash
- 通过设置 SSH 和生成主机文件,为多节点运行配置环境。将
VM_NAME_1和VM_NAME_2替换为每个虚拟机的名称。/scripts/init_ssh.sh VM_NAME_1 VM_NAME_2 /scripts/gen_hostfiles.sh VM_NAME_1 VM_NAME_2
这会创建一个名为
/scripts/hostfiles2的目录。 - 运行
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
在 nccl-tests 容器的 bash shell 中,完成以下步骤。
创建 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-8g或a3-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-8g或a3-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-8g或a3-edgegpu-8g。BOOT_DISK_SIZE:启动磁盘的大小(以 GB 为单位),例如50。NETWORK_NAME_PREFIX:用于 VPC 网络和子网的名称前缀。TERMINATION_ACTION:在虚拟机运行时长结束时,是停止还是删除虚拟机。请指定以下值之一:- 停止虚拟机:
STOP - 删除虚拟机:
DELETE
- 停止虚拟机:
RUN_DURATION:虚拟机在被 Compute Engine 停止或删除之前运行的最长时间。您必须将该值的格式设置为天数、小时数、分钟数或秒数,后面分别跟d、h、m和s。例如,值30m定义的时间为 30 分钟,值1h2m3s定义的时间为 1 小时 2 分钟 3 秒。您可以指定介于 10 分钟到 7 天之间的值。VALID_FOR_DURATION:等待预配所请求资源的最长时间。您必须将该值的格式设置为天数、小时数、分钟数或秒数,后面分别跟d、h、m和s。根据工作负载的可用区要求,指定以下时长之一,以提高虚拟机创建请求成功的几率:- 如果您的工作负载要求您在特定可用区中创建虚拟机,请指定介于 90 秒 (
90s) 到 2 小时 (2h) 之间的时长。时长越长,您获得资源的几率就越大。 - 如果虚拟机可以在区域内的任何可用区中运行,则指定时长为零秒 (
0s)。此值指定 Compute Engine 仅在资源立即可用时才分配资源。如果创建请求因资源不可用而失败,请在其他可用区中重试该请求。
- 如果您的工作负载要求您在特定可用区中创建虚拟机,请指定介于 90 秒 (
受预留约束
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-8g或a3-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 虚拟机上,完成以下步骤。
- 通过运行以下命令来安装 NVIDIA GPU 驱动程序:
sudo cos-extensions install gpu -- --version=latest
- 运行以下命令重新装载路径:
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 的访问权限:
- 配置注册表。
- 如果您使用的是 Container Registry,请运行以下命令:
docker-credential-gcr configure-docker
- 如果您使用的是 Artifact Registry,请运行以下命令:
docker-credential-gcr configure-docker --registries us-docker.pkg.dev
- 如果您使用的是 Container Registry,请运行以下命令:
- 配置接收数据路径管理器。管理服务 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" - 验证
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...
- 如需停止查看日志,请按
ctrl-c。 - 安装 IP 表规则。
sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
- 配置 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.so和libnccl.so文件会放置在/var/lib/tcpx/lib64目录中。
运行测试
在每个 A3 High 或 A3 Edge 虚拟机上,通过完成以下步骤来运行 NCCL 测试:
- 启动容器。
#!/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
- 将 NVIDIA 设备从
- 启动容器后,使用 NCCL 的应用可在容器内运行。例如,如需运行
run-allgather测试,请完成以下步骤:- 在每个 A3 High 或 A3 Edge 虚拟机上,运行以下命令:
$ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
- 在一个虚拟机上,运行以下命令:
- 设置虚拟机之间的连接。将
VM-0和VM-1替换为每个虚拟机的名称。/scripts/init_ssh.sh VM-0 VM-1 pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd
这会在每个虚拟机上创建一个
/scripts/hostfiles2目录。 - 运行脚本。
/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.
- 在每个 A3 High 或 A3 Edge 虚拟机上,运行以下命令:
多实例 GPU
多实例 GPU 可将同一虚拟机中的单个 NVIDIA A100 GPU 划分为最多七个独立的 GPU 实例。这些实例同时运行,每个实例都有自己的内存、缓存和流式多处理器。与以前的 GPU 型号相比,此设置可让 NVIDIA H100 GPU 以最多 7 倍的利用率提供一致的服务质量 (QoS)。
您最多可以创建七个多实例 GPU。对于 H100 80GB GPU,每个多实例 GPU 都分配了 10 GB 内存。
如需详细了解如何使用多实例 GPU,请参阅 NVIDIA 多实例 GPU 用户指南。
要创建多实例 GPU,请完成以下步骤:
创建 A3 Mega、A3 High 或 A3 Edge 实例。
安装 GPU 驱动程序。
启用 MIG 模式。如需查看相关说明,请参阅启用 MIG。
配置 GPU 分区。如需查看相关说明,请参阅使用 GPU 分区。