本文档介绍如何为使用 VM Runtime on GDC 运行的虚拟机启用 NVIDIA® GPU 支持。了解如何在 Google Distributed Cloud 节点上安装 NVIDIA 驱动程序,确认 GPU 可用,并将 GPU 分配给虚拟机。
准备工作
要完成本文档,您需要拥有以下资源的访问权限:
- Google Distributed Cloud 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 或更高版本的集群。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用 Google Distributed Cloud,或查看集群创建概览。 - 作为
kubectl
的插件安装的virtctl
客户端工具。如果需要,请安装 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 驱动程序
您必须先配置 Google Distributed Cloud 节点以支持 GPU 设备,然后虚拟机才能使用 NVIDIA 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 的每个节点上重复本部分中的步骤。
在 VM Runtime on GDC 中启用 GPU 支持
在 Google Distributed Cloud 节点上安装 NVIDIA 驱动程序后,您便可以在 VM Runtime on GDC 中启用 GPU 支持。然后,您的虚拟机可以访问节点上的 GPU。
在以下过程中,每个节点都会重新启动。您的虚拟机可能会受到此重新启动过程的影响。如果可能并配置为如此,可迁移的虚拟机会迁移到其他节点。如需了解详情,请参阅如何在维护事件期间为虚拟机配置逐出政策。
如需在 VM Runtime on GDC 中启用 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
成功启用控制器大约需要 5 分钟。等待所有 GPU 控制器的
STATUS
显示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 的每个节点都会显示。在下一部分中,您将它们分配给虚拟机:
NAME ALLOCATED DEVICEMODEL bm-node1 true Tesla A100 SXM4 40GB bm-node2 true Tesla A100 SXM4 40GB
分配 GPU 以用于虚拟机
在 Anthos Clusters on Bare Metal 节点和 VM Runtime on GDC 中配置 GPU 支持后,分配要在虚拟机中使用的 GPU。默认情况下,系统会分配 GPU 以用于 Pod(容器)。
修改
GPUAllocation
自定义资源,以用于虚拟机。此步骤会分配节点上的 GPU 以用于虚拟机:kubectl edit gpuallocation NODE_NAME --namespace vm-system
将
NODE_NAME
替换为您要从中分配 GPU 的节点的名称。配置要分配给虚拟机的 GPU 数量。一开始,所有 GPU 都会分配给 Pod。
分配给虚拟机和 Pod 的 GPU 总数必须与节点中的 GPU 数量相等。例如,您的节点中可能有四个 GPU。如果将两个 GPU 分配给虚拟机,则剩下两个 GPU 分配给 Pod。如果您尝试将两个 GPU 分配给虚拟机并将一个 GPU 分配给 Pod,则
GPUAllocation
清单会被拒绝,因为有一个 GPU 未分配。更新节点上要分配给虚拟机的 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 都分配给虚拟机。没有向 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 的虚拟机
您现在可以创建使用节点上的 GPU 的虚拟机。在虚拟机自定义资源中,指定要从节点分配的 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
:您的虚拟机的名称。GPU_NAME
:节点中要分配给虚拟机的 GPU 名称。- 此 GPU 名称显示在上一步的
kubectl describe node
命令的输出中,例如NVIDIA_A100_SXM4_40GB
。
- 此 GPU 名称显示在上一步的
虚拟机将
eth0
连接到默认的pod-network
网络。名为
VM_NAME-boot-dv
的启动磁盘必须已存在。如需了解详情,请参阅创建和管理虚拟磁盘。在编辑器中保存并关闭虚拟机清单。
使用
kubectl
创建虚拟机:kubectl apply -f my-gpu-vm.yaml
在虚拟机运行时,连接到虚拟机并确认 GPU 硬件可用。