GKE 提供單一平台介面,可為貴機構執行各種工作負載,減少管理多個平台的營運負擔。您可以執行高效能分散式預先訓練、模型微調、模型推論、應用程式服務和支援服務等工作負載。
本頁說明如何使用 GPUDirect-TCPX、gVNIC 和多重網路,建立 Google Kubernetes Engine (GKE) Standard 和 Autopilot 叢集。
本頁面適用於機器學習 (ML) 工程師和平台管理員,可協助他們處理 ML 工作負載。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
人工智慧 (AI)、機器學習和高效能運算 (HPC) 應用程式需要強大的加速功能,才能縮短作業完成時間,進而提升效能。舉例來說,著重於對話式 AI 和圖像生成的機器學習模型,需要高擴充性和運算能力。
本頁假設您熟悉網路技術,例如網路介面卡 (NIC) 和 TCP,以及加速器技術,例如 NVIDIA Collective Communications Library (NCCL)。
關於 Google Cloud GPU 超級電腦
Google Cloud 提供加速器最佳化超級電腦,專為可擴充的大型模型而建。這些 GPU 機型的網路頻寬最高可達 3,600 Gbps。
GKE 工作負載必須使用單一節點上的所有可用 GPU 和所有可用次要 NIC,並使用大量可用頻寬。本文所述解決方案專為需要高效能、高處理量和低延遲的工作負載而設計。
可將頻寬發揮到極致的必要功能
如要盡量提高 GPU 超級電腦節點的網路頻寬,請使用下列功能:
- GPUDirect 網路堆疊:A3 Edge 支援三種網路堆疊,可供自訂遠端直接記憶體存取 (RDMA)。A3 Edge 機器使用 GPUDirect-TCPX,可減少將封包酬載傳輸至 GPU 和從 GPU 傳輸封包酬載所需的額外負擔,因此與未使用 GPUDirect 的 GPU 相比,大規模處理量大幅提升。
- gVNIC:啟用 GPUDirect 功能,例如封包標頭分割、流量導向和緩衝區管理。使用 GPUDirect-TCPX 時,必須啟用 gVNIC。如要瞭解 gVNIC 的詳細資訊,請參閱「提高 GPU 節點的網路流量速度」。
您也必須啟用及設定下列功能:
- 多重網路:將次要 NIC 新增至加速器最佳化機器。 每個 NIC 都會與各自 VPC 中的獨立子網路建立關聯,以避免衝突。如要瞭解多網路支援功能,請參閱「為 Pod 設定多網路支援功能」。
- 配置政策:使用資源配置政策,將特定工作負載的所有 GPU 節點放置在實體上相近的伺服器,盡量減少延遲。詳情請參閱「為 GKE 節點定義緊密放置位置」。
程序大綱
如要同時使用 GPUDirect-TCPX、gVNIC、多重網路和密集配置政策,請執行下列操作:
- 建立虛擬私有雲 (VPC) 和子網路
- 建立 GKE 環境
- 安裝 GPUDirect 二進位檔和 NCCL 外掛程式
- 部署 NRI 裝置注入器外掛程式
- 部署測試工作負載,驗證 GPUDirect 設定
- 為自己的工作負載採用 GPUDirect
事前準備
開始之前,請務必先完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 確認您有 A3 Edge VM 的容量。如要取得這項容量,請先從用量方案中選擇。如要按照本頁的說明操作,您可以使用隨需容量、隨需預訂,或最多 90 天的未來預訂 (日曆模式)。選擇用量方案後,請按照相關操作說明,使用所選方案取得容量。
- 請確認您有足夠的 H100 GPU 配額。如要申請更多配額,請參閱「GPU 配額」。
需求條件
GPUDirect-TCPX 須符合下列條件:
標準
- 所有可用的 GKE 子版本都支援 GPUDirect-TCPX,但須使用特定修補程式版本:
- 如果是 GKE 1.30 至 1.33 版,可以使用任何修補程式版本。
- 如果是 GKE 1.34 版,請使用 1.34.5-gke.1153000 以上的修補程式版本。
- 如果是 GKE 1.35 版,請使用 1.35.2-gke.1485000 以上的修補程式版本。
- 如果是 GKE 1.36 以上版本,可以使用任何修補程式版本。
- GKE 節點必須使用 Container-Optimized OS (COS) 節點映像檔。系統不支援 Ubuntu 和 Windows 節點映像檔。
- GPU 節點必須使用 NVIDIA 驅動程式 535 以上版本。
- 您必須使用 GKE Dataplane V2。
- 在 GKE 1.34 以上版本中,您必須使用 3.1.9 以上版本的 GPUDirect-TCPX 安裝程式,以及 2.0.12 以上版本的 GPUDirect-TCPX Sidecar。安裝程式和 Sidecar 版本會一一對應,且必須相符。舉例來說,安裝程式 3.1.12 版對應的 Sidecar 版本為 2.0.15。如要進一步瞭解安裝程式和 Sidecar 版本,請參閱 GPUDirect-TCPX 版本資訊。
- 如要跨多個節點集區執行 GPUDirect-TCPX 工作負載,所有節點集區都必須位於相同的 Compute Engine 區域,且必須使用相同的網路集,例如 VPC 和子網路。
Autopilot
- 如要使用 GPUDirect-TCPX,叢集必須執行下列最低 GKE 修補程式版本:
- 如果是 GKE 1.31 版,請使用 1.31.1-gke.1621000 以上的修補程式版本。
- 如果是 GKE 1.32 至 1.33 版,請使用任何修補程式版本。
- 如果是 GKE 1.34 版,請使用 1.34.5-gke.1153000 以上的修補程式版本。
- 如果是 GKE 1.35 版,請使用 1.35.2-gke.1485000 以上的修補程式版本。
- 如果是 GKE 1.36 以上版本,可以使用任何修補程式版本。
- GPU 節點必須使用 NVIDIA 驅動程式 535 以上版本。
- 您必須使用 GKE Dataplane V2。
- 在 GKE 1.34 以上版本中,您必須使用 GPUDirect-TCPX 安裝程式 3.1.9 以上版本,以及 GPUDirect-TCPX Sidecar 2.0.12 以上版本。安裝程式和 Sidecar 版本會一一對應,且必須相符。舉例來說,安裝程式 3.1.12 版對應的 Sidecar 版本為 2.0.15。如要進一步瞭解安裝程式和 Sidecar 版本,請參閱 GPUDirect-TCPX 版本資訊。
- 如要跨多個節點集區執行 GPUDirect-TCPX 工作負載,所有節點集區都必須位於相同的 Compute Engine 區域,且必須使用相同的網路集,例如 VPC 和子網路。
限制
限制如下:
- GPUDirect-TCPX 不支援多重執行個體 GPU、GPU 分時或 NVIDIA MPS。
- 您無法將 NCCL FastSocket 與 GPUDirect-TCPX 搭配使用。
- GKE 工作負載必須使用單一節點上的所有可用 GPU 和所有可用次要 NIC。單一節點上的多個 Pod 無法使用 GPUDirect-TCPX。
建立虛擬私有雲和子網路
在專案中為要新增至節點的每個虛擬 NIC 建立個別的 VPC 網路。每個虛擬私有雲網路都必須有子網路和防火牆規則,允許內部網路流量。
為充分利用頻寬,建議您建立四個新網路。
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。
確認網路已建立:
gcloud compute networks list
建立 GKE 環境
建立使用多重網路 (搶先版) 的新 GKE 叢集,並建立具有下列特性的 GPU 節點集區:
- 已啟用 gVNIC
- 為每個次要 NIC 指定多重網路子網路
- 搭載 H100 GPU 的 A3 Edge 機器系列,可支援節點
- 已安裝最新版 NVIDIA 驅動程式
您無法更新現有叢集來使用多重網路。
建立叢集:
標準
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更改下列內容:
Autopilot
gcloud beta container clusters create-auto CLUSTER_NAME \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=VERSION \ --enable-multi-networking \ --workload-policies=allow-net-admin更改下列內容:
在叢集中建立與您建立的虛擬私有雲網路和子網路對應的 Network 和 GKENetworkParamSet 資源:
kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc1 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc1 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc2 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc2 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc3 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc3 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc4 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc4 type: Device --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc1 spec: vpc: PREFIX-net-1 vpcSubnet: PREFIX-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PREFIX-net-2 vpcSubnet: PREFIX-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PREFIX-net-3 vpcSubnet: PREFIX-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PREFIX-net-4 vpcSubnet: PREFIX-sub-4 deviceMode: NetDevice EOF這些資源會告知 GKE,以直通模式設定 NIC,處理 GPU 流量。GKE 不會對這類流量套用使用 eBPF 的內建網路程式設計。
建立 GPU 節點集區 (僅限標準叢集)
為 H100 GPU 建立節點集區:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --machine-type=a3-edgegpu-8g \ --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \ --additional-node-network=network=PREFIX-net-1,subnetwork=PREFIX-sub-1 \ --additional-node-network=network=PREFIX-net-2,subnetwork=PREFIX-sub-2 \ --additional-node-network=network=PREFIX-net-3,subnetwork=PREFIX-sub-3 \ --additional-node-network=network=PREFIX-net-4,subnetwork=PREFIX-sub-4 \ --enable-gvnic \ --no-enable-autoupgrade \ --placement-policy=POLICY_NAME \ --reservation-affinity=specific \ --reservation=projects/PROJECT_ID/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME將
NODE_POOL_NAME替換為節點集區的名稱。如要使用預留項目,請使用
--placement-policy、--reservation-affinity和--reservation旗標。指定這些標記,即可在節點集區中設定政策名稱和預訂項目。如果預留項目不需要資源政策,請略過--placement-policy旗標。--reservation-affinity標記可採用specific或any值。不過,對於高效能分散式 AI 工作負載,我們建議使用特定預訂。你可以查看預訂資訊,例如預訂名稱或預訂中的特定區塊名稱。如要找出隨需預留項目的這些值,請查看預留項目清單,或查看未來預留項目要求。如要使用預留項目,請替換下列項目:
PROJECT_ID:(選用) 您的 Google Cloud專案 ID。如果預留項目位於目前專案中 (而非共用預留項目),您可以從預留項目值中省略projects/PROJECT_ID/reservations/。RESERVATION_NAME:預訂名稱。BLOCK_NAME:預留項目中特定區塊的名稱 (選用)。如不想使用特定區塊,請省略/reservationBlocks/BLOCK_NAME。
如果這項指令失敗,可能是因為專案的 H100 GPU 配額不足。請確認您有配額,然後重試指令。
建立節點集區後,請確認每個節點都已附加 GPU:
取得叢集中的節點清單:
kubectl get nodes確認每個 GPU 節點都有八個 GPU:
kubectl describe node NODE_NAME將
NODE_NAME替換為要說明的節點名稱。輸出結果會與下列內容相似:
Capacity: ... nvidia.com/gpu: 8 Allocatable: ... nvidia.com/gpu: 8
安裝 GPUDirect 二進位檔和 NCCL 外掛程式
本節說明如何使用 DaemonSet 安裝 GPUDirect-TCPX 二進位檔和特定 NCCL 程式庫版本。
這個 DaemonSet 會執行下列作業:
- 在節點上安裝 NCCL 程式庫和 GPUDirect-TCPX 二進位檔。
- 將程式庫和二進位檔儲存在 VM 的
/home/kubernetes/bin/nvidia/lib64目錄中。根據預設,GKE 會將這個目錄掛接到需要使用 NCCL 和 GPUDirect-TCPX 的 GPU 容器中的/usr/local/nvidia/lib64路徑。
如要安裝二進位檔並設定 NCCL,請按照下列步驟操作:
標準
部署 DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer.yamlNCCL 外掛程式大約需要兩分鐘才能開始執行。
驗證 DaemonSet Pod 的狀態:
kubectl get pods -n=kube-system -l=name=nccl-tcpx-installer輸出結果會與下列內容相似:
nccl-tcpx-installer-6c2pv 1/1 Running 0 2m11s nccl-tcpx-installer-qgg82 1/1 Running 0 2m11s
Autopilot
查看
nccl-tcpx-installer-autopilot.yamlGitHub 中的 Daemonset 資訊清單。建立專屬命名空間:
kubectl create ns gpudirect-system部署 DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer-autopilot.yamlNCCL 外掛程式大約需要兩分鐘才能開始執行。
部署 NRI 裝置注入器外掛程式
本節說明如何使用 DaemonSet 安裝 NRI 裝置注入器。這個外掛程式會執行下列作業:
- 在搭載 H100 GPU 的節點上啟用節點資源介面 (NRI)。在 GKE 1.29 以上版本中,NRI 預設為啟用。
- 部署 NRI 裝置注入器外掛程式容器,將 GPU 裝置注入 Pod 註解指定的容器。
如要安裝外掛程式,請按照下列步驟操作:
標準
部署 DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector.yamlNCCL 外掛程式大約需要兩分鐘才能開始執行。
驗證 DaemonSet Pod 的狀態:
kubectl get pods -n=kube-system -l=name=device-injector輸出結果會與下列內容相似:
# Output device-injector-md6hb 1/1 Running 0 4h54m device-injector-vh9bm 1/1 Running 0 4h54m
Autopilot
部署 DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector-autopilot.yamlNCCL 外掛程式大約需要兩分鐘才能開始執行。
部署測試工作負載
在本節中,您會部署範例工作負載,確認 NCCL 和 GPUDirect-TCPX 運作正常。這個工作負載範例會執行下列作業:
- 部署兩個 Pod,每個 Pod 都會在具有 H100 GPU 的節點中執行。
- 在每個 Pod 中部署邊車容器,讓這些 Pod 使用 GPUDirect-TCPX。
這項工作負載包含名為 tcpx-daemon 的邊車容器,可執行一項服務,讓 Pod 使用 GPUDirect-TCPX。您必須將這個邊車容器新增至自有環境中需要使用 GPUDirect-TCPX 的任何 Pod。如需在資訊清單中新增必要欄位的程式碼片段,請參閱「在資訊清單中新增 GPUDirect」。
查看 GitHub 中的
nccl-config.yamlConfigMap 資訊清單。 這個資訊清單會部署指令碼,初始化 NCCL 全體收集測試,並設定 NCCL 專屬的設定。請根據叢集模式執行下列操作:
部署 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.yamlAutopilot
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest-autopilot.yaml確認 Pod 正在執行且已準備就緒。請注意,這些圖片很大 (約 5 GB),可能需要幾分鐘才能下載完畢。
kubectl get pods -w指令會監控更新,並在 Pod 狀態變更時列印新行。輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE nccl-test-host-1 0/2 ContainerCreating 0 23s nccl-test-host-2 2/2 Running 0 23s nccl-test-host-1 2/2 Running 0 46s請等待所有 Pod 的
STATUS訊息都顯示為Running,且READY的值為2/2,再繼續下一個步驟。執行下列指令,為節點觸發 NCCL all-gather 測試:
kubectl exec \ --stdin --tty --container=nccl-test nccl-test-host-1 \ -- /configs/allgather.sh nccl-host-1 nccl-host-2輸出結果會與下列內容相似:
標準
# out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 0 0 float none -1 0.24 0.00 0.00 0 0.18 0.00 0.00 0 0 0 float none -1 0.19 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 256 4 float none -1 235.2 0.00 0.00 0 235.1 0.00 0.00 0 512 8 float none -1 241.0 0.00 0.00 0 236.1 0.00 0.00 0 1024 16 float none -1 236.3 0.00 0.00 0 233.3 0.00 0.00 0 2048 32 float none -1 234.1 0.01 0.01 0 233.4 0.01 0.01 0 4096 64 float none -1 237.1 0.02 0.02 0 235.3 0.02 0.02 0 8192 128 float none -1 236.2 0.03 0.03 0 235.2 0.03 0.03 0 16384 256 float none -1 236.6 0.07 0.06 0 238.5 0.07 0.06 0 32768 512 float none -1 237.9 0.14 0.13 0 238.8 0.14 0.13 0 65536 1024 float none -1 242.3 0.27 0.25 0 239.4 0.27 0.26 0 131072 2048 float none -1 263.0 0.50 0.47 0 275.1 0.48 0.45 0 262144 4096 float none -1 279.2 0.94 0.88 0 269.9 0.97 0.91 0 524288 8192 float none -1 273.5 1.92 1.80 0 273.5 1.92 1.80 0 1048576 16384 float none -1 315.1 3.33 3.12 0 314.1 3.34 3.13 0 2097152 32768 float none -1 319.2 6.57 6.16 0 311.5 6.73 6.31 0 4194304 65536 float none -1 331.8 12.64 11.85 0 331.3 12.66 11.87 0 8388608 131072 float none -1 356.3 23.54 22.07 0 353.8 23.71 22.23 0 16777216 262144 float none -1 409.1 41.01 38.45 0 405.2 41.40 38.81 0 33554432 524288 float none -1 451.4 74.34 69.69 0 447.7 74.94 70.26 0 67108864 1048576 float none -1 713.4 94.07 88.19 0 713.8 94.01 88.13 0 134217728 2097152 float none -1 1122.1 119.62 112.14 0 1116.3 120.23 112.72 0 268435456 4194304 float none -1 1785.8 150.32 140.92 0 1769.2 151.72 142.24 0 536870912 8388608 float none -1 2859.7 187.74 176.00 0 2852.6 188.20 176.44 0 1073741824 16777216 float none -1 5494.1 195.44 183.22 0 5568.2 192.83 180.78 0 2147483648 33554432 float none -1 10841 198.09 185.71 0 10798 198.88 186.45 0 4294967296 67108864 float none -1 21453 200.21 187.70 0 21490 199.86 187.37 0 8589934592 134217728 float none -1 42603 201.63 189.03 0 42670 201.31 188.73 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 45.7587 # ```Autopilot
# out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 1048576 16384 float none -1 696.8 1.50 1.41 0 729.0 1.44 1.35 0 2097152 32768 float none -1 776.4 2.70 2.53 0 726.7 2.89 2.71 0 4194304 65536 float none -1 774.3 5.42 5.08 0 805.1 5.21 4.88 0 8388608 131072 float none -1 812.1 10.33 9.68 0 817.6 10.26 9.62 0 16777216 262144 float none -1 1035.2 16.21 15.19 0 1067.8 15.71 14.73 0 33554432 524288 float none -1 1183.3 28.36 26.59 0 1211.8 27.69 25.96 0 67108864 1048576 float none -1 1593.4 42.12 39.49 0 1510.5 44.43 41.65 0 134217728 2097152 float none -1 2127.8 63.08 59.13 0 2312.7 58.03 54.41 0 268435456 4194304 float none -1 3603.0 74.50 69.85 0 3586.2 74.85 70.17 0 536870912 8388608 float none -1 7101.7 75.60 70.87 0 7060.9 76.03 71.28 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 29.8293
為自己的工作負載採用 GPUDirect
確認叢集網路可順利處理範例測試工作負載後,下一步就是為實際工作負載採用 GPUDirect。如要採用 GPUDirect,請更新 NCCL 設定和 Kubernetes Pod 資訊清單。
使用必要的 NCCL 設定來提升效能
下列鍵/值組合是 GPUDirect-TCPX 的必要 NCCL 設定。部署使用 NCCL 的工作負載時,請將這些工作負載設為環境變數,以提升效能。
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64\"",
"NCCL_SOCKET_IFNAME=\"eth0\"",
"NCCL_ALGO=Ring",
"NCCL_PROTO=Simple",
"NCCL_CROSS_NIC=0",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_P2P_PXN_LEVEL=0",
"NCCL_GPUDIRECTTCPX_SOCKET_IFNAME=eth1,eth2,eth3,eth4",
"NCCL_GPUDIRECTTCPX_CTRL_DEV=eth0",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_BUFFSIZE=4194304",
"NCCL_NSOCKS_PERTHREAD=4",
"NCCL_SOCKET_NTHREADS=1",
"NCCL_GPUDIRECTTCPX_TX_BINDINGS=\"eth1:8-21,112-125;eth2:8-21,112-125;eth3:60-73,164-177;eth4:60-73,164-177\"",
"NCCL_GPUDIRECTTCPX_RX_BINDINGS=\"eth1:22-35,126-139;eth2:22-35,126-139;eth3:74-87,178-191;eth4:74-87,178-191\"",
"NCCL_GPUDIRECTTCPX_PROGRAM_FLOW_STEERING_WAIT_MICROS=500000"
在資訊清單中新增 GPUDirect
本節說明必須新增至 Kubernetes 資訊清單的必要欄位,Pod 才能使用 GPUDirect。
視叢集模式而定,請執行下列操作:
標準
在 Pod 中繼資料中新增下列註解。如果沒有這些註解,Pod 就必須使用
hostNetwork:true,而tcpx-daemon容器則必須使用privileged:true。metadata: annotations: devices.gke.io/container.tcpx-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, ]在 Pod 規格中新增下列欄位:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys在資訊清單中新增下列容器,即可執行 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將下列磁碟區掛接至要求 GPU 的任何容器:
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64新增環境變數來設定 NCCL 選項。詳情請參閱本文的「使用建議的 NCCL 設定提升效能」一節。
在每個 GPU 容器中新增下列環境變數:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
如需已完成的 Pod 規格範例,請參閱 GitHub 上的 nccl-test-latest.yaml 資訊清單。
Autopilot
如果是 Autopilot 模式,您也必須在 Pod 資訊清單中選取適當的 GPU,GKE 才會佈建硬體。
在 Pod 中新增下列節點選取器:
nodeSelector:
cloud.google.com/gke-accelerator: a3-edgegpu-8g
cloud.google.com/gke-gpu-driver-version: latest
此外,如要使用預留容量,可以提供預留項目的相關資訊。詳情請參閱「在 Autopilot 叢集中使用容量預留項目」一文中的子章節。
在 Pod 中繼資料中新增下列註解:
metadata: annotations: devices.gke.io/container.tcpx-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, ]在 Pod 規格中新增下列欄位:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys在資訊清單中新增下列容器,即可執行 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將下列磁碟區掛接至要求 GPU 的任何容器:
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64新增環境變數來設定 NCCL 選項。詳情請參閱本文的「使用建議的 NCCL 設定提升效能」一節。
如需完成的 Pod 規格範例,請參閱 GitHub 上的 nccl-test-latest-autopilot.yaml 資訊清單。
收集 NCCL 偵錯記錄
如要記錄 NCCL 錯誤,建議您新增下列 NCCL 設定:
NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH
NCCL_DEBUG_FILE=/DIRECTORY/FILE_NAME.%h.%p
NCCL_DEBUG=INFO:列印偵錯資訊。- 對於大規模工作負載 (64 個以上的節點),可能會產生大量記錄。為避免發生這種情況,建議您設定
NCCL_DEBUG=WARN,將記錄限制為僅顯示錯誤,除非您指定NCCL_DEBUG_FILE。
- 對於大規模工作負載 (64 個以上的節點),可能會產生大量記錄。為避免發生這種情況,建議您設定
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 問題」。
後續步驟
- 如要進一步瞭解如何使用 Topology Aware Scheduling (TAS) 和 Kueue,在 GKE 叢集上安排工作負載時程,請參閱「使用 Topology Aware Scheduling 安排 GKE 工作負載時程」。
- 如要進一步瞭解如何管理與 GKE 叢集和 AI 工作負載相關的常見事件,請參閱「管理 AI 適用 GKE 叢集」。