設定加速器 VM 的自動化網路功能

本文說明如何為 GPU 和 TPU 等加速器 VM 使用自動化網路,簡化 Google Kubernetes Engine (GKE) 加速器工作負載的網路設定。這對於在加速器最佳化機器上執行人工智慧 (AI)、機器學習 (ML) 和高效能運算 (HPC) 至關重要。

本文假設您熟悉 GKE 基本概念、GPU 和 TPU 工作負載,以及虛擬私有雲網路。具體來說,您應熟悉下列項目:

本頁面適用於負責設計及建構組織網路的 Cloud 架構師和網路專家。如要查看所有 GKE 說明文件集的總覽,請參閱「探索 GKE 說明文件」。如要進一步瞭解Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

GKE 可簡化在特殊加速器上執行高效能 AI 和機器學習作業的流程。只要設定單一旗標,即可啟用加速器 VM 的自動化網路功能,提供高速多網路連線,這對 RDMA 等通訊協定至關重要。這項自動化功能可省去複雜程序,無須手動設定多個虛擬私有雲網路、管理 IP 位址範圍,以及為各個節點集區和 Pod 設定網路介面。建立節點集區時,只要使用單一參數,GKE 就會提供所有必要的雲端和 Kubernetes 網路資源。

術語

下列詞彙是瞭解加速器 VM 網路架構的關鍵。

  • 虛擬私有雲 (VPC):VPC 是實體網路的虛擬版本,建構於 Google 的正式環境網路之內。並為 Compute Engine 虛擬機器 (VM) 執行個體、GKE 叢集和其他資源提供連線。
  • Titanium NIC:智慧型 NIC,可卸載 CPU 的網路處理工作,釋出 CPU 資源來處理工作負載。在 GPU 機器上,這些介面會處理所有非 GPU 對 GPU 直接通訊的流量。在 TPU 機器上,所有 NIC 都是 Titanium NIC。
  • 子網路:子網路是較大虛擬私有雲的分段部分。每個子網路都與一個區域相關聯,並有定義的 IP 位址範圍。
  • 網路介面控制器 (NIC):NIC 是虛擬網路介面,可將 VM 執行個體連線至網路。每個 NIC 都會連結至特定的虛擬私有雲和子網路。
  • 主機網路:節點主要網路介面 (NIC) 用於一般叢集通訊的主要網路,例如控制層流量和一般 Pod 網路。
  • 資料網路:專用網路,用於加速器 VM 之間的高效能資料傳輸。如果是 GPU,通常是具備 RDMA 的 GPUDirect 虛擬私有雲。如果是 TPU,這可能是第二個主機網路。
  • 遠端直接記憶體存取(RDMA):RDMA 是一種技術,可讓網路裝置直接與電腦的主記憶體交換資料,不需透過作業系統或 CPU。這項功能可大幅縮短延遲時間並提高處理量,對 HPC 和機器學習工作負載至關重要。
  • NVLink:NVLink 是 NVIDIA 開發的高速互連技術,可在單一節點內連結多個 GPU,讓 GPU 共用記憶體,並共同處理大型資料集。
  • Kubernetes 動態資源分配 (DRA):DRA 是 Kubernetes 的一項功能,可讓 Pod 以更靈活的方式要求及使用資源,例如 GPU 和其他專用硬體。可精細控管資源分配。

自動化網路的運作方式

加速器最佳化機器採用專門的網路架構,可支援 GPU 和 TPU 之間的高處理量、低延遲通訊。每部實體機器都包含多個 GPU 或 TPU,通常透過 NVLink 等高速互連網路連結。這些機器也有一或多個 NIC 用於一般網路,以及多個 GPU NIC 用於高速互連。

建立使用加速器最佳化機器類型的 GKE 節點時,GKE 會在基礎 VM 上設定多個 NIC。主機 NIC 會連線至主機虛擬私有雲網路,用於一般叢集通訊和管理,以便與控制層通訊。GPU NIC 會連線至專屬的高效能虛擬私有雲網路,通常會啟用 RDMA 並設定高 MTU (8896),以利 GPUDirect 通訊。

