透過 GPU 分時功能在工作負載之間共用 GPU


本頁面說明如何讓多個工作負載分時共用 Google Kubernetes Engine (GKE) 節點中的單一 NVIDIA® GPU 硬體加速器。在 GKE 中使用 GPU 分時功能,可更有效率地運用附加的 GPU,並節省執行費用。

本頁面適用於在 GKE 叢集上設計及部署工作負載的開發人員,以及建立及管理 GKE 叢集、規劃基礎架構和資源需求,以及監控叢集效能的管理員和架構師。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作

閱讀本頁內容前,請先熟悉GKE 的分時運作方式,包括限制和應使用 GPU 分時的情況。

需求條件

  • GKE 版本:您可以在執行 GKE 1.23.7-gke.1400 以上版本的 GKE Standard 叢集上啟用 GPU 分時功能。在執行 GKE 1.29.3-gke.1093000 以上版本的 GKE Autopilot 叢集上,您可以使用 GPU 分時功能。
  • GPU 類型:您可以在所有 NVIDIA GPU 型號上啟用 GPU 時段共用功能。

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

在 GKE 叢集和節點集區中啟用 GPU 分時功能

平台管理員必須先在 GKE Standard 叢集上啟用 GPU 分時功能,開發人員才能部署工作負載來使用 GPU。如要啟用 GPU 時段共用功能,請完成下列步驟:

  1. 在 GKE 叢集上啟用 GPU 時分功能
  2. 安裝 NVIDIA GPU 裝置驅動程式 (如有需要)
  3. 確認節點上可用的 GPU 資源

執行 1.29.3-gke.1093000 以上版本的 Autopilot 叢集,預設會啟用 GPU 分時功能。Autopilot 叢集的時間分享功能是在工作負載規格中設定。詳情請參閱「部署使用分時 GPU 的工作負載」一節。

在 GKE Standard 叢集上啟用 GPU 時段共用功能

建立 GKE Standard 叢集時,您可以啟用 GPU 時段共用功能。叢集中的預設節點集區已啟用這項功能。在該叢集中手動建立新節點集區時,您仍須啟用 GPU 時段共用功能。

gcloud container clusters create CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=MACHINE_TYPE \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

更改下列內容:

  • CLUSTER_NAME:新叢集的名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
  • CLUSTER_VERSION:叢集控制層和節點的 GKE 版本。使用 GKE 1.23.7-gke.1400 以上版本。或者,您也可以使用 --release-channel=RELEASE_CHANNEL 標記,指定包含該 GKE 版本的發布管道
  • MACHINE_TYPE:節點的 Compute Engine 機器類型。建議選取加速器最佳化機器類型
  • GPU_TYPE:GPU 類型,必須是 NVIDIA GPU 平台,例如 nvidia-tesla-v100
  • GPU_QUANTITY:要附加至預設節點集區中每個節點的實體 GPU 數量。
  • CLIENTS_PER_GPU:可共用每個實體 GPU 的容器數量上限。
  • DRIVER_VERSION:要安裝的 NVIDIA 驅動程式版本。可以是下列任一值:
    • default:安裝 GKE 版本的預設驅動程式版本。
    • latest:為 GKE 版本安裝最新可用的驅動程式版本。僅適用於使用 Container-Optimized OS 的節點。
    • disabled:略過自動安裝驅動程式。建立節點集區後,您必須 手動安裝驅動程式。如果省略 gpu-driver-version,系統會預設使用這個選項。

在 GKE 節點集區中啟用 GPU 分時功能

在 GKE 叢集中手動建立新節點集區時,可以啟用 GPU 時段共用功能。

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --machine-type=MACHINE_TYPE \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

更改下列內容:

  • NODEPOOL_NAME:新節點集區的名稱。
  • :叢集名稱,必須執行 GKE 1.23.7-gke.1400 以上版本。CLUSTER_NAME
  • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
  • MACHINE_TYPE:節點的 Compute Engine 機器類型。建議選取加速器最佳化機器類型
  • GPU_TYPE:GPU 類型,必須是 NVIDIA GPU 平台,例如 nvidia-tesla-v100
  • GPU_QUANTITY:要附加至節點集區中每個節點的實體 GPU 數量。
  • CLIENTS_PER_GPU:可共用每個實體 GPU 的容器數量上限。
  • DRIVER_VERSION:要安裝的 NVIDIA 驅動程式版本。可以是下列任一值:

    • default:安裝 GKE 版本的預設驅動程式版本。
    • latest:為 GKE 版本安裝最新可用的驅動程式版本。僅適用於使用 Container-Optimized OS 的節點。
    • disabled:略過自動安裝驅動程式。建立節點集區後,您必須 手動安裝驅動程式。如果省略 gpu-driver-version,系統會預設使用這個選項。

安裝 NVIDIA GPU 裝置驅動程式

請先執行下列指令,連線至叢集,再繼續操作:

gcloud container clusters get-credentials CLUSTER_NAME

如果在建立叢集時選擇停用自動安裝驅動程式,或是使用 1.27.2-gke.1200 之前的 GKE 版本,則必須手動安裝相容的 NVIDIA 驅動程式,才能管理實體 GPU 的 GPU 時段共用分割。如要安裝驅動程式,請部署 GKE 安裝 DaemonSet,設定驅動程式。

如需操作說明,請參閱「安裝 NVIDIA GPU 裝置驅動程式」。

如果您打算在叢集中使用節點自動佈建功能,也必須使用允許 GKE 為您安裝 GPU 裝置驅動程式的範圍,設定節點自動佈建功能。如需操作說明,請參閱「搭配 GPU 使用節點自動佈建功能」。

確認節點上可用的 GPU 資源

