在標準模式叢集中盡量提高 GPU 網路頻寬


本頁面說明如何使用 GPUDirect-TCPXO、GPUDirect-TCPX、gVNIC 和多重網路,在 Google Kubernetes Engine (GKE) Standard 叢集中,盡可能提高高效能 GPU 工作負載的網路頻寬和輸送量。如果您使用 Autopilot 叢集,請參閱「在 Autopilot 模式叢集中盡量提高 GPU 網路頻寬」。

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

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

閱讀本頁內容前,請務必熟悉網路技術,例如網路介面卡 (NIC) 和 TCP,以及加速器技術,例如 NVIDIA Collective Communications Library (NCCL)。

關於 Trusted Cloud GPU 超級電腦

Trusted Cloud 提供專為可擴充的大型模型打造的加速器最佳化超級電腦。這些機器具備下列優點:

  • 每部機器搭載八個 NVIDIA B200、H200 或 H100 GPU。
  • 主要 NIC 的頻寬最高可達 200 Gbps。
  • 次要 NIC (A3 Mega 機器類型最多八個,A3 High 機器類型最多四個),每個 NIC 最多支援 200 Gbps 的頻寬,用於 GPU 資料傳輸。

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

充分運用頻寬所需的特性和功能

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

  • GPUDirect 網路堆疊:A3 系列機器支援三種網路堆疊,可自訂遠端直接記憶體存取 (RDMA):
    • 在 A3 High 機型和 NVIDIA H100 GPU 上,使用 GPUDirect-TCPX 可減少將封包酬載傳輸至 GPU 和從 GPU 傳輸封包酬載所需的額外負擔,與未使用 GPUDirect 的 GPU 相比,這項技術可大幅提升大規模作業的總處理量。
    • 在 A3 Mega 機型和 NVIDIA H100 Mega GPU 上,使用 GPUDirect-TCPXO 可進一步提升 GPU 與 VM 的通訊品質。
    • 在 A3 Ultra 機器類型和 NVIDIA H200 GPU,以及 A4 機器類型和 NVIDIA B200 GPU 上,利用 GPUDirect RDMA 執行分散式 AI 工作負載,進一步提升輸送量。如要開始使用,請建立自訂的 AI 最佳化 GKE 叢集
  • gVNIC:啟用封包標頭分割、流量導向和緩衝區管理等 GPUDirect 功能。使用 GPUDirect-TCPX 或 GPUDirect-TCPXO 時,必須使用 gVNIC。如要瞭解 gVNIC,請參閱「提高 GPU 節點的網路流量速度」。
  • 多重網路:在加速器最佳化機器中新增次要 NIC。每個 NIC 都與各自 VPC 中的獨立子網路相關聯,以避免發生衝突。如要瞭解多網路支援功能,請參閱「為 Pod 設定多網路支援功能」。
  • 配置政策:使用資源配置政策,將特定工作負載的所有 GPU 節點放置在實體上相近的伺服器,以盡量減少延遲。詳情請參閱「為 GKE 節點定義緊密放置位置」。

程序大綱

如要一併使用所有這些功能,請按照下列步驟操作:

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

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。
  • 請確認您有足夠的 H100 GPU 配額。如要申請更多配額,請參閱 GPU 配額

需求條件

