管理 GPU 工作負載

本頁說明如何在 Google Distributed Cloud connected 上啟用及管理圖形處理器 (GPU) 工作負載。如要使用這項功能,您必須擁有包含 GPU 的 Distributed Cloud 連線硬體設定。GPU 支援功能預設為停用。您必須在 Distributed Cloud 連線叢集上明確啟用 GPU 支援。請注意,Distributed Cloud Servers 不支援 GPU 工作負載。

如要規劃及訂購這類設定,請在下列文件中選擇設定 2:

如果 Distributed Cloud connected 機架包含 GPU,您可以設定 Distributed Cloud connected 工作負載,使用 GPU 資源。

Distributed Cloud 連線工作負載可在容器和虛擬機器上執行:

  • 在容器中執行的 GPU 工作負載。啟用 GPU 支援後,Distributed Cloud connected 叢集上的所有 GPU 資源,一開始都會分配給在容器中執行的工作負載。Distributed Cloud connected 內含 GPU 驅動程式,可執行以 GPU 為基礎的容器化工作負載。在每個容器中,GPU 程式庫會掛接在 /opt/nvidia

  • 在虛擬機器上執行的 GPU 工作負載。如要在虛擬機器上執行 GPU 工作負載,您必須將目標 Distributed Cloud connected 節點上的 GPU 資源分配給虛擬機器,詳情請參閱本頁稍後內容。這麼做會略過內建的 GPU 驅動程式,並直接將 GPU 傳遞至虛擬機器。您必須在每個虛擬機器的客體作業系統上手動安裝相容的 GPU 驅動程式。您也必須取得所有授權,才能在虛擬機器上執行專用 GPU 驅動程式。

如要確認 Distributed Cloud connected 節點上是否有 GPU,請確認節點是否具有 vm.cluster.gke.io.gpu=true 標籤。如果節點上沒有標籤,表示對應的 Distributed Cloud 連結實體機器未安裝 GPU。

啟用 GPU 支援

如要為工作負載啟用 GPU 支援,您必須建立或修改 VMRuntime 自訂資源,其中包含 enableGPU 參數,且值設為 true,然後將其套用至 Distributed Cloud 連線叢集。例如:

apiVersion: vm.cluster.gke.io/v1
kind: VMRuntime
metadata:
  name: vmruntime
spec:
  # Enable GPU support
  enableGPU: true

視要啟用 VM Runtime on GDC 虛擬機器子系統的叢集類型而定,請執行下列其中一項操作:

  • 如果 Cloud 控制層叢集尚未啟用 GDC 虛擬機器子系統的 VM Runtime,您必須手動建立 VMRuntime 資源。
  • 對於已啟用 VM Runtime on GDC 虛擬機器子系統的 Cloud 控制層叢集,您必須編輯現有的 VMRuntime 資源
  • 如果是本機控制層叢集,您必須編輯現有的 VMRuntime 資源。

這個 VMRuntime 資源也會使用 enable 參數,在叢集上設定 GDC 支援的 VM 執行階段。請務必根據工作負載需求設定這兩個參數。您不必在 GDC 支援服務上啟用 VM Runtime,即可在 Distributed Cloud 連線叢集上啟用 GPU 支援。

下表說明可用的設定。

enable enableGPU 產生的設定
false false 工作負載只能在容器中執行,且無法使用 GPU 資源。
false true 工作負載只會在容器中執行,且可使用 GPU 資源。
true true

工作負載可在虛擬機器和容器中執行。

這兩種工作負載都可以使用 GPU 資源。

true false

工作負載可在虛擬機器和容器中執行。

這兩種工作負載都無法使用 GPU 資源。

確認已啟用 GPU 支援

如要確認叢集已啟用 GPU 支援,請使用下列指令:

kubectl get pods --namespace vm-system

指令會傳回類似以下範例的輸出內容:

NAME                                         READY   STATUS     RESTARTS  AGE
...
gpu-controller-controller-manager-vbv4w      2/2     Running    0         31h
kubevirt-gpu-dp-daemonset-gxj7g              1/1     Running    0         31h
nvidia-gpu-dp-daemonset-bq2vj                1/1     Running    0         31h
...

在輸出內容中,您可以確認 GPU 控制器 Pod 已部署,且正在 vm-system 命名空間中執行。

分配 GPU 資源

根據預設,在 Distributed Cloud 連線叢集上啟用 GPU 支援時,叢集中每個節點上的所有 GPU 資源都會分配給容器化工作負載。如要自訂每個節點的 GPU 資源分配,請完成本節中的步驟。

