加速器最佳化機器系列由Google Cloud 設計,可為 GPU 加速工作負載 (例如人工智慧 (AI)、機器學習 (ML) 和高效能運算 (HPC)) 提供所需的效能和效率。
A3 系列是經過加速器最佳化的機器,具備 208 個 vCPU,最多可提供 1872 GB 記憶體。每個 A3 機器類型都連接八個 NVIDIA H100 GPU,每個 GPU 提供 80 GB 的 GPU 記憶體。這些 VM 的網路頻寬最高可達 1,000 Gbps,非常適合大型 Transformer 架構語言模型、資料庫和高效能運算 (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 測試網路效能,請完成下列步驟:
- 設定一或多個已設定大型 MTU 的虛擬私有雲 (VPC) 網路。
- 使用
cos-105-lts
以上版本的 Container-Optimized OS 映像檔,建立 GPU VM。 - 在每個 VM 上安裝 GPU 驅動程式。
- 在每個 VM 上,授予網路介面卡 (NIC) GPU 存取權。
- 執行 NCCL 測試。
設定虛擬私有雲網路
對於這些 VPC 網路,建議您將最大傳輸單元 (MTU) 設為較大的值。 MTU 值越高,封包大小就越大,封包標頭的負擔也會減少,進而提高酬載資料總處理量。
如要盡量提高 A3 High 機型的網路頻寬,請將 MTU 設為 8244
位元組。如要查看其他 GPU 機器類型的建議 MTU 設定,請參閱「GPU 機器類型的 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 連線至 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 VM。
使用
cos-105-lts
以上版本的 Container-Optimized OS 映像檔建立每個 VM,並指定上一步建立的虛擬 MTU 網路。VM 也必須使用 Google Virtual NIC (gVNIC) 網路介面。如要使用 A3 VM,必須安裝 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-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 Receive Data Path Manager) 必須與使用 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 \ "$@" }
上述指令會完成下列事項:
- 將
/dev
中的 NVIDIA 裝置掛接到容器 - 將容器的網路命名空間設為主機
- 將容器的使用者命名空間設為主機
- 將
CAP_IPC_LOCK
新增至容器的功能 - 將主機的
/tmp
掛接至容器的/tmp
- 將 NCCL 和 GPUDirect-TCPX NCCL 外掛程式的安裝路徑掛接到容器中,並將掛接路徑新增至
LD_LIBRARY_PATH
- 將
啟動容器後,即可在容器內執行使用 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.