除非另有說明,否則下列規定適用於 GPUDirect-TCPX 和 GPUDirect-TCPXO。

  • GKE 1.27 以上版本支援 GPUDirect-TCPX,且須符合下列條件:
    • * a3-highgpu-8g 機器類型。
    • 如果是 GKE 1.27 版,請使用 GKE 修補程式版本 1.27.7-gke.1121000 以上版本。
    • 如果是 GKE 1.28 版,請使用 GKE 修補程式版本 1.28.10-gke.1141000 以上版本。
    • 如果是 GKE 1.29 版,請使用 GKE 修補程式版本 1.29.5-gke.1121000 以上版本。
  • GKE 1.28 以上版本支援 GPUDirect-TCPXO,且必須符合下列條件:

    • a3-megagpu-8g 機器類型。
    • 如果是 GKE 1.28 版,請使用 GKE 修補程式版本 1.28.9-gke.1250000 以上版本。
    • 如果是 GKE 1.29 版,請使用 GKE 修補程式版本 1.29.4-gke.1542000 以上版本。
    • 如果是 GKE 1.30 版,請使用 GKE 修補程式版本 1.30.4-gke.1129000 以上版本。
    • 如果是 GKE 1.31 版,請使用 GKE 修補程式版本 1.31.1-gke.2008000 以上版本。
    • 如果是 GKE 1.32 版,請使用 GKE 修補程式版本 1.32.2-gke.1489001 以上版本。
  • GKE 節點必須使用 Container-Optimized OS (COS) 節點映像檔。不支援 Ubuntu 和 Windows 節點映像檔。

  • GPU 節點必須使用 NVIDIA 驅動程式 535 以上版本。
  • 您必須使用 GKE Dataplane V2。
  • 如要執行跨多個節點集區的 GPUDirect-TCPX 或 GPUDirect-TCPXO 工作負載,所有節點集區都必須位於相同的 Compute Engine 區域,且必須使用相同的網路集,例如 VPC 和子網路。

限制

限制如下:

  • GPUDirect-TCPX 和 GPUDirect-TCPXO 不支援多例項 GPUGPU 時段共用NVIDIA MPS
  • 您無法將 NCCL FastSocket 與 GPUDirect-TCPX 或 GPUDirect-TCPXO 搭配使用。
  • GKE 工作負載必須使用單一節點上的所有可用 GPU 和所有可用次要 NIC。多個 Pod 無法在單一節點上使用 GPUDirect-TCPX 或 GPUDirect-TCPXO。
  • 您只能使用 a3-highgpu-8ga3-megagpu-8g 機器類型。其他 A3 機型則不支援。

建立虛擬私有雲和子網路

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

  1. 在專案中為 GPUDirect 建立虛擬私有雲網路,每個網路都包含子網路和防火牆規則。如果是 A3 High 機型,請選擇「GPUDirect-TCPX」分頁;如果是 A3 Mega 機型,請選擇「GPUDirect-TCPXO」分頁,然後完成下列操作:

    GPUDirect-TCPXO

    為盡量提高頻寬,建議您建立八個新網路。

    for N in $(seq 1 8); 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:您的 Trusted 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

    GPUDirect-TCPX

    為盡量提升頻寬,建議您建立四個新網路。

    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:您的 Trusted 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 指定多重網路子網路
  • A3 系列機器,節點搭載 H100 GPU
  • 已安裝最新版 NVIDIA 驅動程式

您無法更新現有叢集,改用多重網路。

GPUDirect-TCPXO

  1. 選擇支援 GPUDirect-TCPXO 的可用 GKE 版本。 如要列出版本,請執行下列指令:

    gcloud container get-server-config \
        --format="yaml(validMasterVersions)" \
        --region=REGION \
        --project=PROJECT_ID
    

    更改下列內容:

    • REGION:叢集控制層的運算區域
    • PROJECT_ID:您的 Trusted Cloud 專案 ID。
  2. 建立叢集:

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

    更改下列內容:

    • CLUSTER_NAME:新叢集的名稱。
    • VERSION:支援 GPUDirect-TCPXO 的 GKE 版本,如「需求條件」一節所述。
    • ZONE:叢集的運算區域
  3. 在叢集中建立與您建立的虛擬私有雲網路和子網路對應的 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: Network
    metadata:
      name: vpc5
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc5
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc6
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc6
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc7
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc7
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc8
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc8
      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
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc5
    spec:
      vpc: PREFIX-net-5
      vpcSubnet: PREFIX-sub-5
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc6
    spec:
      vpc: PREFIX-net-6
      vpcSubnet: PREFIX-sub-6
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc7
    spec:
      vpc: PREFIX-net-7
      vpcSubnet: PREFIX-sub-7
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc8
    spec:
      vpc: PREFIX-net-8
      vpcSubnet: PREFIX-sub-8
      deviceMode: NetDevice
    EOF
    

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

GPUDirect-TCPX

  1. 建立叢集:

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

    請替換下列項目: * CLUSTER_NAME:新叢集的名稱。 * VERSION:支援 GPUDirect-TCPX 的 GKE 版本,如「需求條件」一節所述。* ZONE:叢集的運算可用區

  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,以直通模式設定 GPU 流量的 NIC。GKE 不會對這類流量套用使用 eBPF 的內建網路程式設計。

