建立自訂 AI 最佳化 A3 Edge GKE 叢集

本頁說明如何建立 AI 最佳化的 Google Kubernetes Engine (GKE) 叢集,使用 A3 Edge 虛擬機器 (VM) 支援人工智慧 (AI) 和機器學習 (ML) 工作負載。A3 Edge 機器的設計宗旨是協助您運用目標工作負載放置、緊湊放置、進階叢集維護控制項和 TAS 等功能,執行大規模 AI 和機器學習叢集。詳情請參閱叢集管理總覽

GKE 提供單一平台介面,可為貴機構執行各種工作負載,減少管理多個平台的營運負擔。您可以執行高效能分散式預先訓練、模型微調、模型推論、應用程式服務和支援服務等工作負載。

本頁說明如何使用 GPUDirect-TCPX、gVNIC 和多重網路,建立 Google Kubernetes Engine (GKE) Standard 和 Autopilot 叢集。

本頁面適用於機器學習 (ML) 工程師和平台管理員,可協助他們處理 ML 工作負載。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

人工智慧 (AI)、機器學習和高效能運算 (HPC) 應用程式需要強大的加速功能,才能縮短作業完成時間,進而提升效能。舉例來說,著重於對話式 AI 和圖像生成的機器學習模型,需要高擴充性和運算能力。

本頁假設您熟悉網路技術,例如網路介面卡 (NIC) 和 TCP,以及加速器技術,例如 NVIDIA Collective Communications Library (NCCL)。

關於 Google Cloud GPU 超級電腦

Google Cloud 提供加速器最佳化超級電腦,專為可擴充的大型模型而建。這些 GPU 機型的網路頻寬最高可達 3,600 Gbps。

GKE 工作負載必須使用單一節點上的所有可用 GPU 和所有可用次要 NIC,並使用大量可用頻寬。本文所述解決方案專為需要高效能、高處理量和低延遲的工作負載而設計。

可將頻寬發揮到極致的必要功能

如要盡量提高 GPU 超級電腦節點的網路頻寬,請使用下列功能:

  • GPUDirect 網路堆疊:A3 Edge 支援三種網路堆疊,可供自訂遠端直接記憶體存取 (RDMA)。A3 Edge 機器使用 GPUDirect-TCPX,可減少將封包酬載傳輸至 GPU 和從 GPU 傳輸封包酬載所需的額外負擔,因此與未使用 GPUDirect 的 GPU 相比,大規模處理量大幅提升。
  • gVNIC:啟用 GPUDirect 功能,例如封包標頭分割、流量導向和緩衝區管理。使用 GPUDirect-TCPX 時,必須啟用 gVNIC。如要瞭解 gVNIC 的詳細資訊,請參閱「提高 GPU 節點的網路流量速度」。

您也必須啟用及設定下列功能:

  • 多重網路:將次要 NIC 新增至加速器最佳化機器。 每個 NIC 都會與各自 VPC 中的獨立子網路建立關聯,以避免衝突。如要瞭解多網路支援功能,請參閱「為 Pod 設定多網路支援功能」。
  • 配置政策:使用資源配置政策,將特定工作負載的所有 GPU 節點放置在實體上相近的伺服器,盡量減少延遲。詳情請參閱「為 GKE 節點定義緊密放置位置」。

程序大綱

如要同時使用 GPUDirect-TCPX、gVNIC、多重網路和密集配置政策,請執行下列操作:

  1. 建立虛擬私有雲 (VPC) 和子網路
  2. 建立 GKE 環境
  3. 安裝 GPUDirect 二進位檔和 NCCL 外掛程式
  4. 部署 NRI 裝置注入器外掛程式
  5. 部署測試工作負載,驗證 GPUDirect 設定
  6. 為自己的工作負載採用 GPUDirect

事前準備

開始之前,請務必先完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
  • 確認您有 A3 Edge VM 的容量。如要取得這項容量,請先從用量方案中選擇。如要按照本頁的說明操作,您可以使用隨需容量、隨需預訂,或最多 90 天的未來預訂 (日曆模式)。選擇用量方案後,請按照相關操作說明,使用所選方案取得容量。
  • 請確認您有足夠的 H100 GPU 配額。如要申請更多配額,請參閱「GPU 配額」。