當 Pod 要求 GPU 或 TPU 時,您可以設定 Pod 存取節點上的高效能網路介面。您可以要求所有可用的 NIC,或特定子集。每個已宣告的網路介面都專屬於單一 Pod,不會共用。這種網路設定可確保 Pod 獨享該介面的完整頻寬和資源,對於效能敏感的工作負載來說,這是一項重要優勢。

限制

  • 叢集必須使用 GKE Dataplane V2,才能自動設定網路。
  • A3、A4 和 TPU Trillium (v6e) 加速器最佳化機器系列,以及 Z4M 儲存空間最佳化機器系列,都支援自動化網路功能。
  • 您必須使用單一可用區的節點集區。
  • 在採用Shared VPC的叢集中,無法使用自動網路功能。
  • 使用 GKE 代管 DRANET 設定工作負載時,請參閱 GKE 代管 DRANET 的考量重點和限制。
  • 您無法在同一個節點集區中同時使用多網路 API 和 DRANET。您必須為 Pod 選擇一種網路連結方法。
  • 如果是區域叢集,啟用加速晶片 VM 網路設定檔時,必須指定目標可用區。如果工作負載橫跨多個可用區,您必須為每個可用區分別啟用網路設定檔。

機器網路設定

加速器最佳化和儲存空間最佳化機器,會因類型而有不同的網路設定。下表匯總各種機器類型的網路規格。

GPU 加速器 VM

機型 GPU 數量 Titanium NIC 數量 GPU NIC 數量 GPUDirect 技術 其他虛擬私有雲
A3 8 (H100) 1 4 TCPX 4 個用於 GPU NIC
A3 Mega 8 (H100) 1 8 TCPXO 8 個用於 GPU NIC
A3 Ultra 8 (H200) 2 8 RDMA 2 (1 個用於第二個 NIC,1 個用於 GPU NIC)
A4 8 (B200) 2 8 RDMA 2 (1 個用於第二個 NIC,1 個用於 GPU NIC)
A4X 4 (GB200) 2 4 RDMA 2 (1 個用於第二個 NIC,1 個用於 GPU NIC)
A4X BM 8 2 8 BM-RDMA 2 (1 個用於第二個 NIC,1 個用於 GPU NIC)

TPU 加速器 VM

機型 TPU 晶片數量 NIC 數量 其他虛擬私有雲
TPU Trillium (v6e) (ct6e-standard-1t) 1 0.25 1
TPU Trillium (v6e) (ct6e-standard-4t) 4 2 2 (1 個用於第 2 個 NIC,1 個用於第 1 個 NIC 的額外 VNIC)
TPU Trillium (v6e) (ct6e-standard-8t) 8 4 4
tpu7x-standard-4t 4 2 2

儲存空間最佳化 VM

在 Z4M 執行個體上,兩個實體 Titanium NIC 支援一般網路流量 (gVNIC),以及最多兩個 IRDMA 虛擬網路介面 (vNIC),用於 Cloud RDMA 通訊。

機型 實體 Titanium NIC 數量 RDMA vNIC 數量 網路技術 其他虛擬私有雲
Z4M (z4m-highmem-192) 2 最多 2 個 (在實體 NIC 上共用) RDMA 2 個用於 RDMA vNIC

事前準備

開始之前,請確認您已執行下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
  • 確認叢集使用 GKE 1.34.1-gke.2037000 以上版本。
  • 如要啟用自動佈建節點和自訂 ComputeClass,請確認叢集使用 GKE 1.35.2-gke.1302000 以上版本。

  • 確認專案中的 GKE 服務帳戶具備 compute.networkAdmin 角色。

  • 確認叢集已啟用 GKE Dataplane V2。只有在 GKE 1.34.1-gke.2037000 以上版本建立新叢集時,才能啟用 GKE Dataplane V2。您無法在該版本之前的叢集上啟用 GKE Dataplane V2。

      gcloud container clusters create CLUSTER_NAME \
        --cluster-version=CLUSTER_VERSION \
        --enable-dataplane-v2
    
  • 如果您打算部署使用 RDMA 的 GPU 或 Z4M 工作負載,請確認 DeviceClass 資源是否存在 (GPU 為 mrdma.google.com,Z4M 為 irdma.google.com):

    kubectl get deviceclass mrdma.google.com
    

