建立已啟用 GPUDirect-TCPX 的 A3 VM


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-8ga3-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-8ga3-edgegpu-8g VM。並說明如何在 VM 上啟用 GPUDirect-TCPX,以及如何設定及測試 GPU 網路效能。

總覽

如要使用 GPUDirect-TCPX 測試網路效能,請完成下列步驟:

  1. 設定一或多個虛擬私有雲 (VPC) 網路,並將 MTU 設定 (也稱為巨型封包) 設為 8244
  2. 使用 cos-105-lts 以上版本的 Container-Optimized OS 映像檔,建立 GPU VM。
  3. 在每個 VM 上安裝 GPU 驅動程式。
  4. 在每個 VM 上,將 GPU 的存取權授予網路介面卡 (NIC)。
  5. 執行 NCCL 測試。

設定巨型資料流程 MTU 網路

a3-highgpu-8ga3-edgegpu-8g 虛擬機器人有五個實體 NIC,如要讓實體 NIC 發揮最佳效能,您需要建立五個虛擬私有雲網路,並將 MTU 設為 8244

建立管理網路、子網路和防火牆規則

請完成下列步驟設定管理網路:

  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。

建立資料網路、子網路和防火牆規則

使用下列指令建立四個資料網路,每個網路都包含子網路和防火牆規則。

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 虛擬機器。

  1. 使用 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-8ga3-edgegpu-8g
    • NETWORK_NAME_PREFIX:用於虛擬私有雲網路和子網路的名稱前置字串。

安裝 GPU 驅動程式

在每個 A3 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 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 接收資料路徑管理工具需要與使用 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 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 \
      "$@"
    }
    

    上述指令會完成以下操作:

    • 將 NVIDIA 裝置從 /dev 掛載至容器
    • 將容器的網路命名空間設為主機
    • 將容器的使用者命名空間設為主機
    • CAP_IPC_LOCK 新增至容器的功能
    • 將主機的 /tmp 掛接至容器的 /tmp
    • 將 NCCL 和 GPUDirect-TCPX NCCL 外掛程式的安裝路徑掛載至容器,並將掛載的路徑新增至 LD_LIBRARY_PATH
  2. 啟動容器後,使用 NCCL 的應用程式就能在容器內執行。例如,如要執行 run-allgather 測試,請完成下列步驟:

    1. 在每個 A3 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.