建立 GPU 節點集區

GPUDirect-TCPXO

為 H100 GPU 建立節點集區:

gcloud beta container node-pools create NODE_POOL_NAME \
    --zone=ZONE \
    --cluster=CLUSTER_NAME \
    --project=PROJECT_ID \
    --accelerator=type=nvidia-h100-mega-80gb,count=8,gpu-driver-version=LATEST \
    --machine-type=a3-megagpu-8g \
    --num-nodes=2 \
    --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 \
    --additional-node-network network=PREFIX-net-5,subnetwork=PREFIX-sub-5 \
    --additional-node-network network=PREFIX-net-6,subnetwork=PREFIX-sub-6 \
    --additional-node-network network=PREFIX-net-7,subnetwork=PREFIX-sub-7 \
    --additional-node-network network=PREFIX-net-8,subnetwork=PREFIX-sub-8 \
    --enable-gvnic \
    --no-enable-autoupgrade \
    --scopes "https://www.googleapis.com/auth/cloud-platform" \
    [--placement-policy=POLICY_NAME \
    --reservation-affinity=specific \
    --reservation=RESERVATION_NAME \
    --host-maintenance-interval=PERIODIC]

NODE_POOL_NAME 替換為節點集區名稱。

在本範例中,--scopes「https://www.googleapis.com/auth/cloud-platform」 引數會將節點執行個體的範圍設為 cloud-platform,方便測試。在實際工作環境中,您可能會想限制範圍,以設定更精細的憑證。

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

如果這項指令失敗,表示專案的 H100 GPU 配額可能不足。請確認配額充足,然後重試指令。

GPUDirect-TCPX

為 H100 GPU 建立節點集區:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --machine-type=a3-highgpu-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

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

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

建立節點集區後,請確認每個節點都已附加 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

本節說明如何根據 A3 機型 (A3 High 適用的 GPUDirect-TCPX、A3 Mega 適用的 GPUDirect-TCPXO) 和特定 NCCL 程式庫版本,使用 DaemonSet 安裝 GPUDirect 二進位檔。

GPUDirect-TCPXO

這個 DaemonSet 會執行下列作業:

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

如要安裝二進位檔並設定 NCCL,請完成下列步驟:

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

  2. 部署 DaemonSet:

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

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

  3. 驗證 DaemonSet Pod 的狀態:

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

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

    # Output
    nccl-tcpxo-installer-6c2pv                    1/1     Running   0          2m11s
    nccl-tcpxo-installer-qgg82                    1/1     Running   0          2m11s
    

GPUDirect-TCPX

這個 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.yamlGitHub 中的 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
    

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

本節說明如何使用 DaemonSet 安裝 NRI 裝置注入器。這兩種 H100 GPU 機型都會安裝相同的 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
    

部署測試工作負載

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

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

如要部署這個範例工作負載,請按照下列步驟操作:

GPUDirect-TCPXO

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

  1. nccl-test-latest.yaml GitHub 中查看資訊清單

  2. 使用測試工作負載部署兩個 Pod:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-test-latest.yaml
    
  3. Pod 部署完成後,請觸發全體收集測試:

    kubectl exec --stdin --tty --container=nccl-test nccl-test-host-1 -- /scripts/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
    #
    

GPUDirect-TCPX

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

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

  2. 在 GitHub 中查看nccl-test-latest.yaml部署資訊清單

  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
    
  4. 執行下列指令,為節點觸發 NCCL 全體收集測試:

    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)
        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
    

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

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

GPUDirect-TCPXO