設定自動網路

建立節點集區時,您可以指定加速晶片 VM 網路設定檔,啟用自動化網路功能。您也可以為使用自動佈建節點的叢集建立 ComputeClass 資源。

使用預設網路設定檔建立節點集區

如要自動建立網路,連結單一可用區內的所有 GPU 或 TPU 機器,請使用 auto 加速晶片 VM 網路設定檔建立節點集區。

gcloud

如要建立具有自動設定網路設定檔的節點集區,請執行下列指令:

gcloud beta container node-pools create NODE_POOL_NAME \
    --accelerator-network-profile=auto \
    --node-locations=ZONE \
    --machine-type=MACHINE_TYPE

使用 --accelerator-network-profile=auto 旗標建立節點集區時,GKE 會自動將 gke.networks.io/accelerator-network-profile: auto 標籤新增至節點。如要在這些節點上排定工作負載,您必須在工作負載的 nodeSelector 中加入這個標籤。

如要進一步瞭解如何建立含有加速器的節點集區,請參閱「在 Autopilot 節點集區中執行 GPU」和「在 Autopilot 中部署 TPU 工作負載」。按照這些文件的操作說明操作時,請將 --accelerator-network-profile=auto 旗標附加至 gcloud container node-pools create 指令。

如果是多主機 TPU 配量節點集區,您也必須新增 --tpu-topology 旗標。

更改下列內容:

  • NODE_POOL_NAME:新節點集區的名稱。
  • ZONE:節點集區的可用區。
  • MACHINE_TYPE:節點的機器類型,例如 a3-ultragpu-8g。

REST

在對 nodePools.create 方法的要求中,指定 accelerator_network_profile 欄位:

{
  "nodePool": {
    "name": "NODE_POOL_NAME",
    "machineType": "MACHINE_TYPE",
    ...
    "accelerator_network_profile": "auto"
  }
}

更改下列內容:

  • NODE_POOL_NAME:新節點集區的名稱。
  • MACHINE_TYPE:節點的機器類型,例如 a3-ultragpu-8g。

啟用自動佈建節點功能,並啟用自動化網路

如要在 Autopilot 叢集或使用自動佈建節點功能的 Standard 叢集中設定自動網路,請在 ComputeClass 資源中新增 acceleratorNetworkProfile 欄位。

  1. 下列 ComputeClass 資訊清單範例會為 A3 Mega 機器啟用自動網路功能。將下列資訊清單儲存為 anp-compute-class.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: anp-a3-mega-class
    spec:
      autopilot:
        enabled: true
      nodePoolAutoCreation:
        enabled: true
      priorities:
      # Priority 1: A3 Mega in us-central1-a
      - machineType: a3-megagpu-8g
        gpu:
          count: 8
          driverVersion: default
          type: nvidia-h100-mega-80gb
        flexStart:
          enabled: true
        location:
          zones: [us-central1-a]
        acceleratorNetworkProfile: auto
      whenUnsatisfiable: DoNotScaleUp
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f anp-compute-class.yaml
    

部署工作負載並選取這個 ComputeClass 資源時,GKE 會自動為佈建的節點設定必要的網路介面。

排定使用 GPU 的工作負載

下列各節說明如何設定 GPU 節點集區和工作負載,以便透過 GKE 代管的 DRANET 使用 RDMA 網路介面。詳情請參閱「使用 GKE 代管的 DRANET 分配網路資源」。

在 GPU 節點集區啟用 GKE 代管的 DRANET 驅動程式

