建立已啟用 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,非常適合大型 Transformer 架構語言模型、資料庫和高效能運算 (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. 設定一或多個已設定大型 MTU 的虛擬私有雲 (VPC) 網路。
  2. 使用 cos-105-lts 以上版本的 Container-Optimized OS 映像檔,建立 GPU VM。
  3. 在每個 VM 上安裝 GPU 驅動程式。
  4. 在每個 VM 上,授予網路介面卡 (NIC) GPU 存取權。
  5. 執行 NCCL 測試。

設定虛擬私有雲網路

對於這些 VPC 網路,建議您將最大傳輸單元 (MTU) 設為較大的值。 MTU 值越高,封包大小就越大,封包標頭的負擔也會減少,進而提高酬載資料總處理量。

如要盡量提高 A3 High 機型的網路頻寬,請將 MTU 設為 8244 位元組。如要查看其他 GPU 機器類型的建議 MTU 設定,請參閱「GPU 機器類型的 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。

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

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

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。

  1. 使用 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-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 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 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 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.