本文說明如何設定 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 的卸載網路堆疊,支援具有八個 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 VM 的效能並縮短延遲時間。這項技術可讓資料封包酬載直接從 GPU 記憶體傳輸至網路介面,略過 CPU 和系統記憶體,這是遠端直接記憶體存取 (RDMA) 的一種形式。與前一代 A2 或 G2 加速器最佳化機器類型相比,A3 VM 搭配 Google 虛擬 NIC (gVNIC) 時,叢集內 VM 之間的處理量最高。
本文說明如何建立 A3 Mega、A3 High 或 A3 Edge VM,並啟用 GPUDirect-TCPX 或 GPUDirect-TCPXO,測試改善後的 GPU 網路效能。
事前準備
- 如要查看建立附加 GPU 的執行個體時的限制和額外必要步驟 (例如選取 OS 映像檔和檢查 GPU 配額),請參閱建立附加 GPU 的執行個體總覽。
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,可以選取下列任一選項,向 Compute Engine 進行驗證:
-
安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:
gcloud init若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
- Set a default region and zone.
-
必要的角色
如要取得建立 VM 所需的權限,請要求管理員授予您專案的 Compute 執行個體管理員 (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這個預先定義的角色具備建立 VM 所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
如要建立 VM,必須具備下列權限:
-
專案的
compute.instances.create -
如要使用自訂映像檔建立 VM:
compute.images.useReadOnly在映像檔上 -
如要使用快照建立 VM:
compute.snapshots.useReadOnly快照 -
如要使用執行個體範本建立 VM,請按照下列步驟操作:
compute.instanceTemplates.useReadOnly在執行個體範本上 -
如要為 VM 指定子網路:
compute.subnetworks.use專案或所選子網路的 -
如要為 VM 指定靜態 IP 位址:
專案的
compute.addresses.use -
使用虛擬私有雲網路時,如要將外部 IP 位址指派給 VM:
compute.subnetworks.useExternalIp專案或所選子網路的權限 -
如要將舊版網路指派給 VM,請按照下列步驟操作:
compute.networks.use專案的 -
使用舊版網路時,如要將外部 IP 位址指派給 VM,請在專案中設定
compute.networks.useExternalIp。 -
如要為 VM 設定 VM 執行個體中繼資料,請在專案中執行下列指令:
compute.instances.setMetadata -
如要為 VM 設定標記,請按照下列步驟操作:
compute.instances.setTags在 VM 上 -
如要為 VM 設定標籤,請按照下列步驟操作:
compute.instances.setLabels在 VM 上 -
如要設定 VM 使用的服務帳戶:
compute.instances.setServiceAccount在 VM 上 -
為 VM 建立新磁碟:
專案的
compute.disks.create -
如要以唯讀或讀寫模式附加現有磁碟:
磁碟的
compute.disks.use -
如要以唯讀模式附加現有磁碟:
compute.disks.useReadOnly磁碟的
總覽
如要使用 GPUDirect 測試網路效能,請完成下列步驟:
- 設定一或多個已設定大型 MTU 的虛擬私有雲 (VPC) 網路。
- 建立 GPU 執行個體。
設定虛擬私有雲網路
如要為 GPU VM 啟用有效率的通訊功能,您需要建立管理網路和一或多個資料網路。管理網路用於外部存取 (例如 SSH) 和大多數一般網路通訊。資料網路用於不同 VM 上的 GPU 之間的高效能通訊,例如遠端直接記憶體存取 (RDMA) 流量。
對於這些 VPC 網路,建議您將最大傳輸單元 (MTU) 設為較大的值。 MTU 值越高,封包大小就越大,封包標頭的負擔也會減少,進而提高有效負載資料總處理量。如要進一步瞭解如何建立虛擬私有雲網路,請參閱「建立及驗證巨型封包 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。
建立資料網路、子網路和防火牆規則
資料網路數量取決於您建立的 GPU 機器類型。A3 Mega
A3 Mega 需要八個資料網路。使用下列指令建立八個資料網路,每個網路都有子網路和防火牆規則。
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 需要四個資料網路。使用下列指令建立四個資料網路,每個網路都有子網路和防火牆規則。
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 VM 執行個體。
使用 cos-121-lts 以上的 Container-Optimized OS 映像檔建立每個 VM,並指定您在上一個步驟中建立的虛擬私有雲網路。
A3 Mega VM 需要九個 Google 虛擬 NIC (gVNIC) 網路介面,其中一個用於管理網路,八個用於資料網路。
根據您要用來建立 VM 的佈建模型,選取下列其中一個選項:
標準
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:VM 執行個體的名稱。PROJECT_ID:專案 ID。ZONE:支援機器類型的區域。BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如50。NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。
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:VM 執行個體的名稱。PROJECT_ID:專案 ID。ZONE:支援機器類型的區域。BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如50。NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。TERMINATION_ACTION:VM 遭到先占時是否要停止或刪除。 指定下列其中一個值:- 如要停止 VM,請執行
STOP: - 如要刪除 VM,請執行
DELETE
- 如要停止 VM,請執行
彈性啟動
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:VM 執行個體的名稱。PROJECT_ID:專案 ID。ZONE:支援機器類型的區域。BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如50。NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。TERMINATION_ACTION:在 VM 執行時間結束時停止或刪除 VM。指定下列其中一個值:- 如要停止 VM,請執行
STOP: - 如要刪除 VM,請執行
DELETE
- 如要停止 VM,請執行
RUN_DURATION:VM 執行的最長時間,之後 Compute Engine 會停止或刪除 VM。您必須將值格式化為天數、時數、分鐘數或秒數,並分別加上d、h、m和s。舉例來說,30m代表 30 分鐘,1h2m3s則代表 1 小時 2 分 3 秒。您可以指定介於 10 分鐘到七天之間的值。VALID_FOR_DURATION`:等待佈建所要求資源的時間上限。您必須將值格式化為天數、時數、分鐘數或秒數,並分別加上d、h、m和s。根據工作負載的區域需求,指定下列其中一個時間長度,有助於提高 VM 建立要求成功的機率:- 如果工作負載要求您在特定可用區中建立 VM,請指定 90 秒 (
90s) 到兩小時 (2h) 的時間長度。時間越長,取得資源的機率就越高。 - 如果 VM 可以在該地區的任何區域中執行,請指定零秒的持續時間 (
0s)。這個值表示 Compute Engine 只會在資源可立即使用時分配資源。如果建立要求因資源無法使用而失敗,請在不同可用區重試要求。
- 如果工作負載要求您在特定可用區中建立 VM,請指定 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:VM 執行個體的名稱。PROJECT_ID:專案 ID。ZONE:支援機器類型的區域。BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如50。NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。TERMINATION_ACTION:在預留項目期限結束時停止或刪除 VM。指定下列其中一個值:- 如要停止 VM,請執行
STOP: - 如要刪除 VM,請執行
DELETE
- 如要停止 VM,請執行
RESERVATION_URL:要使用的預訂網址。指定下列其中一個值:- 如果您在同一個專案中建立預留項目:
example-reservation - 如果預留項目位於不同專案,且
您的專案可以使用該預留項目:
projects/PROJECT_ID/reservations/example-reservation。
- 如果您在同一個專案中建立預留項目:
安裝 GPU 驅動程式
在每個 A3 Mega VM 上安裝 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 VM 上,授予 NIC 存取 GPU 的權限。
- 調整防火牆設定,接受所有連入 TCP 連線,並啟用叢集中節點之間的通訊:
sudo /sbin/iptables -I INPUT -p tcp -m tcp -j ACCEPT
- 設定
dmabuf模組。載入import-helper模組,這是dmabuf架構的一部分。這個架構可在 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」(緩衝區管理員初始化完成) 訊息,確認初始化成功。RxDMdocker container logs --follow rxdm
或者,檢查
RxDM初始化完成記錄。docker container logs rxdm 2>&1 | grep "Buffer manager initialization complete"
設定 NCCL 環境
在每個 A3 Mega VM 上完成下列步驟:
- 安裝
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 VM 上執行 nccl-tests 基準測試,請完成下列步驟:
- 在
nccl-tests容器中開啟互動式 Bash 殼層。docker exec -it nccl bash
- 設定 SSH 並產生主機檔案,為多節點執行作業設定環境。將
VM_NAME_1和VM_NAME_2替換為各個 VM 的名稱。/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 殼層中,完成下列步驟。
建立 A3 High 和 Edge 執行個體 (GPUDirect-TCPX)
使用 cos-121-lts 以上版本的 Container-Optimized OS 映像檔,建立 A3 High 和 Edge 執行個體。
COS
如要使用 GPUDirect-TCPX 測試網路效能,您至少需要建立兩個 A3 High 或 Edge VM。使用 cos-121-lts 以上版本的 Container-Optimized OS 映像檔建立每個 VM,並指定您在上一個步驟中建立的 VPC 網路。
VM 必須使用 Google Virtual NIC (gVNIC) 網路介面。 如果是 A3 High 或 Edge VM,則必須使用 gVNIC 驅動程式 1.4.0rc3 以上版本。這個驅動程式版本適用於 Container-Optimized OS。第一個虛擬 NIC 會做為一般網路和儲存空間的主要 NIC,其他四個虛擬 NIC 則會與相同 PCIe 交換器上的八個 GPU 中的兩個進行 NUMA 對齊。
根據您要用來建立 VM 的佈建模型,選取下列其中一個選項:
標準
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:VM 名稱。PROJECT_ID:專案 ID。ZONE:支援機器類型的區域。MACHINE_TYPE:VM 的機器類型。指定a3-highgpu-8g或a3-edgegpu-8g。BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如50。NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。
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:VM 名稱。PROJECT_ID:專案 ID。ZONE:支援機器類型的區域。MACHINE_TYPE:VM 的機器類型。指定a3-highgpu-8g或a3-edgegpu-8g。BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如50。NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。TERMINATION_ACTION:VM 遭到先占時是否要停止或刪除。 指定下列其中一個值:- 如要停止 VM,請執行
STOP: - 如要刪除 VM,請執行
DELETE
- 如要停止 VM,請執行
彈性啟動
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:VM 名稱。PROJECT_ID:專案 ID。ZONE:支援機器類型的區域。MACHINE_TYPE:VM 的機器類型。指定a3-highgpu-8g或a3-edgegpu-8g。BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如50。NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。TERMINATION_ACTION:在 VM 執行時間結束時停止或刪除 VM。指定下列其中一個值:- 如要停止 VM,請執行
STOP: - 如要刪除 VM,請執行
DELETE
- 如要停止 VM,請執行
RUN_DURATION:VM 執行的最長時間,之後 Compute Engine 會停止或刪除 VM。您必須將值格式化為天數、時數、分鐘數或秒數,並分別加上d、h、m和s。舉例來說,30m代表 30 分鐘,1h2m3s則代表 1 小時 2 分 3 秒。您可以指定介於 10 分鐘到七天之間的值。VALID_FOR_DURATION`:等待佈建所要求資源的時間上限。您必須將值格式化為天數、時數、分鐘數或秒數,並分別加上d、h、m和s。根據工作負載的區域需求,指定下列其中一個時間長度,有助於提高 VM 建立要求成功的機率:- 如果工作負載要求您在特定可用區中建立 VM,請指定 90 秒 (
90s) 到兩小時 (2h) 的時間長度。時間越長,取得資源的機率就越高。 - 如果 VM 可以在該地區的任何區域中執行,請指定零秒的持續時間 (
0s)。這個值表示 Compute Engine 只會在資源可立即使用時分配資源。如果建立要求因資源無法使用而失敗,請在不同可用區重試要求。
- 如果工作負載要求您在特定可用區中建立 VM,請指定 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:VM 名稱。PROJECT_ID:專案 ID。ZONE:支援機器類型的區域。MACHINE_TYPE:VM 的機器類型。指定a3-highgpu-8g或a3-edgegpu-8g。BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如50。NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。TERMINATION_ACTION:在預留項目期限結束時停止或刪除 VM。指定下列其中一個值:- 如要停止 VM,請執行
STOP: - 如要刪除 VM,請執行
DELETE
- 如要停止 VM,請執行
RESERVATION_URL:要使用的預訂網址。指定下列其中一個值:- 如果您在同一個專案中建立預留項目:
example-reservation - 如果預留項目位於不同專案,且
您的專案可以使用該預留項目:
projects/PROJECT_ID/reservations/example-reservation。
- 如果您在同一個專案中建立預留項目:
安裝 GPU 驅動程式
在每個 A3 High 或 Edge 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 High 或 Edge VM 上,完成下列步驟,授予 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 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 High 或 Edge 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 High 或 Edge 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
- 設定 VM 之間的連線。將
run-allgather指令碼大約需要兩分鐘才能執行完畢。記錄檔結尾會顯示all-gather結果。如果 NCCL 記錄中顯示下列行,表示 GPUDirect-TCPX 已成功初始化。
NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.
- 在每個 A3 High 或 Edge VM 上執行下列指令:
多執行個體 GPU
多執行個體 GPU 會將同一部 VM 中的單一 NVIDIA H100 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 分區」一節。