如要在支援 RDMA 的 GPU 節點集區上啟用 GKE DRANET 驅動程式,請在建立節點集區時新增 cloud.google.com/gke-networking-dra-driver=true 標籤。

gcloud beta container node-pools create NODE_POOL_NAME \
  --region=REGION \
  --cluster=CLUSTER_NAME \
  --node-locations=NODE_LOCATIONS \
  --accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
  --machine-type=MACHINE_TYPE \
  --num-nodes=NUM_NODES \
  --reservation-affinity=specific \
  --reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
  --accelerator-network-profile=auto \
  --node-labels=cloud.google.com/gke-networking-dra-driver=true

更改下列內容:

  • NODE_POOL_NAME:新節點集區的名稱。
  • REGION:叢集的 Google Cloud 區域。
  • CLUSTER_NAME:叢集名稱。
  • ACCELERATOR_TYPE:GPU 加速器類型:

    例如:

    • A4 VM:輸入 nvidia-b200。
    • A3 Ultra VM:輸入 nvidia-h200-141gb。
  • ACCELERATOR_COUNT:要附加至節點集區中節點的 GPU 數量。舉例來說,a4-highgpu-8g 和 a3-ultragpu-8g VM 的 GPU 數量都是 8。

  • DRIVER_VERSION:要使用的 GPU 驅動程式版本。例如:default 或 latest。

  • MACHINE_TYPE:節點集區的機型,例如 a3-ultragpu-8g。

  • NUM_NODES:節點集區的節點數量。如要使用 flex-start,這個值必須設為 0。

  • RESERVATION_PROJECT:預留項目的專案 ID。

  • RESERVATION_NAME:預留項目名稱。如要查看這個值,請參閱「查看未來預留項目要求」。

  • RESERVATION_BLOCK:預留項目中特定區塊的名稱。如要查看這個值,請參閱「查看未來預留項目要求」。

這個指令會使用加速晶片 VM 網路設定檔,自動為加速晶片 VM 設定虛擬私有雲網路和子網路。或者,您也可以明確指定虛擬私有雲網路和子網路。

部署工作負載 RDMA 資源

如要為 Pod 分配 RDMA 資源,請指定 ResourceClaimTemplate。

  1. 建立 ResourceClaimTemplate,定義如何分配 RDMA 裝置。下列資訊清單會要求節點上所有可用的 mrdma 裝置。將資訊清單儲存為 all-mrdma-template.yaml:

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-mrdma
    spec:
      spec:
        devices:
          requests:
          - name: req-mrdma
            exactly:
              deviceClassName: mrdma.google.com
              allocationMode: All
    
  2. 套用資訊清單:

    kubectl apply -f all-mrdma-template.yaml
    
  3. 部署工作負載並參照 ResourceClaimTemplate。下列資訊清單會部署參照 all-mrdma 範本的 Pod,該範本會授予 Pod 存取節點上 RDMA 介面的權限。將資訊清單儲存為 agnhost-rdma-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-rdma
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: rdma
          limits:
            nvidia.com/gpu: 1
      resourceClaims:
      - name: rdma
        resourceClaimTemplateName: all-mrdma
    
  4. 套用資訊清單:

    kubectl apply -f agnhost-rdma-pod.yaml
    
  5. 確認 Pod 內顯示額外分配的網路介面。

    kubectl exec agnhost-rdma -- ls /sys/class/net
    

    以下範例輸出內容顯示預設的 eth0 和 lo 介面,以及分配的 RDMA 介面,例如 gpu0rdma0。網路介面 (NIC) 的數量和名稱會因 GKE 節點的機型而異。

    eth0
    gpu0rdma0
    gpu1rdma0
    gpu2rdma0
    gpu3rdma0
    lo
    

排定使用 TPU 的工作負載

下列各節說明如何設定 TPU 節點集區和工作負載,以便透過 GKE 代管的 DRANET 使用非 RDMA 網路介面。詳情請參閱「使用 GKE 代管的 DRANET 分配網路資源」。

