本頁面提供相關操作說明,協助您執行多執行個體 GPU,進而提高使用率並降低成本。透過這項設定,您可以分割 NVIDIA A100、H100、H200 或 B200 圖形處理單元 (GPU),讓 Google Kubernetes Engine (GKE) 上的多個容器共用一部 GPU。
閱讀本頁內容前,請務必熟悉 Kubernetes 概念,例如 Pod、節點、部署作業和命名空間,並熟悉 GKE 概念,例如節點集區、自動調度資源和自動佈建。
簡介
即使容器只需要部分 GPU 資源來處理工作負載,Kubernetes 仍會為每個容器分配一個完整的 GPU,這可能會導致資源浪費和成本超支,尤其是在使用最新一代強大 GPU 時。為提高 GPU 使用率,多執行個體 GPU 可讓您將單一支援的 GPU 分割成最多七個切片。每個 GPU 最多可分配給七個容器,每個容器可獨立分配到一個 GPU 區塊。多執行個體 GPU 可在工作負載之間提供硬體隔離,並為 GPU 上執行的所有容器提供一致且可預測的服務品質。
對於 CUDA® 應用程式,多執行個體 GPU 大致上是透明的。每個 GPU 分區都會顯示為一般 GPU 資源,程式設計模型則維持不變。
如要進一步瞭解多執行個體 GPU,請參閱 NVIDIA 多執行個體 GPU 使用者指南。
支援的 GPU
下列 GPU 類型支援多執行個體 GPU:
- NVIDIA A100 (40GB)
- NVIDIA A100 (80GB)
- NVIDIA H100 (80GB)
- NVIDIA H200 (141GB)
- NVIDIA B200 (180 GB) (1.32.2-gke.1586000 以上版本)
多執行個體 GPU 分區
A100、H100、H200 和 B200 GPU 各有七個運算單元和八個記憶體單元,您可以將這些單元劃分為不同大小的 GPU 執行個體。如要設定 GPU 分割大小,請使用下列語法:
[compute]g.[memory]gb
。舉例來說,GPU 分割區大小為 1g.5gb
,是指具有一個運算單元 (GPU 上串流多重處理器的 1/7) 和一個記憶體單元 (5 GB) 的 GPU 執行個體。部署 Autopilot 工作負載或建立標準叢集時,可以指定 GPU 的分割區大小。
NVIDIA 多重執行個體 GPU 使用者指南中的分割表列出所有不同的 GPU 分割大小,以及每個 GPU 分割可用的運算和記憶體資源量。表格也會顯示可在 GPU 上建立的各個分割區大小的 GPU 執行個體數量。
下表列出 GKE 支援的分區大小:
分區大小 | GPU 執行個體 |
---|---|
GPU:NVIDIA A100 (40 GB) (nvidia-tesla-a100 ) |
|
1g.5gb |
7 |
2g.10gb |
3 |
3g.20gb |
2 |
7g.40gb |
1 |
GPU:NVIDIA A100 (80 GB) (nvidia-a100-80gb ) |
|
1g.10gb |
7 |
2g.20gb |
3 |
3g.40gb |
2 |
7g.80gb |
1 |
GPU:NVIDIA H100 (80 GB) (nvidia-h100-80gb 和 nvidia-h100-mega-80gb ) |
|
1g.10gb |
7 |
1g.20gb |
4 |
2g.20gb |
3 |
3g.40gb |
2 |
7g.80gb |
1 |
GPU:NVIDIA H200 (141 GB) (nvidia-h200-141gb ) |
|
1g.18gb |
7 |
1g.35gb |
4 |
2g.35gb |
3 |
3g.71gb |
2 |
4g.71gb |
1 |
7g.141gb |
1 |
GPU:NVIDIA B200 (nvidia-b200 ) |
|
1g.23gb |
7 |
1g.45gb |
4 |
2g.45gb |
3 |
3g.90gb |
2 |
4g.90gb |
1 |
7g.180gb |
1 |
節點集區中每個節點上的每個 GPU,都會以相同方式分割。舉例來說,假設節點集區有兩個節點,每個節點有四個 GPU,且分割區大小為 1g.5gb
。GKE 會在每個 GPU 上建立七個大小為 1g.5gb
的分割區。由於每個節點有四個 GPU,因此每個節點有 28 個 1g.5gb
GPU 分區。由於節點集區中有兩個節點,因此整個節點集區共有 56 個 1g.5gb
GPU 分區。
如要建立具有多種 GPU 分割類型的 GKE Standard 叢集,您必須建立多個節點集區。舉例來說,如要在叢集中使用 1g.5gb
和 3g.20gb
GPU 分割區的節點,您必須建立兩個節點集區:一個將 GPU 分割區大小設為 1g.5gb
,另一個則設為 3g.20gb
。
建立需要不同分割區大小的工作負載時,GKE Autopilot 叢集會自動建立具有正確分割區設定的節點。
每個節點都會標示節點上可用的 GPU 分區大小。工作負載可透過這個標籤,指定具有所需 GPU 分割大小的節點。舉例來說,在具有 1g.5gb
個 GPU 執行個體的節點上,節點會標示為:
cloud.google.com/gke-gpu-partition-size=1g.5gb
運作方式
如要使用多執行個體 GPU,請執行下列工作:
定價
多重執行個體 GPU 僅適用於 A100 GPU、H100 GPU、H200 GPU 和 B200 GPU,且除了用於執行工作負載的任何其他產品外,還須支付相應的 GPU 費用。您只能將整個 GPU 附加至叢集中的節點,以進行分割。如需 GPU 定價資訊,請參閱 GPU 定價頁面。
限制
- 不建議將多執行個體 GPU 分區搭配 GKE,用於不受信任的工作負載。
- GKE 1.20.7-gke.400 以上版本完全支援自動調整資源和自動佈建 GPU 分區。在舊版中,只有至少有一個節點的節點集區,才能根據工作負載對特定 GPU 分割大小的需求自動調度資源。
- 多執行個體 GPU 不支援 GPU 使用率指標 (例如
duty_cycle
)。 - 多執行個體會將實體 GPU 分成獨立執行個體,每個執行個體都會在硬體層級與其他執行個體隔離。使用多執行個體 GPU 執行個體的容器只能存取該執行個體可用的 CPU 和記憶體資源。
- 一個 Pod 最多只能使用一個多執行個體 GPU 執行個體。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
- 在 Autopilot 中,GKE 1.29.3-gke.1093000 以上版本支援多執行個體 GPU。
- 您必須有足夠的 NVIDIA A100 GPU 配額。請參閱「要求增加配額」。
- 如要在 Autopilot 中使用多執行個體 GPU,請參閱「在 Autopilot 中部署 GPU 工作負載」,進一步瞭解如何在 Autopilot 中使用 GPU。
- GKE 會將
Accelerator
運算級別指派給 Autopilot 叢集中的所有多執行個體 GPU 工作負載。
建立啟用多執行個體 GPU 的叢集
如果您使用 GKE Standard,則必須在叢集中啟用多例項 GPU。執行 1.29.3-gke.1093000 以上版本的 Autopilot 叢集,預設會啟用多執行個體 GPU。如要在 Autopilot 中使用多執行個體 GPU,請參閱本頁的「使用多執行個體 GPU 部署容器」一節。
建立具有多個執行個體 GPU 的標準叢集時,您必須指定 gpuPartitionSize
,以及 acceleratorType
和 acceleratorCount
。acceleratorType
必須是 nvidia-tesla-a100
、nvidia-a100-80gb
、nvidia-h100-80gb
、nvidia-h200-141gb
或 nvidia-b200
。
下列範例說明如何建立含有一個節點的 GKE 叢集,以及節點上七個大小為 1g.5gb
的 GPU 分割區。本頁的其他步驟使用 1g.5gb
的 GPU 分割區大小,這會在每個 GPU 上建立七個分割區。您也可以使用先前提及的任何支援 GPU 分割大小。
您可以使用 Google Cloud CLI 或 Terraform。
gcloud
建立啟用多執行個體 GPU 的叢集:
gcloud container clusters create CLUSTER_NAME \
--project=PROJECT_ID \
--location CONTROL_PLANE_LOCATION \
--cluster-version=CLUSTER_VERSION \
--accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb,gpu-driver-version=DRIVER_VERSION \
--machine-type=a2-highgpu-1g \
--num-nodes=1
更改下列內容:
CLUSTER_NAME
:新叢集的名稱。PROJECT_ID
:您的 Google Cloud 專案 ID。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。CLUSTER_VERSION
:版本必須為1.19.7-gke.2503
以上。DRIVER_VERSION
:要安裝的 NVIDIA 驅動程式版本。可以是下列任一值:default
:安裝 GKE 版本的預設驅動程式版本。latest
:為 GKE 版本安裝最新可用的驅動程式版本。僅適用於使用 Container-Optimized OS 的節點。disabled
:略過自動安裝驅動程式。建立叢集後,您必須 手動安裝驅動程式。如果省略gpu-driver-version
,系統會預設使用這個選項。
Terraform
如要使用 Terraform 建立啟用多執行個體 GPU 的叢集,請參閱下列範例:
如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。
連線至叢集
設定 kubectl
以連線至新建立的叢集:
gcloud container clusters get-credentials CLUSTER_NAME
安裝驅動程式
如果在建立叢集時選擇停用自動安裝驅動程式,或是執行 1.27.2-gke.1200 之前的 GKE 版本,則必須在建立完成後手動安裝相容的 NVIDIA 驅動程式。多重執行個體 GPU 需要 NVIDIA 驅動程式 450.80.02 以上版本。
安裝驅動程式後,系統會啟用多執行個體 GPU 模式。如果您自動安裝驅動程式,節點會在 GPU 裝置外掛程式開始建立 GPU 分割區時重新啟動。如果您手動安裝驅動程式,節點會在驅動程式安裝完成時重新啟動。重新啟動程序可能需要幾分鐘才能完成。
確認節點上的 GPU 資源數量
執行下列指令,確認 nvidia.com/gpu
資源的容量和可分配數量為 7:
kubectl describe nodes
以下是指令的輸出內容:
...
Capacity:
...
nvidia.com/gpu: 7
Allocatable:
...
nvidia.com/gpu: 7
使用多執行個體 GPU 部署容器
節點上每個多例項 GPU 裝置最多可部署一個容器。在這個範例中,如果分割區大小為 1g.5gb
,節點上會有七個多例項 GPU 分割區。因此,您可以在這個節點上部署最多七個要求 GPU 的容器。
以下範例會啟動
cuda:11.0.3-base-ubi7
容器,並執行nvidia-smi
,在容器中列印 GPU 的 UUID。在這個範例中,有七個容器,每個容器都會收到一個 GPU 分區。這個範例也會將cloud.google.com/gke-gpu-partition-size
節點選取器設為以具有1g.5gb
GPU 分區的節點為目標。Autopilot
kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: cuda-simple spec: replicas: 7 selector: matchLabels: app: cuda-simple template: metadata: labels: app: cuda-simple spec: nodeSelector: cloud.google.com/gke-gpu-partition-size: 1g.5gb cloud.google.com/gke-accelerator: nvidia-tesla-a100 cloud.google.com/gke-accelerator-count: "1" containers: - name: cuda-simple image: nvidia/cuda:11.0.3-base-ubi7 command: - bash - -c - | /usr/local/nvidia/bin/nvidia-smi -L; sleep 300 resources: limits: nvidia.com/gpu: 1 EOF
這個資訊清單會執行下列操作:
- 透過設定
cloud.google.com/gke-accelerator
節點選取器,要求nvidia-tesla-a100
GPU 類型。 - 將 GPU 分割為
1g.5gb
分區大小。 - 設定
cloud.google.com/gke-accelerator-count
節點選取器,將單一 GPU 附加至節點。
標準
kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: cuda-simple spec: replicas: 7 selector: matchLabels: app: cuda-simple template: metadata: labels: app: cuda-simple spec: nodeSelector: cloud.google.com/gke-gpu-partition-size: 1g.5gb containers: - name: cuda-simple image: nvidia/cuda:11.0.3-base-ubi7 command: - bash - -c - | /usr/local/nvidia/bin/nvidia-smi -L; sleep 300 resources: limits: nvidia.com/gpu: 1 EOF
這個資訊清單會執行下列操作:
- 要求單一 GPU,分割區大小為
1g.5gb
。
- 透過設定
確認所有七個 Pod 都在執行中:
kubectl get pods
以下是指令的輸出內容:
NAME READY STATUS RESTARTS AGE cuda-simple-849c47f6f6-4twr2 1/1 Running 0 7s cuda-simple-849c47f6f6-8cjrb 1/1 Running 0 7s cuda-simple-849c47f6f6-cfp2s 1/1 Running 0 7s cuda-simple-849c47f6f6-dts6g 1/1 Running 0 7s cuda-simple-849c47f6f6-fk2bs 1/1 Running 0 7s cuda-simple-849c47f6f6-kcv52 1/1 Running 0 7s cuda-simple-849c47f6f6-pjljc 1/1 Running 0 7s
使用上一個指令中任一 Pod 的名稱,查看記錄中的 GPU UUID:
kubectl logs cuda-simple-849c47f6f6-4twr2
以下是指令的輸出內容:
GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1) MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
後續步驟
- 進一步瞭解 GPU。
- 瞭解如何設定 GPU 的分時功能。
- 進一步瞭解叢集多用戶群架構。
- 進一步瞭解企業多用戶群的最佳做法。