需求條件

GPUDirect-TCPX 須符合下列條件:

標準

  • 所有可用的 GKE 子版本都支援 GPUDirect-TCPX,但須使用特定修補程式版本:
    • 如果是 GKE 1.30 至 1.33 版,可以使用任何修補程式版本。
    • 如果是 GKE 1.34 版,請使用 1.34.5-gke.1153000 以上的修補程式版本。
    • 如果是 GKE 1.35 版,請使用 1.35.2-gke.1485000 以上的修補程式版本。
    • 如果是 GKE 1.36 以上版本,可以使用任何修補程式版本。
  • GKE 節點必須使用 Container-Optimized OS (COS) 節點映像檔。系統不支援 Ubuntu 和 Windows 節點映像檔。
  • GPU 節點必須使用 NVIDIA 驅動程式 535 以上版本。
  • 您必須使用 GKE Dataplane V2。
  • 在 GKE 1.34 以上版本中,您必須使用 3.1.9 以上版本的 GPUDirect-TCPX 安裝程式,以及 2.0.12 以上版本的 GPUDirect-TCPX Sidecar。安裝程式和 Sidecar 版本會一一對應,且必須相符。舉例來說,安裝程式 3.1.12 版對應的 Sidecar 版本為 2.0.15。如要進一步瞭解安裝程式和 Sidecar 版本,請參閱 GPUDirect-TCPX 版本資訊
  • 如要跨多個節點集區執行 GPUDirect-TCPX 工作負載,所有節點集區都必須位於相同的 Compute Engine 區域,且必須使用相同的網路集,例如 VPC 和子網路。

Autopilot

  • 如要使用 GPUDirect-TCPX,叢集必須執行下列最低 GKE 修補程式版本:
    • 如果是 GKE 1.31 版,請使用 1.31.1-gke.1621000 以上的修補程式版本。
    • 如果是 GKE 1.32 至 1.33 版,請使用任何修補程式版本。
    • 如果是 GKE 1.34 版,請使用 1.34.5-gke.1153000 以上的修補程式版本。
    • 如果是 GKE 1.35 版,請使用 1.35.2-gke.1485000 以上的修補程式版本。
    • 如果是 GKE 1.36 以上版本,可以使用任何修補程式版本。
  • GPU 節點必須使用 NVIDIA 驅動程式 535 以上版本。
  • 您必須使用 GKE Dataplane V2。
  • 在 GKE 1.34 以上版本中,您必須使用 GPUDirect-TCPX 安裝程式 3.1.9 以上版本,以及 GPUDirect-TCPX Sidecar 2.0.12 以上版本。安裝程式和 Sidecar 版本會一一對應,且必須相符。舉例來說,安裝程式 3.1.12 版對應的 Sidecar 版本為 2.0.15。如要進一步瞭解安裝程式和 Sidecar 版本,請參閱 GPUDirect-TCPX 版本資訊
  • 如要跨多個節點集區執行 GPUDirect-TCPX 工作負載,所有節點集區都必須位於相同的 Compute Engine 區域,且必須使用相同的網路集,例如 VPC 和子網路。

限制

限制如下:

  • GPUDirect-TCPX 不支援多重執行個體 GPUGPU 分時NVIDIA MPS
  • 您無法將 NCCL FastSocket 與 GPUDirect-TCPX 搭配使用。
  • GKE 工作負載必須使用單一節點上的所有可用 GPU 和所有可用次要 NIC。單一節點上的多個 Pod 無法使用 GPUDirect-TCPX。

建立虛擬私有雲和子網路