設定 GPU 資源分配

  1. 如要在 Distributed Cloud 連線節點上分配 GPU 資源,請使用下列指令編輯目標節點上的 GPUAllocation 自訂資源:

    kubectl edit gpuallocation NODE_NAME --namespace vm-system

    請將 NODE_NAME 改成目標 Distributed Cloud 節點的名稱。

    在下列範例中,指令的輸出內容會顯示原廠預設的 GPU 資源分配。根據預設,所有 GPU 資源都會分配給容器化 (pod) 工作負載,不會分配給虛擬機器 (vm) 工作負載:

    ...
    spec:
      pod:   2  # Number of GPUs allocated for container workloads
      vm:    0  # Number of GPUs allocated for VM workloads
    
  2. 請依下列方式設定 GPU 資源分配:

    • 如要將 GPU 資源分配給容器化工作負載,請增加 pod 欄位的值,並減少 vm 欄位的值,兩者增減的量須相同。
    • 如要將 GPU 資源分配給虛擬機器工作負載,請增加 vm 欄位的值,並減少 pod 欄位的值,增減幅度相同。

    分配的 GPU 資源總數不得超過節點執行的實體 Distributed Cloud 連線機器上安裝的 GPU 數量;否則,節點會拒絕無效的分配。

    在下列範例中,有兩項 GPU 資源已從容器化 (pod) 工作負載重新分配至虛擬機器 (vm) 工作負載:

    ...
    spec:
      pod:   0  # Number of GPUs allocated for container workloads
      vm:    2  # Number of GPUs allocated for VM workloads
    

    完成後,將修改後的 GPUAllocation 資源套用至叢集,並等待狀態變更為 AllocationFulfilled

檢查 GPU 資源分配

  • 如要檢查 GPU 資源分配情形,請使用下列指令:

    kubectl describe gpuallocations NODE_NAME --namespace vm-system

    NODE_NAME 替換為目標 Distributed Cloud 連線節點的名稱。

    指令會傳回類似以下範例的輸出內容:

     Name:         mynode1
     ...
     spec:
       node:  mynode1
       pod:   2  # Number of GPUs allocated for container workloads
       vm:    0  # Number of GPUs allocated for VM workloads
     Status:
       Allocated:  true
       Conditions:
         Last Transition Time:  2022-09-23T03:14:10Z
         Message:
         Observed Generation:   1
         Reason:                AllocationFulfilled
         Status:                True
         Type:                  AllocationStatus
         Last Transition Time:  2022-09-23T03:14:16Z
         Message:
         Observed Generation:   1
         Reason:                DeviceStateUpdated
         Status:                True
         Type:                  DeviceStateUpdated
       Consumption:
         pod:         0/2   # Number of GPUs currently consumed by container workloads
         vm:          0/0   # Number of GPUs currently consumed by VM workloads
       Device Model:  Tesla T4
     Events:          <none>
    

設定容器以使用 GPU 資源

如要設定在 Distributed Cloud 上執行的容器,使其連線使用 GPU 資源,請按照下列範例設定規格,然後套用至叢集:

  apiVersion: v1
  kind: Pod
  metadata:
    name: my-gpu-pod
  spec:
    containers:
    - name: my-gpu-container
      image: CUDA_TOOLKIT_IMAGE
      command: ["/bin/bash", "-c", "--"]
      args: ["while true; do sleep 600; done;"]
      env:
      resources:
        requests:
        nvidia.com/gpu-pod-TESLA_T4: 2
        limits:
        nvidia.com/gpu-pod-TESLA_T4: 2
    nodeSelector:
      kubernetes.io/hostname: NODE_NAME

更改下列內容:

  • CUDA_TOOLKIT_IMAGE:NVIDIA CUDA 工具包映像檔的完整路徑和名稱。CUDA 工具包版本必須與 Distributed Cloud 連線叢集上執行的 NVIDIA 驅動程式版本相符。如要判斷 NVIDIA 驅動程式版本,請參閱「Distributed Cloud 版本資訊」。如要尋找相符的 CUDA Toolkit 版本,請參閱「CUDA 相容性」。
  • NODE_NAME:目標 Distributed Cloud 連線節點的名稱。

設定虛擬機器以使用 GPU 資源

如要設定在 Distributed Cloud 連線執行的虛擬機器,以使用 GPU 資源,請按照下列範例設定其 VirtualMachine 資源規格,然後套用至叢集:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
...
spec:
  ...
  gpu:
    model: nvidia.com/gpu-vm-TESLA_T4
    quantity: 2

後續步驟