本文說明如何為 GPU 和 TPU 等加速器 VM 使用自動化網路,簡化 Google Kubernetes Engine (GKE) 加速器工作負載的網路設定。在加速器最佳化機器上執行人工智慧 (AI)、機器學習 (ML) 和高效能運算 (HPC) 時,這項功能不可或缺。
本文假設您熟悉 GKE 基本概念、GPU 和 TPU 工作負載,以及 VPC 網路。具體來說,您應熟悉下列項目:
本頁面適用於負責設計及建構貴機構網路的雲端架構師和網路專家。如要查看所有 GKE 說明文件集的總覽,請參閱「探索 GKE 說明文件」。如要進一步瞭解Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
GKE 可簡化在專屬加速器上執行高效能 AI 和機器學習作業的流程。有了加速器 VM 的自動化網路功能,您只要設定一個設定標記,就能啟用高速多重網路連線,這對 RDMA 等通訊協定來說至關重要。這項自動化功能可省去複雜的手動程序,不必為每個節點集區和 Pod 設定多個虛擬私有雲網路、管理 IP 位址範圍,以及設定網路介面。建立節點集區時,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 都會附加至特定 VPC 和子網路。
- 主機網路:節點主要網路介面 (NIC) 使用的主要網路,用於一般叢集通訊,例如控制層流量和一般 Pod 網路。
- 資料網路:專用網路,可在加速器 VM 之間進行高效能資料傳輸。如果是 GPU,這通常是搭配 RDMA 的 GPUDirect VPC。如果是 TPU,這可能是第二個主機網路。
- 遠端直接記憶體存取(RDMA):RDMA 技術可讓網路裝置直接與電腦的主記憶體交換資料,無須作業系統或 CPU 參與。這項功能可大幅縮短延遲時間並提升處理量,對於 HPC 和 ML 工作負載至關重要。
- 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 獨享該介面的完整頻寬和資源,對於效能敏感型工作負載而言,這是一項重要優勢。
限制
- Autopilot 叢集不支援加速器 VM 的自動化網路功能。
- 自動化網路功能需要叢集使用 GKE Dataplane V2。
- 支援的機器類型:A3、A4 和 TPU Trillium (v6e) 加速器最佳化機器系列都支援自動化網路。
- 必須使用單一可用區節點集區:您必須使用單一可用區的節點集區。
- 使用 GKE 管理的 DRANET 設定工作負載時,請參閱 GKE 管理的 DRANET 的重要考量事項和限制。
- 您無法在同一個節點集區中同時使用多重網路 API 和 DRANET。您必須為 Pod 選擇一種網路附加方式。
加速器最佳化機器的網路設定
加速器最佳化機器的網路設定會因類型而異。下表列出各種機器類型的網路規格。
GPU 加速器 VM
| 機型 | GPU 數量 | Titanium NIC 數量 | GPU NIC 數量 | GPUDirect 技術 | 其他虛擬私有雲 |
|---|---|---|---|---|---|
| A3 | 8 (H100) | 1 | 4 | TCPX | GPU NIC 則為 4 個 |
| A3 Mega | 8 (H100) | 1 | 8 | TCPXO | GPU NIC 則為 8 個 |
| A3 Ultra | 8 (H200) | 2 | 8 | RDMA | 2 (第二個 NIC 為 1 個,GPU NIC 為 1 個) |
| A4 | 8 (B200) | 2 | 8 | RDMA | 2 (第二個 NIC 為 1 個,GPU NIC 為 1 個) |
| A4X | 4 (GB200) | 1 | 4 | RDMA | 2 (第二個 NIC 為 1 個,GPU NIC 為 1 個) |
TPU 加速器 VM
| 機型 | TPU 晶片數量 | NIC 數量 | 其他虛擬私有雲 |
|---|---|---|---|
| TPU Trillium (v6e) (ct6e-standard-4t) | 4 | 2 | 2 (第 2 個 NIC 1 個,第 1 個 NIC 上的額外 VNIC 1 個) |
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 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.1829001 以上版本。
確認叢集已啟用 GKE Dataplane V2。建立新叢集或更新現有叢集時,即可啟用這項功能。
建立新叢集:
gcloud container clusters create CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --enable-dataplane-v2更改下列內容:
CLUSTER_NAME:新叢集的名稱。CLUSTER_VERSION:叢集版本,必須為 1.34.1-gke.1829001 以上版本。
更新現有叢集:
gcloud container clusters update CLUSTER_NAME \ --enable-dataplane-v2將
CLUSTER_NAME替換為叢集名稱。
如果您打算部署使用 RDMA 的 GPU 工作負載,請確認
DeviceClass資源是否存在:kubectl get deviceclass mrdma.google.com
建立具有預設網路設定檔的節點集區
如要自動建立網路,連線至單一可用區內的所有 GPU 或 TPU 機器,請使用 auto 加速器網路設定檔建立節點集區。
gcloud
如要建立具有自動設定網路設定檔的節點集區,請執行下列指令:
gcloud beta container node-pools create NODE_POOL_NAME \
--accelerator-network-profile=auto \
--node-locations=ZONE \
--machine-type=MACHINE_TYPE
如要進一步瞭解如何建立含加速器的節點集區,請參閱「在 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。
排定使用 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。
- A4 VM:輸入
ACCELERATOR_COUNT:要附加至節點集區中節點的 GPU 數量。舉例來說,a4-highgpu-8g 和 a3-ultragpu-8g VM 的 GPU 數量都是 8 個。DRIVER_VERSION:要使用的 GPU 驅動程式版本。例如:default或latest。MACHINE_TYPE:節點集區的機器類型,例如a3-ultragpu-8g。NUM_NODES:節點集區的節點數量。如果是彈性開始時間,這個值必須設為 0。RESERVATION_PROJECT:預訂的專案 ID。RESERVATION_NAME:預留項目名稱。如要找出這個值,請參閱「查看未來預留項目要求」。RESERVATION_BLOCK:預留區塊中的特定區塊名稱。如要找出這個值,請參閱「查看未來預留項目要求」。
這項指令會使用加速器網路設定檔,自動為加速器 VM 設定虛擬私有雲網路和子網路。或者,您也可以明確指定虛擬私有雲網路和子網路。
部署工作負載 RDMA 資源
如要為 Pod 分配 RDMA 資源,請指定 ResourceClaimTemplate。
建立
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套用資訊清單:
kubectl apply -f all-mrdma-template.yaml部署工作負載並參照
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套用資訊清單:
kubectl apply -f agnhost-rdma-pod.yaml確認 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 分配網路資源」。
驗證網路 DeviceClass
確認叢集中有 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 節點集區」。
部署工作負載,聲明所有網路裝置
如要為 Pod 分配非 RDMA 網路裝置,請指定 ResourceClaimTemplate。
建立參照
netdev.google.comDeviceClass的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套用資訊清單:
kubectl apply -f all-netdev-template.yaml部署工作負載並參照
ResourceClaimTemplate。以下資訊清單會部署 Pod,並使用all-netdev範本授予 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。
套用資訊清單:
kubectl apply -f netdev-pod.yaml確認 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:叢集名稱。
輸出內容會顯示附加至節點集區的其他網路和子網路。
後續步驟
- 瞭解加速器最佳化機器。
- 瞭解如何使用 DRA 佈建 GPU。
- 瞭解如何為 Pod 設定多網路支援功能。
- 瞭解如何使用 GKE 管理的 DRANET 分配網路資源