"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64\"",
"NCCL_FASTRAK_CTRL_DEV=eth0",
"NCCL_FASTRAK_IFNAME=eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8",
"NCCL_SOCKET_IFNAME=eth0",
"NCCL_CROSS_NIC=0",
"NCCL_ALGO=Ring,Tree",
"NCCL_PROTO=Simple,LL128",
"NCCL_MIN_NCHANNELS=4",
"NCCL_TUNER_PLUGIN=libnccl-tuner.so",
"NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config.textproto",
"NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config.textproto",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_FASTRAK_NUM_FLOWS=2",
"NCCL_FASTRAK_USE_SNAP=1",
"NCCL_FASTRAK_PLUGIN_ACCEPT_TIMEOUT_MS=600000",
"NCCL_FASTRAK_ENABLE_CONTROL_CHANNEL=0",
"NCCL_BUFFSIZE=8388608",
"CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_FASTRAK_ENABLE_HOTPATH_LOGGING=0",
"NCCL_FASTRAK_USE_LLCM=1",
"NCCL_NVLS_ENABLE=0"

或者,您也可以按照下列步驟一次設定所有設定:

  1. 在工作負載容器資訊清單中,將下列鍵/值組合新增為環境變數:

    NCCL_LIB_DIR="/usr/local/nvidia/lib64"
    
  2. 確保工作負載容器啟動時會執行 nccl-env-profile.sh 指令碼。舉例來說,您可以在 Pod 規格中覆寫容器的指令,加入下列內容:

    source ${NCCL_LIB_DIR}/nccl-env-profile.sh
    

支援 LL128

NVIDIA LL128 (低延遲 128) NCCL 通訊協定可大幅提升中小型集合的效能。GPUDirect-TCPXO 支援 LL128 通訊協定。

如要使用 LL128,請確認「安裝 GPUDirect 二進位檔並設定 NCCL」一節中的 nccl-tcpxo-installer.yaml 檔案使用下列容器映像檔版本或更新版本:

us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-
dev:v1.0.8-1

如要設定 LL128,請執行下列操作:

  • 如要使用 us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx- dev:v1.0.8-1 NCCL 外掛程式版本,請按照下列步驟操作:

    1. 在工作負載資訊清單中,設定下列環境變數:

      NCCL_LIB_DIR="/usr/local/nvidia/lib64
      
    2. 設定工作負載,在容器啟動時執行 nccl-env-profile-ll128.sh 指令碼。在工作負載資訊清單中,設定下列指令:

      source ${NCCL_LIB_DIR}/nccl-env-profile-ll128.sh
      

      nccl-env-profile-ll128.sh 指令碼具有下列環境變數:

      NCCL_PROTO=Simple,LL128
      NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config_ll128.textproto
      NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config_ll128.textproto
      
  • 如果是 us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.9-1 NCCL 外掛程式版本和後續版本,LL128 會成為預設參數,因此使用 nccl-env-profile.sh 指令碼或 nccl-env-profile-ll128.sh 指令碼都會啟用 LL128。如要停用 LL128:

    1. 在工作負載資訊清單中,設定下列環境變數:

      NCCL_LIB_DIR="/usr/local/nvidia/lib64
      
    2. 設定工作負載,在容器啟動時執行 nccl-env-profile-ll128.sh 指令碼。在工作負載資訊清單中,設定下列指令:

      source ${NCCL_LIB_DIR}/nccl-env-profile-simple.sh
      

      nccl-env-profile-simple.sh 指令碼具有下列環境變數:

      NCCL_PROTO=Simple
      NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config_simple.textproto
      NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_tuner_config_simple.textproto
      

GPUDirect-TCPX

"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/tcpx/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"

收集 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_FILE,否則建議設定 NCCL_DEBUG=WARN,將記錄檔限制為僅記錄錯誤。
  • 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 問題」。

在資訊清單中新增 GPUDirect

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

請根據 GPUDirect 類型執行下列操作:

