執行多執行個體 GPU

本頁說明如何執行多實體 GPU,以提高使用率並降低成本。這項設定會將 NVIDIA GB200、B200、H200、H100、A100 或 RTX PRO 6000 圖形處理器 (GPU) 分區,讓 Google Kubernetes Engine (GKE) 中的多個容器共用單一 GPU。

閱讀本頁內容前,請先熟悉 Kubernetes 概念,例如 Pod、節點、部署作業和命名空間,並熟悉 GKE 概念,例如節點集區、自動調度資源和自動佈建。

簡介

即使容器只需要一小部分的 GPU 資源來處理工作負載,Kubernetes 仍會為每個容器分配一個完整的 GPU,這可能會導致資源浪費和成本超支,尤其是使用最新一代的強大 GPU 時。為提升 GPU 使用率,多執行個體 GPU 可讓您將單一支援的 GPU 分割為最多七個配量。每個切片可獨立分配給節點上的一個容器,每個 GPU 最多可分配給七個容器。多重執行個體 GPU 可在工作負載之間提供硬體隔離,並為 GPU 上執行的所有容器提供一致且可預測的服務品質。

對於 CUDA® 應用程式,多執行個體 GPU 大致上是透明的。每個 GPU 分區都會顯示為一般 GPU 資源,程式設計模型則維持不變。

如要進一步瞭解多重執行個體 GPU,請參閱「NVIDIA 多重執行個體 GPU 使用手冊」。

支援的 GPU

下列 GPU 類型支援多執行個體 GPU:

  • NVIDIA GB200 (1.33.0-gke.1636000 以上版本)
  • NVIDIA B200 (180 GB) (1.32.2-gke.1586000 以上版本)
  • NVIDIA H200 (141GB)
  • NVIDIA H100 (80GB)
  • NVIDIA A100 (80GB)
  • NVIDIA A100 (40GB)
  • NVIDIA RTX PRO 6000
    • 無後置字串的分區:1.34.0-gke.1662000 以上版本
    • 有後置字元的分割區:
      • 1.35 以上版本:1.35.3-gke.1389000 以上版本
      • 1.34:1.34.6-gke.1154000 以上版本

多重執行個體 GPU 分區

GB200、B200、H200、H100 和 A100 GPU 各由七個運算單元和八個記憶體單元組成,您可以將這些單元劃分為不同大小的 GPU 執行個體。如要設定 GPU 分區大小,請使用下列語法: [compute]g.[memory]gb。舉例來說,GPU 分割區大小為 1g.5gb,是指具有一個運算單元 (GPU 串流多重處理器 1/7) 和一個記憶體單元 (5 GB) 的 GPU 執行個體。部署 Autopilot 工作負載或建立 Standard 叢集時,可以指定 GPU 的分割區大小。

針對 NVIDIA RTX PRO 6000,GKE 支援表格中列出後置字串的 MIG 設定檔。詳情請參閱 RTX PRO 6000 Blackwell MIG 設定檔。

NVIDIA 多重執行個體 GPU 使用者指南中的分割表列出所有不同的 GPU 分割大小,以及每個 GPU 分割可用的運算和記憶體資源量。表格也會顯示可在 GPU 上建立的每個分割區大小的 GPU 執行個體數量。

下表列出 GKE 支援的分割區大小:

分區大小 GPU 執行個體
GPU:NVIDIA GB200 (nvidia-gb200)
1g.23gb 7
1g.47gb 4
2g.47gb 3
3g.93gb 2
4g.93gb 1
7g.186gb 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: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 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 A100 (80 GB) (nvidia-a100-80gb)
1g.10gb 7
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU:NVIDIA A100 (40 GB) (nvidia-tesla-a100)
1g.5gb 7
2g.10gb 3
3g.20gb 2
7g.40gb 1
GPU:NVIDIA RTX PRO 6000 (nvidia-rtx-pro-6000)
1g.24gb 4
1g.24gb.me 1
1g.24gb.gfx 4
1g.24gb.me.all 1
1g.24gb-me 4
2g.48gb 2
2g.48gb.gfx 2
2g.48gb.me.all 1
2g.48gb-me 2
4g.96gb 1
4g.96gb.gfx 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,請執行下列工作:

  1. 建立啟用多執行個體 GPU 的叢集。
  2. 手動安裝驅動程式。
  3. 確認節點上的 GPU 資源數量。
  4. 使用多執行個體 GPU 部署容器。

