建立啟用 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 的卸載網路堆疊,支援具有八個 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 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 進行驗證:
    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

    2. 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 測試網路效能,請完成下列步驟:

  1. 設定一或多個已設定大型 MTU 的虛擬私有雲 (VPC) 網路。
  2. 建立 GPU 執行個體。

設定虛擬私有雲網路

如要為 GPU VM 啟用有效率的通訊功能,您需要建立管理網路和一或多個資料網路。管理網路用於外部存取 (例如 SSH) 和大多數一般網路通訊。資料網路用於不同 VM 上的 GPU 之間的高效能通訊,例如遠端直接記憶體存取 (RDMA) 流量。

對於這些 VPC 網路,建議您將最大傳輸單元 (MTU) 設為較大的值。 MTU 值越高,封包大小就越大,封包標頭的負擔也會減少,進而提高有效負載資料總處理量。如要進一步瞭解如何建立虛擬私有雲網路,請參閱「建立及驗證巨型封包 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 連線至 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
      
    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:用於虛擬私有雲網路和子網路的名稱前置字串。
  • 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

彈性啟動

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
  • RUN_DURATION:VM 執行的最長時間,之後 Compute Engine 會停止或刪除 VM。您必須將值格式化為天數、時數、分鐘數或秒數,並分別加上 dhms。舉例來說,30m 代表 30 分鐘,1h2m3s 則代表 1 小時 2 分 3 秒。您可以指定介於 10 分鐘到七天之間的值。
  • VALID_FOR_DURATION`:等待佈建所要求資源的時間上限。您必須將值格式化為天數、時數、分鐘數或秒數,並分別加上 dhms。根據工作負載的區域需求,指定下列其中一個時間長度,有助於提高 VM 建立要求成功的機率:
    • 如果工作負載要求您在特定可用區中建立 VM,請指定 90 秒 (90s) 到兩小時 (2h) 的時間長度。時間越長,取得資源的機率就越高。
    • 如果 VM 可以在該地區的任何區域中執行,請指定零秒的持續時間 (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:VM 執行個體的名稱。
  • PROJECT_ID:專案 ID。
  • ZONE支援機器類型的區域。
  • BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如 50
  • NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。
  • TERMINATION_ACTION:在預留項目期限結束時停止或刪除 VM。指定下列其中一個值:
    • 如要停止 VM,請執行 STOP
    • 如要刪除 VM,請執行 DELETE
  • RESERVATION_URL:要使用的預訂網址。指定下列其中一個值:
    • 如果您在同一個專案中建立預留項目: example-reservation
    • 如果預留項目位於不同專案,且 您的專案可以使用該預留項目projects/PROJECT_ID/reservations/example-reservation

安裝 GPU 驅動程式

在每個 A3 Mega VM 上安裝 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 VM 上,授予 NIC 存取 GPU 的權限。

  1. 調整防火牆設定,接受所有連入 TCP 連線,並啟用叢集中節點之間的通訊:
    sudo /sbin/iptables -I INPUT -p tcp -m tcp -j ACCEPT
  2. 設定 dmabuf 模組。載入 import-helper 模組,這是 dmabuf 架構的一部分。這個架構可在 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 VM 上完成下列步驟:

  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 VM 上執行 nccl-tests 基準測試,請完成下列步驟:

  1. nccl-tests 容器中開啟互動式 Bash 殼層。
    docker exec -it nccl bash
  2. nccl-tests 容器的 Bash 殼層中,完成下列步驟。

    1. 設定 SSH 並產生主機檔案,為多節點執行作業設定環境。將 VM_NAME_1VM_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 的目錄。

    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 和 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-8ga3-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-8ga3-edgegpu-8g
  • BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如 50
  • NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。
  • TERMINATION_ACTION:VM 遭到先占時是否要停止或刪除。 指定下列其中一個值:
    • 如要停止 VM,請執行 STOP
    • 如要刪除 VM,請執行 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:VM 名稱。
  • PROJECT_ID:專案 ID。
  • ZONE支援機器類型的區域。
  • MACHINE_TYPE:VM 的機器類型。指定 a3-highgpu-8ga3-edgegpu-8g
  • BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如 50
  • NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。
  • TERMINATION_ACTION:在 VM 執行時間結束時停止或刪除 VM。指定下列其中一個值:
    • 如要停止 VM,請執行 STOP
    • 如要刪除 VM,請執行 DELETE
  • RUN_DURATION:VM 執行的最長時間,之後 Compute Engine 會停止或刪除 VM。您必須將值格式化為天數、時數、分鐘數或秒數,並分別加上 dhms。舉例來說,30m 代表 30 分鐘,1h2m3s 則代表 1 小時 2 分 3 秒。您可以指定介於 10 分鐘到七天之間的值。
  • VALID_FOR_DURATION`:等待佈建所要求資源的時間上限。您必須將值格式化為天數、時數、分鐘數或秒數,並分別加上 dhms。根據工作負載的區域需求,指定下列其中一個時間長度,有助於提高 VM 建立要求成功的機率:
    • 如果工作負載要求您在特定可用區中建立 VM,請指定 90 秒 (90s) 到兩小時 (2h) 的時間長度。時間越長,取得資源的機率就越高。
    • 如果 VM 可以在該地區的任何區域中執行,請指定零秒的持續時間 (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:VM 名稱。
  • PROJECT_ID:專案 ID。
  • ZONE支援機器類型的區域。
  • MACHINE_TYPE:VM 的機器類型。指定 a3-highgpu-8ga3-edgegpu-8g
  • BOOT_DISK_SIZE:開機磁碟的大小,單位為 GB,例如 50
  • NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。
  • TERMINATION_ACTION:在預留項目期限結束時停止或刪除 VM。指定下列其中一個值:
    • 如要停止 VM,請執行 STOP
    • 如要刪除 VM,請執行 DELETE
  • RESERVATION_URL:要使用的預訂網址。指定下列其中一個值:
    • 如果您在同一個專案中建立預留項目: example-reservation
    • 如果預留項目位於不同專案,且 您的專案可以使用該預留項目projects/PROJECT_ID/reservations/example-reservation

安裝 GPU 驅動程式

在每個 A3 High 或 Edge VM 上,完成下列步驟。

  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 或 Edge VM 上,完成下列步驟,授予 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 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"
       
  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 或 Edge VM 上,完成下列步驟來執行 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 \
       "$@"
    }
    

    上述指令會完成下列事項:

    • /dev 中的 NVIDIA 裝置掛接到容器
    • 將容器的網路命名空間設為主機
    • 將容器的使用者命名空間設為主機
    • CAP_IPC_LOCK 新增至容器的功能
    • 將主機的 /tmp 掛接至容器的 /tmp
    • 將 NCCL 和 GPUDirect-TCPX NCCL 外掛程式的安裝路徑掛接至容器,並將掛接路徑新增至 LD_LIBRARY_PATH
  2. 啟動容器後,使用 NCCL 的應用程式即可從容器內執行。舉例來說,如要執行 run-allgather 測試,請完成下列步驟:
    1. 在每個 A3 High 或 Edge VM 上執行下列指令:
      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
    2. 在其中一個 VM 上執行下列指令:
      1. 設定 VM 之間的連線。將 VM-0VM-1 替換為各個 VM 的名稱。
        /scripts/init_ssh.sh VM-0 VM-1
        pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd

        這會在每個 VM 上建立 /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 會將同一部 VM 中的單一 NVIDIA H100 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 分區」一節。