在 GDC 上,透過 VM Runtime 在 VM 中啟用及使用 NVIDIA GPU

本文說明如何為在 GDC 上使用 VM 執行階段執行的虛擬機器 (VM) 啟用 ​​NVIDIA® GPU 支援。瞭解如何在 Google Distributed Cloud 節點上安裝 NVIDIA 驅動程式、確認 GPU 是否可用,以及將 GPU 指派給 VM。

事前準備

如要完成這份文件,您必須存取下列資源:

支援的 Nvidia GPU 卡

Google Distributed Cloud 1.13 以上版本支援下列 NVIDIA GPU:

  • Tesla T4
  • Tesla P4
  • Tesla V100 SXM2 32 GB
  • A100 SXM4 40 GB
  • A100 PCIe 40 GB
  • A100 SXM4 80 GB
  • A100 PCIe 80 GB

在節點上安裝 NVIDIA 驅動程式

VM 必須先設定 Google Distributed Cloud 節點,才能支援 GPU 裝置,如要在節點上安裝 NVIDIA 驅動程式,請在叢集中包含 NVIDIA GPU 的每個節點上完成下列步驟。本文使用支援的 Ubuntu 版本做為節點:

  1. 連線至要設定 GPU 支援的 Google Distributed Cloud 節點。
  2. 取得節點的核心版本:

    KERNEL_VERSION="$(uname -r)"
    
  3. 更新 Ubuntu 節點並安裝適當的核心標頭:

    sudo apt update && \
    apt install -y linux-headers-${KERNEL_VERSION}
    
  4. 安裝 build-essential 套件,以便在後續步驟中編譯 Nvidia 驅動程式:

    sudo apt install -y build-essential
    
  5. 為 GPU 下載適當的 NVIDIA 驅動程式套件。如需完整驅動程式清單,請參閱 NVIDIA 驅動程式下載

    以下範例會下載 Linux x86_64 版本的 470.82.01 驅動程式:

    wget https://us.download.nvidia.com/tesla/470.82.01/NVIDIA-Linux-x86_64-470.82.01.run
    
  6. 安裝 NVIDIA 驅動程式套件。使用您在上一個步驟下載的 NVIDIA 驅動程式套件名稱:

    sudo sh NVIDIA-Linux-x86_64-470.82.01.run \
      --accept-license \
      --silent \
      --no-nouveau-check
    
  7. 載入 NVIDIA 核心模組:

    sudo modprobe nvidia
    
  8. 針對叢集中具有 NVIDIA GPU 的每個節點,重複執行本節中的步驟。

在 GDC 上的 VM Runtime 中啟用 GPU 支援

在 Google Distributed Cloud 節點上安裝 NVIDIA 驅動程式後,您就能在 GDC 的 VM Runtime 中啟用 GPU 支援功能。VM 隨後就能存取節點上的 GPU。

每個節點都會在下列程序中重新啟動。您的 VM 可能會受到這項重新啟動程序影響。如果可以遷移,且已設定遷移,可遷移的 VM 會遷移至其他節點。詳情請參閱如何在維護事件期間設定 VM 的驅逐政策

如要在 GDC 的 VM Runtime 中啟用 GPU 支援功能,請完成下列步驟。

  1. 編輯 VMRuntime 自訂資源:

    kubectl edit vmruntime vmruntime
    
  2. enableGPU: true 屬性新增至 VMRuntime 資訊清單:

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      enableGPU: true
    ...
    
  3. 在編輯器中儲存並關閉 VMRuntime 自訂資源。

  4. 檢查 vm-system 命名空間中 GPU 控制器的狀態:

    kubectl get pods --namespace vm-system  -w
    

    控制器大約需要五分鐘才能順利啟用。 等待 STATUS 顯示所有 GPU 控制器的 Running。下列範例輸出內容顯示所需狀態:

    NAME                                          READY  STATUS    RESTARTS     AGE
    gpu-controller-controller-manager-gwvcb       2/2    Running   0            10m
    kubevirt-gpu-dp-daemonset-2lfkl               1/1    Running   0            10m
    kubevm-gpu-driver-daemonset-5fwh6             1/1    Running   0            10m
    nvidia-gpu-dp-daemonset-9zq2w                 1/1    Running   0            10m
    nvidia-mig-manager-5g7pz                      1/1    Running   0            10m
    vm-controller-controller-manager-7b6df6979b   2/2    Running   2 (13m ago)  14m
    
  5. 當所有 GPU 控制器都回報 Running 狀態時,請確認 GPU 是否可供使用:

    kubectl get gpuallocations --namespace vm-system
    

    以下範例輸出內容顯示節點上的 GPU 可供使用。系統會顯示叢集中支援 GPU 的每個節點。您會在下一節中將這些 IP 位址分配給 VM:

    NAME       ALLOCATED   DEVICEMODEL
    bm-node1   true        Tesla A100 SXM4 40GB
    bm-node2   true        Tesla A100 SXM4 40GB
    

