Google Cloud 設計的加速器最佳化機器系列,可為 GPU 加速工作負載提供所需的效能和效率,例如人工智慧 (AI)、機器學習 (ML) 和高效能運算 (HPC)。
A3 加速器最佳化機器系列具備 208 個 vCPU,最多可提供 1872 GB 記憶體。每個 A3 機器類型都連接八個 NVIDIA H100 GPU,每個 GPU 提供 80 GB 的 GPU 記憶體。這些 VM 可獲得高達 1,000 Gbps 的網路頻寬,因此非常適合用於大型的轉換器式語言模型、資料庫和高效能運算 (HPC)。
使用 a3-highgpu-8g
或 a3-edgegpu-8g
VM 時,您可以使用 GPUDirect-TCPX,在應用程式和網路之間達到盡可能低的延遲時間。GPUDirect-TCPX 是自訂的遠端直接記憶體存取 (RDMA) 網路堆疊,可讓資料封包酬載直接從 GPU 記憶體轉移至網路介面,無須經過 CPU 和系統記憶體,進而提升 A3 VM 的網路效能。與 A2 或 G2 加速器最佳化機型相比,A3 VM 可搭配使用 GPUDirect-TCPX 和 Google 虛擬 NIC (gVNIC),在叢集中的 VM 之間提供最高的總處理量。
本文說明如何建立在 Container-Optimized OS 作業系統上執行的 a3-highgpu-8g
或 a3-edgegpu-8g
VM。並說明如何在 VM 上啟用 GPUDirect-TCPX,以及如何設定及測試 GPU 網路效能。
總覽
如要使用 GPUDirect-TCPX 測試網路效能,請完成下列步驟:
- 設定一或多個虛擬私有雲 (VPC) 網路,並將 MTU 設定 (也稱為巨型封包) 設為
8244
。 - 使用
cos-105-lts
以上版本的 Container-Optimized OS 映像檔,建立 GPU VM。 - 在每個 VM 上安裝 GPU 驅動程式。
- 在每個 VM 上,將 GPU 的存取權授予網路介面卡 (NIC)。
- 執行 NCCL 測試。
設定巨型資料流程 MTU 網路
a3-highgpu-8g
和 a3-edgegpu-8g
虛擬機器人有五個實體 NIC,如要讓實體 NIC 發揮最佳效能,您需要建立五個虛擬私有雲網路,並將 MTU 設為 8244
。
建立管理網路、子網路和防火牆規則
請完成下列步驟設定管理網路:
-
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 連線至 VM。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
:用於虛擬私人雲端網路和子網路的名稱前置字串。PROJECT_ID
:您的專案 ID。REGION
:要建立網路的區域。SSH_SOURCE_IP_RANGE
:以 CIDR 格式表示的 IP 範圍。這會指定哪些來源 IP 位址可以使用 SSH 連線至您的 VM。
建立資料網路、子網路和防火牆規則
使用下列指令建立四個資料網路,每個網路都包含子網路和防火牆規則。
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
如要進一步瞭解如何建立虛擬私有雲網路,請參閱「建立及驗證巨型封包 MTU 網路」。
建立 GPU VM
如要使用 GPUDirect-TCPX 測試網路效能,您至少需要建立兩個 A3 虛擬機器。
使用
cos-105-lts
或更新版本的 Container-Optimized OS 映像檔,並指定先前步驟中建立的虛擬 MTU 網路,建立各個 VM。VM 也必須使用 Google Virtual NIC (gVNIC) 網路介面。對於 A3 虛擬機器,必須使用 gVNIC 1.4.0rc3 以上版本。這個驅動程式版本適用於 Container-Optimized OS。
第一個虛擬 NIC 會用做一般網路和儲存空間的主要 NIC,其他四個虛擬 NIC 則會與同一個 PCIe 交換器上八個 GPU 中的兩個 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-105-lts \ --image-project=cos-cloud \ --boot-disk-size=${BOOT_DISK_SZ:-50} \ --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
:VM 名稱。PROJECT_ID
:您的專案 ID。ZONE
:支援機器類型的區域。MACHINE_TYPE
:VM 的機器類型。指定a3-highgpu-8g
或a3-edgegpu-8g
。NETWORK_NAME_PREFIX
:用於虛擬私有雲網路和子網路的名稱前置字串。
安裝 GPU 驅動程式
在每個 A3 VM 上完成下列步驟。
執行下列指令安裝 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 VM 上,完成下列步驟,讓 NIC 存取 GPU:
設定登錄檔。
如果您使用的是 Container Registry,請執行下列指令:
docker-credential-gcr configure-docker
如果您使用的是 Artifact Registry,請執行下列指令:
docker-credential-gcr configure-docker --registries us-docker.pkg.dev
設定接收資料路徑管理工具。管理服務 GPUDirect-TCPX 接收資料路徑管理工具需要與使用 GPUDirect-TCPX 的應用程式一併執行。如要在每個 Container-Optimized OS VM 上啟動服務,請執行下列指令:
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 VM 上,執行 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 VM 上執行下列指令:
$ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
在一個 VM 上執行下列指令:
設定 VM 之間的連線。將
VM-0
和VM-1
替換為各個 VM 的名稱。/scripts/init_ssh.sh VM-0 VM-1 pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd
這樣一來,系統就會在每個 VM 上建立
/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.