在專案中為要新增至節點的每個虛擬 NIC 建立個別的 VPC 網路。每個虛擬私有雲網路都必須有子網路和防火牆規則,允許內部網路流量。

  1. 為充分利用頻寬,建議您建立四個新網路。

    for N in $(seq 1 4); do
    gcloud compute networks create PREFIX-net-$N \
        --subnet-mode=custom \
        --mtu=8244
    
    gcloud compute networks subnets create PREFIX-sub-$N \
        --network=PREFIX-net-$N \
        --region=REGION \
        --range=SUBNET_RANGE
    
    gcloud compute firewall-rules create PREFIX-internal-$N \
    --network=PREFIX-net-$N \
    --action=ALLOW \
    --rules=tcp:0-65535,udp:0-65535,icmp \
    --source-ranges=SOURCE_RANGE
    done
    

    更改下列內容:

    • PROJECT_ID:您的 Google Cloud 專案 ID。
    • REGION:每個子網路的 Compute Engine 區域。
    • SUBNET_RANGE:每個子網路的 IP 位址範圍,以 CIDR 標記法表示。這個範例指令會針對四個子網路進行疊代,因此您應使用變數來變更每個子網路的 IP 位址。舉例來說,指定 192.168.$N.0/24,第一個子網路就會使用 192.168.1.0/24,第二個子網路使用 192.168.2.0/24,依此類推。
    • SOURCE_RANGE:防火牆規則的來源 IP 位址範圍,以 CIDR 標記法表示,可允許輸入流量。例如:192.168.0.0/16
  2. 確認網路已建立:

    gcloud compute networks list
    

建立 GKE 環境

建立使用多重網路 (搶先版) 的新 GKE 叢集,並建立具有下列特性的 GPU 節點集區:

  • 已啟用 gVNIC
  • 為每個次要 NIC 指定多重網路子網路
  • 搭載 H100 GPU 的 A3 Edge 機器系列,可支援節點
  • 已安裝最新版 NVIDIA 驅動程式

您無法更新現有叢集來使用多重網路。

  1. 建立叢集:

    標準

    gcloud beta container clusters create CLUSTER_NAME \
      --enable-dataplane-v2 \
      --enable-ip-alias \
      --location=CONTROL_PLANE_LOCATION \
      --enable-multi-networking \
      --cluster-version=VERSION \
      --no-enable-autoupgrade \
      --project=PROJECT_ID
    

    更改下列內容:

    • CLUSTER_NAME:新叢集的名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。為地區叢集提供區域,或為區域叢集提供可用區。
    • VERSION:支援 GPUDirect-TCPX 的 GKE 版本,如「需求條件」一節所述。

    Autopilot

    gcloud beta container clusters create-auto CLUSTER_NAME \
        --project=PROJECT_ID \
        --location=CONTROL_PLANE_LOCATION \
        --cluster-version=VERSION \
        --enable-multi-networking \
        --workload-policies=allow-net-admin
    

    更改下列內容:

    • CLUSTER_NAME:新叢集的名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 區域
    • VERSION:支援 GPUDirect-TCPX 的 GKE 版本,如「需求條件」一節所述。
  2. 在叢集中建立與您建立的虛擬私有雲網路和子網路對應的 Network 和 GKENetworkParamSet 資源:

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc1
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc1
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc2
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc2
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc3
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc3
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc4
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc4
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc1
    spec:
      vpc: PREFIX-net-1
      vpcSubnet: PREFIX-sub-1
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc2
    spec:
      vpc: PREFIX-net-2
      vpcSubnet: PREFIX-sub-2
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc3
    spec:
      vpc: PREFIX-net-3
      vpcSubnet: PREFIX-sub-3
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc4
    spec:
      vpc: PREFIX-net-4
      vpcSubnet: PREFIX-sub-4
      deviceMode: NetDevice
    EOF
    

    這些資源會告知 GKE,以直通模式設定 NIC,處理 GPU 流量。GKE 不會對這類流量套用使用 eBPF 的內建網路程式設計。