為 VM 分配 GPU

在 Bare Metal 叢集節點和 GDC 上的 VM 執行階段中設定 GPU 支援後,即可分配 GPU 供 VM 使用。根據預設,系統會分配 GPU 給 Pod (容器) 使用。

  1. 編輯 GPUAllocation 自訂資源,以便搭配 VM 使用。這個步驟會指派節點上的 GPU,供 VM 使用:

    kubectl edit gpuallocation NODE_NAME --namespace vm-system
    

    NODE_NAME 替換為要從中分配 GPU 的節點名稱。

  2. 設定要分配給 VM 的 GPU 數量。一開始,所有 GPU 都會分配給 Pod。

    分配給 VM 和 Pod 的 GPU 總數必須等於節點中的 GPU 數量。舉例來說,節點中可能有四個 GPU。如果您為 VM 分配兩個 GPU,則兩個 GPU 仍會分配給 Pod。如果您嘗試將兩個 GPU 分配給 VM,一個 GPU 分配給 Pod,則 GPUAllocation 資訊清單會遭到拒絕,因為有一個 GPU 未分配。

    更新要分配給 VM 使用的節點 GPU 數量,如下例所示:

    apiVersion: gpu.cluster.gke.io/v1
    kind: GPUAllocation
    metadata:
      name: gpu-w2
      namespace: vm-system
    spec:
      node: gpu-w2
      pod: 0
      vm: 4
    

    在本範例中,節點中安裝的所有四個 GPU 都會分配給 VM。系統不會為 Pod 分配 GPU。

  3. 在編輯器中儲存並關閉 GPUAllocation 自訂資源。

  4. 確認 GPU 回報的 ALLOCATED 狀態為 true

    kubectl get gpuallocations --namespace vm-system
    

    以下輸出範例顯示節點上的 GPU 可供使用:

    NAME     ALLOCATED   DEVICEMODEL
    gpu-w1   true        Tesla A100 SXM4 40GB
    gpu-w2   true        Tesla A100 SXM4 40GB
    

建立支援 GPU 的 VM

您現在可以建立使用節點 GPU 的 VM。在 VM 自訂資源中,您可以指定要從節點分配的 GPU 名稱和數量。

  1. 從主機取得 GPU 卡的名稱:

    kubectl describe node NODE_NAME
    

    NODE_NAME 替換為要取得 GPU 名稱的主機名稱。

    以下範例輸出內容顯示,這個節點上可分配的 GPU 名稱為 NVIDIA_A100_SXM4_40GB

    Name:               bm-node1
    Roles:              worker
    [...]
    Allocatable:
      cpu:                                         47810m
      [...]
      memory:                                      336929400Ki
      nvidia.com/gpu-vm-NVIDIA_A100_SXM4_40GB:     1
    [...]
    
  2. 在您選擇的編輯器中建立 VirtualMachine 資訊清單,例如 my-gpu-vm.yaml

    nano my-gpu-vm.yaml
    
  3. 複製並貼上下列 YAML 資訊清單:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
          gpu:
            model: nvidia.com/gpu-vm-GPU_NAME
            quantity: 1
    

    在這個 YAML 檔案中,定義下列設定:

    • VM_NAME:VM 的名稱。
    • GPU_NAME:要分配給 VM 的節點 GPU 名稱。
      • 這個 GPU 名稱會顯示在先前步驟的 kubectl describe node 指令輸出中,例如 NVIDIA_A100_SXM4_40GB

    VM 會連線至預設 pod-network 網路 eth0

    名為「VM_NAME-boot-dv」的開機磁碟必須已存在。詳情請參閱「建立及管理虛擬磁碟」。

  4. 在編輯器中儲存並關閉 VM 資訊清單。

  5. 使用 kubectl 建立 VM:

    kubectl apply -f my-gpu-vm.yaml
    
  6. VM 執行時,請連線至 VM,並確認 GPU 硬體是否可用。

後續步驟