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

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

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

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

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

關於 Google Cloud GPU 超級電腦

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

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

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 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
  • 確認您有 A3 Mega 或 A3 High VM 的容量。如要取得這項容量,請先選擇用量選項。如要按照本頁的指示操作,可以使用隨選容量、隨選預訂、未來預訂,或最多 90 天的未來預訂 (日曆模式)。選擇用量方案後,請按照相關操作說明,使用所選方案取得容量。
  • 請確認您有足夠的 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.30 至 1.33 版,可以使用任何修補程式版本。
    • 請勿使用 GKE 1.34 以上版本。詳情請參閱「GPUDirect-TCPX is unavailable with A3 High for GKE version 1.34 and later」(GPUDirect-TCPX 無法搭配 GKE 1.34 以上版本使用 A3 High) 已知問題。
  • 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:您的 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

    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:您的 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 指定多重網路子網路
  • 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:您的 Google Cloud 專案 ID。
  2. 建立叢集:

    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:新叢集的名稱。
    • VERSION:支援 GPUDirect-TCPXO 的 GKE 版本,如「需求條件」一節所述。
    • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。如果是地區叢集,請提供區域;如果是區域叢集,請提供可用區。
  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 \
      --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 版本,如「需求條件」一節所述。
  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 \
    --location=CONTROL_PLANE_LOCATION \
    --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=projects/PROJECT_ID/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME \
    --host-maintenance-interval=PERIODIC]

NODE_POOL_NAME 替換為節點集區名稱。

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

如要使用預留項目,請使用 --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 配額可能不足。請確認您有配額,然後重試指令。

GPUDirect-TCPX

為 H100 GPU 建立節點集區:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_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 [\
    --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 配額可能不足。請確認您有配額,然後重試指令。

建立節點集區後,請確認每個節點都已附加 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 會將這個目錄掛接到 GPU 容器的 /usr/local/nvidia/lib64 路徑,這些容器需要使用 NCCL 和 GPUDirect-TCPXO。

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

  1. 查看 nccl-tcpxo-installer.yamlGitHub 中的 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.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
    

部署 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. 查看 nccl-test-latest.yaml GitHub 中的部署資訊清單

  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/lib64
        - 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/lib64
      - 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

後續步驟