GPUDirect-TCPXO

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

    metadata:
      annotations:
        devices.gke.io/container.tcpxo-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
          - path: /dev/dmabuf_import_helper
        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"},
            {"interfaceName":"eth5","network":"vpc5"},
            {"interfaceName":"eth6","network":"vpc6"},
            {"interfaceName":"eth7","network":"vpc7"},
            {"interfaceName":"eth8","network":"vpc8"}
          ]
    
  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
      - name: aperture-devices
        hostPath:
          path: /dev/aperture_devices
    
  3. 在資訊清單中新增下列容器,即可執行 tcpxo-daemon 服務。 將 (TCPXO_DAEMON_IMAGE) 換成最新圖片, us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.17

    - name: tcpxo-daemon
      image: TCPXO_DAEMON_IMAGE
      imagePullPolicy: Always
      command: ["/bin/sh", "-c"]
      args:
        - |
          set -ex
          chmod 755 /fts/entrypoint_rxdm_container.sh
          /fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr
      securityContext:
        capabilities:
          add:
            - NET_ADMIN
            - NET_BIND_SERVICE
      volumeMounts:
        - name: libraries
          mountPath: /usr/local/nvidia
        - name: sys
          mountPath: /hostsysfs
        - name: proc-sys
          mountPath: /hostprocsysfs
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
    
  4. 在每個 GPU 容器中新增下列環境變數:

    env:
    - name: LD_LIBRARY_PATH
      value: /usr/local/nvidia/lib64
    - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY
      value: /dev/aperture_devices
    
  5. 將下列 volumeMounts 新增至每個 GPU 容器。如果沒有 aperture_devices 設定,GPU 容器必須具備 privileged:true

    volumeMounts:
      - name: aperture-devices
        mountPath: /dev/aperture_devices
    
  6. 新增環境變數來設定 NCCL 選項。詳情請參閱「使用建議的 NCCL 設定提升效能」。

完成的 Pod 規格如下所示:

apiVersion: v1
kind: Pod
metadata:
name: a3plus-workloads
annotations:
  devices.gke.io/container.tcpxo-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
    - path: /dev/dmabuf_import_helper
  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"},
      {"interfaceName":"eth5","network":"vpc5"},
      {"interfaceName":"eth6","network":"vpc6"},
      {"interfaceName":"eth7","network":"vpc7"},
      {"interfaceName":"eth8","network":"vpc8"}
    ]
...
containers:
  - name: tcpxo-daemon
    image: TCPXO_DAEMON_IMAGE
    imagePullPolicy: Always
    command: ["/bin/sh", "-c"]
    args:
      - |
        set -ex
        chmod 755 /fts/entrypoint_rxdm_container.sh
        /fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr
    securityContext:
      capabilities:
        add:
          - NET_ADMIN
          - NET_BIND_SERVICE
    volumeMounts:
      - name: libraries
        mountPath: /usr/local/nvidia
      - name: sys
        mountPath: /hostsysfs
      - name: proc-sys
        mountPath: /hostprocsysfs
    env:
      - name: LD_LIBRARY_PATH
        value: /usr/local/nvidia/lib64
  - name: main-application-container
...
   env:
      - name: LD_LIBRARY_PATH
        value: /usr/local/nvidia/lib64
      - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY
        value: /dev/aperture_devices
    securityContext:
    volumeMounts:
      - name: aperture-devices
        mountPath: /dev/aperture_devices
    resources:
      limits:
        nvidia.com/gpu: 8
volumes:
  - name: libraries
    hostPath:
      path: /home/kubernetes/bin/nvidia
  - name: sys
    hostPath:
      path: /sys
  - name: proc-sys
    hostPath:
      path: /proc/sys
  - name: aperture-devices
    hostPath:
      path: /dev/aperture_devices

GPUDirect-TCPX

  1. 在 Pod 中繼資料中新增下列註解。 如果沒有這些註解,Pod 就必須使用 hostNetwork:truetcpx-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 規格如下所示:

apiVersion: v1
kind: Pod
metadata:
name: a3-gpu-workloads-example
labels:
  name: a3-gpu-workloads-example
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"}
    ]
spec:
containers:
  - name: tcpx-daemon
    image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.11
    imagePullPolicy: Always
    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
        readOnly: true
      - 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
  - name: a3-gpu-workloads-example
    ...
    volumeMounts:
      - name: tcpx-socket
        mountPath: /tmp
      - name: libraries
        mountPath: /usr/local/nvidia/lib64
        readOnly: true
    resources:
      limits:
        nvidia.com/gpu: 8
    env:
      - name: LD_LIBRARY_PATH
        value: /usr/local/nvidia/lib64
...
volumes:
  - name: libraries
    hostPath:
      path: /home/kubernetes/bin/nvidia/lib64
  - name: tcpx-socket
    emptyDir:
  - name: sys
    hostPath:
      path: /sys
  - name: proc-sys
    hostPath:
      path: /proc/sys

後續步驟