建立 GPU 節點集區 (僅限標準叢集)

  1. 為 H100 GPU 建立節點集區:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type=a3-edgegpu-8g \
        --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \
        --additional-node-network=network=PREFIX-net-1,subnetwork=PREFIX-sub-1 \
        --additional-node-network=network=PREFIX-net-2,subnetwork=PREFIX-sub-2 \
        --additional-node-network=network=PREFIX-net-3,subnetwork=PREFIX-sub-3 \
        --additional-node-network=network=PREFIX-net-4,subnetwork=PREFIX-sub-4 \
        --enable-gvnic \
        --no-enable-autoupgrade \
        --placement-policy=POLICY_NAME \
        --reservation-affinity=specific \
        --reservation=projects/PROJECT_ID/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME
    

    NODE_POOL_NAME 替換為節點集區的名稱。

    如要使用預留項目,請使用 --placement-policy--reservation-affinity--reservation 旗標。指定這些標記,即可在節點集區中設定政策名稱和預訂項目。如果預留項目不需要資源政策,請略過 --placement-policy 旗標。

    --reservation-affinity 標記可採用 specificany 值。不過,對於高效能分散式 AI 工作負載,我們建議使用特定預訂。你可以查看預訂資訊,例如預訂名稱或預訂中的特定區塊名稱。如要找出隨需預留項目的這些值,請查看預留項目清單,或查看未來預留項目要求

    如要使用預留項目,請替換下列項目:

    • PROJECT_ID:(選用) 您的 Google Cloud專案 ID。如果預留項目位於目前專案中 (而非共用預留項目),您可以從預留項目值中省略 projects/PROJECT_ID/reservations/
    • RESERVATION_NAME:預訂名稱。
    • BLOCK_NAME:預留項目中特定區塊的名稱 (選用)。如不想使用特定區塊,請省略 /reservationBlocks/BLOCK_NAME

    如果這項指令失敗,可能是因為專案的 H100 GPU 配額不足。請確認您有配額,然後重試指令。

  2. 建立節點集區後,請確認每個節點都已附加 GPU:

    1. 取得叢集中的節點清單:

      kubectl get nodes
      
    2. 確認每個 GPU 節點都有八個 GPU:

      kubectl describe node NODE_NAME
      

      NODE_NAME 替換為要說明的節點名稱。

      輸出結果會與下列內容相似:

      Capacity:
        ...
        nvidia.com/gpu:             8
      Allocatable:
        ...
        nvidia.com/gpu:             8
      

安裝 GPUDirect 二進位檔和 NCCL 外掛程式

本節說明如何使用 DaemonSet 安裝 GPUDirect-TCPX 二進位檔和特定 NCCL 程式庫版本。

這個 DaemonSet 會執行下列作業:

  1. 在節點上安裝 NCCL 程式庫和 GPUDirect-TCPX 二進位檔。
  2. 將程式庫和二進位檔儲存在 VM 的 /home/kubernetes/bin/nvidia/lib64 目錄中。根據預設,GKE 會將這個目錄掛接到需要使用 NCCL 和 GPUDirect-TCPX 的 GPU 容器中的 /usr/local/nvidia/lib64 路徑。

如要安裝二進位檔並設定 NCCL,請按照下列步驟操作:

標準

  1. 查看 nccl-tcpx-installer.yaml GitHub 中的 Daemonset 資訊清單

  2. 部署 DaemonSet:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer.yaml
    

    NCCL 外掛程式大約需要兩分鐘才能開始執行。

  3. 驗證 DaemonSet Pod 的狀態:

    kubectl get pods -n=kube-system -l=name=nccl-tcpx-installer
    

    輸出結果會與下列內容相似:

    nccl-tcpx-installer-6c2pv                    1/1     Running   0          2m11s
    nccl-tcpx-installer-qgg82                    1/1     Running   0          2m11s
    

Autopilot

  1. 查看 nccl-tcpx-installer-autopilot.yaml GitHub 中的 Daemonset 資訊清單

  2. 建立專屬命名空間:

    kubectl create ns gpudirect-system
    
  3. 部署 DaemonSet:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer-autopilot.yaml
    

    NCCL 外掛程式大約需要兩分鐘才能開始執行。

部署 NRI 裝置注入器外掛程式

本節說明如何使用 DaemonSet 安裝 NRI 裝置注入器。這個外掛程式會執行下列作業:

  1. 在搭載 H100 GPU 的節點上啟用節點資源介面 (NRI)。在 GKE 1.29 以上版本中,NRI 預設為啟用。
  2. 部署 NRI 裝置注入器外掛程式容器,將 GPU 裝置注入 Pod 註解指定的容器。

如要安裝外掛程式,請按照下列步驟操作:

標準

  1. 查看 nri-device-injector.yaml GitHub 中的部署資訊清單

  2. 部署 DaemonSet:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector.yaml
    

    NCCL 外掛程式大約需要兩分鐘才能開始執行。

  3. 驗證 DaemonSet Pod 的狀態:

    kubectl get pods -n=kube-system -l=name=device-injector
    

    輸出結果會與下列內容相似:

    # Output
    device-injector-md6hb                         1/1     Running   0       4h54m
    device-injector-vh9bm                         1/1     Running   0       4h54m
    

Autopilot

  1. 查看 nri-device-injector-autopilot.yaml GitHub 中的部署資訊清單

  2. 部署 DaemonSet:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector-autopilot.yaml
    

    NCCL 外掛程式大約需要兩分鐘才能開始執行。

部署測試工作負載

在本節中,您會部署範例工作負載,確認 NCCL 和 GPUDirect-TCPX 運作正常。這個工作負載範例會執行下列作業:

  1. 部署兩個 Pod,每個 Pod 都會在具有 H100 GPU 的節點中執行。
  2. 在每個 Pod 中部署邊車容器,讓這些 Pod 使用 GPUDirect-TCPX。

這項工作負載包含名為 tcpx-daemon 的邊車容器,可執行一項服務,讓 Pod 使用 GPUDirect-TCPX。您必須將這個邊車容器新增至自有環境中需要使用 GPUDirect-TCPX 的任何 Pod。如需在資訊清單中新增必要欄位的程式碼片段,請參閱「在資訊清單中新增 GPUDirect」。

  1. 查看 GitHub 中的 nccl-config.yaml ConfigMap 資訊清單。 這個資訊清單會部署指令碼,初始化 NCCL 全體收集測試,並設定 NCCL 專屬的設定。

  2. 請根據叢集模式執行下列操作:

  3. 部署 ConfigMap 和測試工作負載:

    標準

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest.yaml
    

    Autopilot

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest-autopilot.yaml
    
  4. 確認 Pod 正在執行且已準備就緒。請注意,這些圖片很大 (約 5 GB),可能需要幾分鐘才能下載完畢。

    kubectl get pods -w
    

    指令會監控更新,並在 Pod 狀態變更時列印新行。輸出結果會與下列內容相似:

    NAME               READY   STATUS              RESTARTS   AGE
    nccl-test-host-1   0/2     ContainerCreating   0          23s
    nccl-test-host-2   2/2     Running             0          23s
    nccl-test-host-1   2/2     Running             0          46s
    

    請等待所有 Pod 的 STATUS 訊息都顯示為 Running,且 READY 的值為 2/2,再繼續下一個步驟。

  5. 執行下列指令,為節點觸發 NCCL all-gather 測試:

    kubectl exec \
      --stdin --tty --container=nccl-test nccl-test-host-1 \
      -- /configs/allgather.sh nccl-host-1 nccl-host-2
    

    輸出結果會與下列內容相似:

    標準

      #                                                              out-of-place                       in-place
      #        size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
      #         (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
                  0             0     float    none      -1     0.24    0.00    0.00      0     0.18    0.00    0.00      0
                  0             0     float    none      -1     0.19    0.00    0.00      0     0.17    0.00    0.00      0
                  0             0     float    none      -1     0.17    0.00    0.00      0     0.17    0.00    0.00      0
                  0             0     float    none      -1     0.17    0.00    0.00      0     0.17    0.00    0.00      0
                  0             0     float    none      -1     0.17    0.00    0.00      0     0.17    0.00    0.00      0
                256             4     float    none      -1    235.2    0.00    0.00      0    235.1    0.00    0.00      0
                512             8     float    none      -1    241.0    0.00    0.00      0    236.1    0.00    0.00      0
               1024            16     float    none      -1    236.3    0.00    0.00      0    233.3    0.00    0.00      0
               2048            32     float    none      -1    234.1    0.01    0.01      0    233.4    0.01    0.01      0
               4096            64     float    none      -1    237.1    0.02    0.02      0    235.3    0.02    0.02      0
               8192           128     float    none      -1    236.2    0.03    0.03      0    235.2    0.03    0.03      0
              16384           256     float    none      -1    236.6    0.07    0.06      0    238.5    0.07    0.06      0
              32768           512     float    none      -1    237.9    0.14    0.13      0    238.8    0.14    0.13      0
              65536          1024     float    none      -1    242.3    0.27    0.25      0    239.4    0.27    0.26      0
             131072          2048     float    none      -1    263.0    0.50    0.47      0    275.1    0.48    0.45      0
             262144          4096     float    none      -1    279.2    0.94    0.88      0    269.9    0.97    0.91      0
             524288          8192     float    none      -1    273.5    1.92    1.80      0    273.5    1.92    1.80      0
            1048576         16384     float    none      -1    315.1    3.33    3.12      0    314.1    3.34    3.13      0
            2097152         32768     float    none      -1    319.2    6.57    6.16      0    311.5    6.73    6.31      0
            4194304         65536     float    none      -1    331.8   12.64   11.85      0    331.3   12.66   11.87      0
            8388608        131072     float    none      -1    356.3   23.54   22.07      0    353.8   23.71   22.23      0
           16777216        262144     float    none      -1    409.1   41.01   38.45      0    405.2   41.40   38.81      0
           33554432        524288     float    none      -1    451.4   74.34   69.69      0    447.7   74.94   70.26      0
           67108864       1048576     float    none      -1    713.4   94.07   88.19      0    713.8   94.01   88.13      0
          134217728       2097152     float    none      -1   1122.1  119.62  112.14      0   1116.3  120.23  112.72      0
          268435456       4194304     float    none      -1   1785.8  150.32  140.92      0   1769.2  151.72  142.24      0
          536870912       8388608     float    none      -1   2859.7  187.74  176.00      0   2852.6  188.20  176.44      0
         1073741824      16777216     float    none      -1   5494.1  195.44  183.22      0   5568.2  192.83  180.78      0
         2147483648      33554432     float    none      -1    10841  198.09  185.71      0    10798  198.88  186.45      0
         4294967296      67108864     float    none      -1    21453  200.21  187.70      0    21490  199.86  187.37      0
         8589934592     134217728     float    none      -1    42603  201.63  189.03      0    42670  201.31  188.73      0
      # Out of bounds values : 0 OK
      # Avg bus bandwidth    : 45.7587
      #
      ```
    

    Autopilot

    #                                                              out-of-place                       in-place
    #       size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
    #        (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
        1048576         16384     float    none      -1    696.8    1.50    1.41      0    729.0    1.44    1.35      0
        2097152         32768     float    none      -1    776.4    2.70    2.53      0    726.7    2.89    2.71      0
        4194304         65536     float    none      -1    774.3    5.42    5.08      0    805.1    5.21    4.88      0
        8388608        131072     float    none      -1    812.1   10.33    9.68      0    817.6   10.26    9.62      0
       16777216        262144     float    none      -1   1035.2   16.21   15.19      0   1067.8   15.71   14.73      0
       33554432        524288     float    none      -1   1183.3   28.36   26.59      0   1211.8   27.69   25.96      0
       67108864       1048576     float    none      -1   1593.4   42.12   39.49      0   1510.5   44.43   41.65      0
      134217728       2097152     float    none      -1   2127.8   63.08   59.13      0   2312.7   58.03   54.41      0
      268435456       4194304     float    none      -1   3603.0   74.50   69.85      0   3586.2   74.85   70.17      0
      536870912       8388608     float    none      -1   7101.7   75.60   70.87      0   7060.9   76.03   71.28      0
    # Out of bounds values : 0 OK
    # Avg bus bandwidth    : 29.8293
    

為自己的工作負載採用 GPUDirect

確認叢集網路可順利處理範例測試工作負載後,下一步就是為實際工作負載採用 GPUDirect。如要採用 GPUDirect,請更新 NCCL 設定和 Kubernetes Pod 資訊清單。

使用必要的 NCCL 設定來提升效能

下列鍵/值組合是 GPUDirect-TCPX 的必要 NCCL 設定。部署使用 NCCL 的工作負載時,請將這些工作負載設為環境變數,以提升效能。

"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64\"",
"NCCL_SOCKET_IFNAME=\"eth0\"",
"NCCL_ALGO=Ring",
"NCCL_PROTO=Simple",
"NCCL_CROSS_NIC=0",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_P2P_PXN_LEVEL=0",
"NCCL_GPUDIRECTTCPX_SOCKET_IFNAME=eth1,eth2,eth3,eth4",
"NCCL_GPUDIRECTTCPX_CTRL_DEV=eth0",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_BUFFSIZE=4194304",
"NCCL_NSOCKS_PERTHREAD=4",
"NCCL_SOCKET_NTHREADS=1",
"NCCL_GPUDIRECTTCPX_TX_BINDINGS=\"eth1:8-21,112-125;eth2:8-21,112-125;eth3:60-73,164-177;eth4:60-73,164-177\"",
"NCCL_GPUDIRECTTCPX_RX_BINDINGS=\"eth1:22-35,126-139;eth2:22-35,126-139;eth3:74-87,178-191;eth4:74-87,178-191\"",
"NCCL_GPUDIRECTTCPX_PROGRAM_FLOW_STEERING_WAIT_MICROS=500000"

在資訊清單中新增 GPUDirect

本節說明必須新增至 Kubernetes 資訊清單的必要欄位,Pod 才能使用 GPUDirect。

視叢集模式而定,請執行下列操作:

標準

  1. 在 Pod 中繼資料中新增下列註解。如果沒有這些註解,Pod 就必須使用 hostNetwork:true,而 tcpx-daemon 容器則必須使用 privileged:true

    metadata:
      annotations:
        devices.gke.io/container.tcpx-daemon: |+
          - path: /dev/nvidia0
          - path: /dev/nvidia1
          - path: /dev/nvidia2
          - path: /dev/nvidia3
          - path: /dev/nvidia4
          - path: /dev/nvidia5
          - path: /dev/nvidia6
          - path: /dev/nvidia7
          - path: /dev/nvidiactl
          - path: /dev/nvidia-uvm
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth1","network":"vpc1"},
            {"interfaceName":"eth2","network":"vpc2"},
            {"interfaceName":"eth3","network":"vpc3"},
            {"interfaceName":"eth4","network":"vpc4"},
          ]
    
  2. 在 Pod 規格中新增下列欄位:

    spec:
      volumes:
      - name: libraries
        hostPath:
          path: /home/kubernetes/bin/nvidia/lib64
      - name: sys
        hostPath:
          path: /sys
      - name: proc-sys
        hostPath:
          path: /proc/sys
    
  3. 在資訊清單中新增下列容器,即可執行 tcpx-daemon 服務:

    - name: tcpx-daemon
      image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9
      command:
        - /tcpgpudmarxd/build/app/tcpgpudmarxd
        - --gpu_nic_preset
        - a3vm
        - --gpu_shmem_type
        - fd
        - --uds_path
        - /run/tcpx
        - --setup_param
        - \"--verbose 128 2 0 \"
      securityContext:
        capabilities:
            add:
              - NET_ADMIN
      volumeMounts:
        - name: libraries
          mountPath: /usr/local/nvidia/lib64
        - name: tcpx-socket
          mountPath: /run/tcpx
        - name: sys
          mountPath: /hostsysfs
        - name: proc-sys
          mountPath: /hostprocsysfs
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
    
  4. 將下列磁碟區掛接至要求 GPU 的任何容器:

    volumeMounts:
    - name: tcpx-socket
      mountPath: /tmp
    - name: libraries
      mountPath: /usr/local/nvidia/lib64
    
  5. 新增環境變數來設定 NCCL 選項。詳情請參閱本文的「使用建議的 NCCL 設定提升效能」一節。

  6. 在每個 GPU 容器中新增下列環境變數:

    env:
    - name: LD_LIBRARY_PATH
      value: /usr/local/nvidia/lib64
    

如需已完成的 Pod 規格範例,請參閱 GitHub 上的 nccl-test-latest.yaml 資訊清單。

Autopilot

如果是 Autopilot 模式,您也必須在 Pod 資訊清單中選取適當的 GPU,GKE 才會佈建硬體。

在 Pod 中新增下列節點選取器:

nodeSelector:
  cloud.google.com/gke-accelerator: a3-edgegpu-8g
  cloud.google.com/gke-gpu-driver-version: latest

此外,如要使用預留容量,可以提供預留項目的相關資訊。詳情請參閱「在 Autopilot 叢集中使用容量預留項目」一文中的子章節。

  1. 在 Pod 中繼資料中新增下列註解:

    metadata:
      annotations:
        devices.gke.io/container.tcpx-daemon: |+
          - path: /dev/nvidia0
          - path: /dev/nvidia1
          - path: /dev/nvidia2
          - path: /dev/nvidia3
          - path: /dev/nvidia4
          - path: /dev/nvidia5
          - path: /dev/nvidia6
          - path: /dev/nvidia7
          - path: /dev/nvidiactl
          - path: /dev/nvidia-uvm
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth1","network":"vpc1"},
            {"interfaceName":"eth2","network":"vpc2"},
            {"interfaceName":"eth3","network":"vpc3"},
            {"interfaceName":"eth4","network":"vpc4"},
          ]
    
  2. 在 Pod 規格中新增下列欄位:

    spec:
      volumes:
      - name: libraries
        hostPath:
          path: /home/kubernetes/bin/nvidia/lib64
      - name: sys
        hostPath:
          path: /sys
      - name: proc-sys
        hostPath:
          path: /proc/sys
    
  3. 在資訊清單中新增下列容器,即可執行 tcpx-daemon 服務:

    - name: tcpx-daemon
      image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9
      command:
        - /tcpgpudmarxd/build/app/tcpgpudmarxd
        - --gpu_nic_preset
        - a3vm
        - --gpu_shmem_type
        - fd
        - --uds_path
        - /run/tcpx
        - --setup_param
        - \"--verbose 128 2 0 \"
      securityContext:
        capabilities:
            add:
              - NET_ADMIN
      volumeMounts:
        - name: libraries
          mountPath: /usr/local/nvidia/lib64
        - name: tcpx-socket
          mountPath: /run/tcpx
        - name: sys
          mountPath: /hostsysfs
        - name: proc-sys
          mountPath: /hostprocsysfs
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
    
  4. 將下列磁碟區掛接至要求 GPU 的任何容器:

    volumeMounts:
    - name: tcpx-socket
      mountPath: /tmp
    - name: libraries
      mountPath: /usr/local/nvidia/lib64
    
  5. 新增環境變數來設定 NCCL 選項。詳情請參閱本文的「使用建議的 NCCL 設定提升效能」一節。

如需完成的 Pod 規格範例,請參閱 GitHub 上的 nccl-test-latest-autopilot.yaml 資訊清單。

收集 NCCL 偵錯記錄

如要記錄 NCCL 錯誤,建議您新增下列 NCCL 設定:

NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH
NCCL_DEBUG_FILE=/DIRECTORY/FILE_NAME.%h.%p
  • NCCL_DEBUG=INFO:列印偵錯資訊。
    • 對於大規模工作負載 (64 個以上的節點),可能會產生大量記錄。為避免發生這種情況,建議您設定 NCCL_DEBUG=WARN,將記錄限制為僅顯示錯誤,除非您指定 NCCL_DEBUG_FILE
  • NCCL_DEBUG_SUBSYS:篩選 NCCL 收集偵錯資訊的子系統。建議您收集下列子系統的記錄:

    • INIT:NCCL 的初始化階段。
    • NET:NCCL 網路。
    • ENV:NCCL 使用的環境變數。
    • COLL:集體作業。
    • GRAPH:拓撲偵測和圖形搜尋。

    如要收集不同子系統的記錄,請參閱 NCCL 說明文件中的NCCL_DEBUG_SUBSYS,查看可接受的值清單。

  • NCCL_DEBUG_FILE (選用):將 NCCL 偵錯記錄輸出導向您指定的檔案。這個變數會將 NCCL 記錄寫入標準檔案,避免記錄輸出與應用程式輸出混雜。這個變數也會將不同 NCCL 等級的記錄寫入不同檔案,避免記錄混雜。

    請使用下列檔案名稱格式:

    /DIRECTORY/FILE_NAME.%h.%p
    

    更改下列內容:

    • DIRECTORY:要儲存記錄檔的目錄。
    • FILE_NAME:記錄檔的名稱。

    %h 預留位置會解析為節點的主機名稱,而 %p 則會解析為產生記錄的程序的程序 ID (PID)。

如要進一步瞭解如何偵錯 NCCL 記錄,請參閱「排解 GKE 中的 GPU 問題」。

後續步驟