驗證網路 DeviceClasses

確認叢集中有網路的 DeviceClass 資源。

kubectl get deviceclass netdev.google.com

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

NAME                AGE
netdev.google.com   2d22h

在 TPU 切片節點集區啟用 GKE 代管的 DRANET 驅動程式

如要在建立 TPU 配量節點集區時啟用 GKE DRANET 驅動程式,請新增 cloud.google.com/gke-networking-dra-driver=true 標籤。

gcloud beta container node-pools create NODE_POOL_NAME \
    --location=LOCATION \
    --cluster=CLUSTER_NAME \
    --node-locations=NODE_LOCATIONS \
    --machine-type=MACHINE_TYPE \
    --tpu-topology=TPU_TOPOLOGY \
    --num-nodes=NUM_NODES \
    --accelerator-network-profile=auto \
    --node-labels=cloud.google.com/gke-networking-dra-driver=true

更改下列內容:

  • NODE_POOL_NAME:新節點集區的名稱。
  • LOCATION:叢集所在的 Google Cloud 區域或可用區。
  • CLUSTER_NAME:叢集名稱。
  • NODE_LOCATIONS:節點集區中節點的 Google Cloud 可用區。
  • MACHINE_TYPE::節點使用的機器類型。 如要進一步瞭解與 TPU 相容的機型,請參閱「選擇 TPU 版本」。
  • TPU_TOPOLOGY:TPU 拓撲,例如 2x4x4。拓撲格式取決於 TPU 版本。如要進一步瞭解 TPU 拓撲,請參閱「選擇拓撲」。
  • NUM_NODES:節點集區中的節點數量。

詳情請參閱「建立單一主機 TPU slice 節點集區」。

部署工作負載,宣告所有網路裝置

如要為 Pod 分配非 RDMA 網路裝置,請指定 ResourceClaimTemplate。

  1. 建立參照 netdev.google.com DeviceClass 的 ResourceClaimTemplate。下列資訊清單會要求節點上所有可用的非 RDMA 網路裝置。

    將資訊清單儲存為 all-netdev-template.yaml:

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-netdev
    spec:
      spec:
        devices:
          requests:
          - name: req-netdev
            exactly:
              deviceClassName: netdev.google.com
              allocationMode: All
    
  2. 套用資訊清單:

    kubectl apply -f all-netdev-template.yaml
    
  3. 部署工作負載並參照 ResourceClaimTemplate。下列資訊清單會部署使用 all-netdev 範本的 Pod,將 Pod 存取權授予節點上的所有非 RDMA 網路裝置。將資訊清單儲存為 netdev-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-netdev
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: netdev
          limits:
            google.com/tpu: 4
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR
        cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
      resourceClaims:
      - name: netdev
        resourceClaimTemplateName: all-netdev
    

    更改下列內容:

    • TPU_ACCELERATOR:TPU 加速器類型,例如 tpu-v5p-slice。
    • TPU_TOPOLOGY:TPU 拓撲,例如 2x4x4。
  4. 套用資訊清單:

    kubectl apply -f netdev-pod.yaml
    
  5. 確認 Pod 內顯示額外分配的網路介面。

    kubectl exec agnhost-netdev -- ls /sys/class/net
    

    以下範例輸出內容顯示預設的 eth0 和 lo 介面,以及分配的網路裝置,名稱類似 eth1 和 eth2。NIC 的數量和名稱會因 GKE 節點的機器類型而異。

    eth0
    eth1
    eth2
    lo
    

疑難排解

如要檢查節點集區的網路設定,請執行下列指令:

gcloud beta container node-pools describe NODE_POOL_NAME \
    --zone=ZONE \
    --cluster=CLUSTER_NAME

更改下列內容:

  • NODE_POOL_NAME:節點集區的名稱。
  • ZONE:節點集區的可用區。
  • CLUSTER_NAME:叢集名稱。

輸出內容會顯示附加至節點集區的其他網路和子網路。

後續步驟