定價

多實體 GPU 僅適用於 GB200、B200、H200、H100、A100 和 RTX PRO 6000 GPU,除了執行工作負載所用的其他產品外,還須支付相應的 GPU 費用。您只能將完整 GPU 附加至叢集中的節點,以進行分割。如需 GPU 定價資訊,請參閱「GPU 定價」頁面。

限制

  • 不建議將多執行個體 GPU 分區用於 GKE 中不受信任的工作負載。
  • GKE 1.20.7-gke.400 以上版本完全支援自動調度資源和自動佈建 GPU 分區。在先前的版本中,只有至少有一個節點的節點集區,才能根據工作負載對特定 GPU 分割大小的需求自動調度資源。
  • 多重執行個體 GPU 不提供 GPU 使用率指標 (例如 duty_cycle)。
  • 多實體會將實體 GPU 分割為個別執行個體,每個執行個體都會在硬體層級與其他執行個體隔離。使用多執行個體 GPU 執行個體的容器只能存取該執行個體可用的 CPU 和記憶體資源。
  • 一個 Pod 最多只能使用一個多執行個體 GPU 執行個體。
  • 如果 G4 機型的 GPU 數量少於一,就無法執行多執行個體 GPU。

事前準備

開始之前,請務必先完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。

建立啟用多重執行個體 GPU 的叢集

如果您使用 GKE Standard,必須在叢集中啟用多執行個體 GPU。Autopilot 叢集預設會啟用多執行個體 GPU。如要在 Autopilot 中使用多執行個體 GPU,請參閱本頁的「使用多執行個體 GPU 部署容器」一節。

建立具有多執行個體 GPU 的 Standard 叢集時,您必須指定 gpuPartitionSize、acceleratorType 和 acceleratorCount。acceleratorType 必須是下列其中之一:

  • nvidia-gb200
  • nvidia-b200
  • nvidia-h200-141gb
  • nvidia-h100-80gb
  • nvidia-a100-80gb
  • nvidia-tesla-a100
  • nvidia-rtx-pro-6000

以下範例說明如何建立具有一個節點的 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:專案的 ID。 Google Cloud
  • 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 的叢集,請參閱下列範例:

resource "google_container_cluster" "default" {
  name               = "gke-standard-zonal-gpu"
  location           = "us-central1-a"
  initial_node_count = 1

  node_config {
    guest_accelerator {
      type               = "nvidia-tesla-a100"
      count              = 1
      gpu_partition_size = "1g.5gb"
      gpu_driver_installation_config {
        gpu_driver_version = "LATEST"
      }
    }
    machine_type = "a2-highgpu-1g"
  }
}

如要進一步瞭解如何使用 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 裝置最多可部署一個容器。在這個範例中,節點上提供七個多實體 GPU 分區,分區大小為 1g.5gb。因此,您最多可以在這個節點上部署七個要求 GPU 的容器。

以下範例會啟動 cuda:11.0.3-base-ubi7 容器,並執行 nvidia-smi,在容器中列印 GPU 的 UUID。在這個範例中,有七個容器,每個容器都會收到一個 GPU 分區。這個範例也會將 cloud.google.com/gke-gpu-partition-size 節點選取器設為以具有 1g.5gb GPU 分區的節點為目標。

  1. 將下列範例資訊清單儲存為 cuda-simple.yaml:

    Autopilot

    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
          

    這個資訊清單會執行下列操作:

    • 透過設定 cloud.google.com/gke-accelerator 節點選取器,要求 nvidia-tesla-a100 GPU 類型。
    • 將 GPU 分割為 1g.5gb 分區大小。
    • 設定 cloud.google.com/gke-accelerator-count 節點選取器,將單一 GPU 附加至節點。

    標準

    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
          

    這個資訊清單會執行下列操作:

    • 要求單一 GPU,分區大小為 1g.5gb。
  2. 將範例資訊清單套用至叢集:

    kubectl apply -f cuda-simple.yaml
    
  3. 確認所有七個 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
    
  4. 使用前一個指令中的任一 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)
    

後續步驟