如要確認節點中顯示的 GPU 數量與啟用 GPU 時分時指定的數量相符,請說明節點:

kubectl describe nodes NODE_NAME

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

...
Capacity:
  ...
  nvidia.com/gpu:             3
Allocatable:
  ...
  nvidia.com/gpu:             3

在這個輸出範例中,節點上的 GPU 資源數量為 3,因為為 max-shared-clients-per-gpu 指定的值是 3,而要附加至節點的實體 GPU count 數量為 1。舉例來說,如果實體 GPU 的 count2,輸出內容會顯示 6 個可分配的 GPU 資源,每個實體 GPU 上有三個。

部署使用 GPU 分時功能的工作負載

應用程式運算子部署 GPU 工作負載時,可以在資訊清單的 nodeSelector 中指定適當的節點標籤,選取已啟用 GPU 時段共用的節點。規劃要求時,請先查看要求限制,確保 GKE 不會拒絕部署作業。

如要部署工作負載以使用 GPU 分時,請完成下列步驟:

  1. 在工作負載資訊清單中,為下列標籤新增 nodeSelector

    • cloud.google.com/gke-gpu-sharing-strategy: time-sharing:選取使用 GPU 分時的節點。
    • cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU":選取允許特定數量的容器共用基礎 GPU 的節點。
  2. spec.containers.resources.limits 中,將 nvidia.com/gpu=1 GPU 資源要求新增至容器規格。

舉例來說,下列步驟說明如何將三個 Pod 部署至 GPU 時段共用節點集區。GKE 會將每個容器分配到同一個實體 GPU。容器會列印附加至該容器的 GPU UUID。

  1. 將下列資訊清單儲存為 gpu-timeshare.yaml

Autopilot

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: cuda-simple
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: cuda-simple
          template:
            metadata:
              labels:
                app: cuda-simple
            spec:
              nodeSelector:
                cloud.google.com/gke-accelerator: "GPU_TYPE"
                cloud.google.com/gke-gpu-sharing-strategy: "time-sharing"
                cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
                cloud.google.com/gke-accelerator-count: "GPU_COUNT"
              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_TYPE:GPU 類型。
  • CLIENTS_PER_GPU:使用這個 GPU 的工作負載數量。本範例使用的是 3
  • GPU_COUNT:要附加至節點的實體 GPU 數量。本範例使用的是 1

標準

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: cuda-simple
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: cuda-simple
          template:
            metadata:
              labels:
                app: cuda-simple
            spec:
              nodeSelector:
                cloud.google.com/gke-gpu-sharing-strategy: "SHARING_STRATEGY"
                cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
              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
      

更改下列內容:

  • SHARING_STRATEGY,並選取「分時」,即可要求 GPU 分時。
  • CLIENTS_PER_GPU:將使用這個 GPU 的工作負載數量。本範例使用的是 3
  1. 套用資訊清單:

    kubectl apply -f gpu-timeshare.yaml
    
  2. 確認所有 Pod 都在執行中:

    kubectl get pods -l=app=cuda-simple
    
  3. 檢查任何 Pod 的記錄,即可查看 GPU 的 UUID:

    kubectl logs POD_NAME
    

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

    GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
    
  4. 如果節點附加一個實體 GPU,請檢查同一節點上是否有其他 Pod,確認 GPU UUID 相同:

    kubectl logs POD2_NAME
    

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

    GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
    

使用多執行個體 GPU 的 GPU 分時功能

平台管理員可能會想合併多項 GKE GPU 功能。GPU 分時功能可搭配多執行個體 GPU 使用,將單一實體 GPU 分割成最多七個切片。這些磁碟分割區彼此隔離,您可以為每個多重執行個體 GPU 分區設定 GPU 分時。

舉例來說,如果將 gpu-partition-size 設為 1g.5gb,基礎 GPU 會分割成七個分區。如果也將 max-shared-clients-per-gpu 設為 3,每個分割區最多可支援三個容器,因此在該實體 GPU 中,最多可分配 21 個 GPU 時段共用裝置。如要瞭解 gpu-partition-size 如何轉換為實際分割區,請參閱「多重執行個體 GPU 分割區」。

如要建立啟用 GPU 時段共用的多執行個體 GPU 叢集,請執行下列指令:

Autopilot

在 Autopilot 模式下,您可以同時使用這兩組節點選取器,將 GPU 分時和多執行個體 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
        cloud.google.com/gke-gpu-sharing-strategy: time-sharing
        cloud.google.com/gke-max-shared-clients-per-gpu: "3"
        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

標準

使用 Standard 時,您需要執行下列指令,建立 GPU 分時多例項叢集:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --machine-type=MACHINE_TYPE \
    --accelerator=type=nvidia-tesla-a100,count=GPU_QUANTITY,gpu-partition-size=PARTITION_SIZE,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

PARTITION_SIZE 替換為所需的多重執行個體 GPU 分割大小,例如 1g.5gb

限制

  • 透過 GPU 分時功能,GKE 會在共用實體 GPU 的容器之間,強制執行位址空間隔離、效能隔離和錯誤隔離。不過,系統不會對 GPU 強制執行記憶體限制。為避免發生記憶體不足 (OOM) 問題,請在工作負載中設定 GPU 記憶體限制。為避免安全性問題,請只將位於相同信任範圍的工作負載部署至 GPU 時段共用。
  • 為避免容量分配期間發生非預期行為,GKE 可能會拒絕特定 GPU 時段共用要求。詳情請參閱「GPU requests for GPU time-sharing」。
  • 單一實體 GPU 最多可供 48 個容器使用分時功能。規劃 GPU 時段共用設定時,請考量工作負載的資源需求,以及基礎實體 GPU 的容量,盡可能提升效能和回應速度。

後續步驟