本文說明如何為在 GDC 上使用 VM 執行階段執行的虛擬機器 (VM) 啟用 NVIDIA® GPU 支援。瞭解如何在 Google Distributed Cloud 節點上安裝 NVIDIA 驅動程式、確認 GPU 是否可用,以及將 GPU 指派給 VM。
事前準備
如要完成這份文件,您必須存取下列資源:
- 存取 Google Distributed Cloud 1.12.0 版 (anthosBareMetalVersion: 1.12.0) 以上版本的叢集。您可以使用任何可執行工作負載的叢集類型。 如有需要,請在 Compute Engine 上試用 Google Distributed Cloud,或參閱叢集建立總覽。
- virtctl用戶端工具已安裝為- kubectl的外掛程式。視需要安裝 virtctl 用戶端工具。
支援的 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 版本做為節點:
- 連線至要設定 GPU 支援的 Google Distributed Cloud 節點。
- 取得節點的核心版本: - KERNEL_VERSION="$(uname -r)"
- 更新 Ubuntu 節點並安裝適當的核心標頭: - sudo apt update && \ apt install -y linux-headers-${KERNEL_VERSION}
- 安裝 - build-essential套件,以便在後續步驟中編譯 Nvidia 驅動程式:- sudo apt install -y build-essential
- 為 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
- 安裝 NVIDIA 驅動程式套件。使用您在上一個步驟下載的 NVIDIA 驅動程式套件名稱: - sudo sh NVIDIA-Linux-x86_64-470.82.01.run \ --accept-license \ --silent \ --no-nouveau-check
- 載入 NVIDIA 核心模組: - sudo modprobe nvidia
- 針對叢集中具有 NVIDIA GPU 的每個節點,重複執行本節中的步驟。 
在 GDC 上的 VM Runtime 中啟用 GPU 支援
在 Google Distributed Cloud 節點上安裝 NVIDIA 驅動程式後,您就能在 GDC 的 VM Runtime 中啟用 GPU 支援功能。VM 隨後就能存取節點上的 GPU。
每個節點都會在下列程序中重新啟動。您的 VM 可能會受到這項重新啟動程序影響。如果可以遷移,且已設定遷移,可遷移的 VM 會遷移至其他節點。詳情請參閱如何在維護事件期間設定 VM 的驅逐政策。
如要在 GDC 的 VM Runtime 中啟用 GPU 支援功能,請完成下列步驟。
- 編輯 - VMRuntime自訂資源:- kubectl edit vmruntime vmruntime
- 將 - enableGPU: true屬性新增至- VMRuntime資訊清單:- apiVersion: vm.cluster.gke.io/v1 kind: VMRuntime metadata: name: vmruntime spec: enabled: true enableGPU: true ...
- 在編輯器中儲存並關閉 - VMRuntime自訂資源。
- 檢查 - 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
- 當所有 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 (容器) 使用。
- 編輯 - GPUAllocation自訂資源,以便搭配 VM 使用。這個步驟會指派節點上的 GPU,供 VM 使用:- kubectl edit gpuallocation NODE_NAME --namespace vm-system- 將 - NODE_NAME替換為要從中分配 GPU 的節點名稱。
- 設定要分配給 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。 
- 在編輯器中儲存並關閉 - GPUAllocation自訂資源。
- 確認 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 名稱和數量。
- 從主機取得 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 [...]
- 在您選擇的編輯器中建立 - VirtualMachine資訊清單,例如- my-gpu-vm.yaml:- nano my-gpu-vm.yaml
- 複製並貼上下列 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。
 
- 這個 GPU 名稱會顯示在先前步驟的 
 - VM 會連線至預設 - eth0- pod-network網路。- 名為「 - VM_NAME-boot-dv」的開機磁碟必須已存在。詳情請參閱「建立及管理虛擬磁碟」。
- 在編輯器中儲存並關閉 VM 資訊清單。 
- 使用 - kubectl建立 VM:- kubectl apply -f my-gpu-vm.yaml
- VM 執行時,請連線至 VM,並確認 GPU 硬體是否可用。