本文档介绍如何为在 Google Distributed Cloud 上使用虚拟机运行时的虚拟机启用 NVIDIA® GPU 支持。您将了解如何在 GKE on Bare Metal 节点上安装 NVIDIA 驱动程序,验证 GPU 是否可用,以及为虚拟机分配 GPU。
准备工作
要完成本文档,您需要拥有以下资源的访问权限:
- GKE on Bare Metal 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 或更高版本集群的访问权限。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用 GKE on Bare Metal,或查看集群创建概览。 - 作为
kubectl
的插件安装的virtctl
客户端工具。如果需要,请安装 virtctl 客户端工具。
支持的 Nvidia GPU 卡
GKE on Bare Metal 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 驱动程序
您必须先配置 GKE on Bare Metal 节点,以支持 GPU 设备,然后虚拟机才能使用 NVIDIA GPU。如需在节点上安装 NVIDIA 驱动程序,请在包含 NVIDIA GPU 的集群中的每个节点上完成以下步骤。本文档为节点使用受支持的 Ubuntu 版本:
- 连接到要配置 GPU 支持的 GKE on Bare Metal 节点。
获取节点的内核版本:
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 的每个节点上重复本部分中的步骤。
在 Google Distributed Cloud 上的虚拟机运行时中启用 GPU 支持
在 GKE on Bare Metal 节点上安装 NVIDIA 驱动程序后,您可以在 Google Distributed Cloud 上的虚拟机运行时中启用 GPU 支持。然后,您的虚拟机可以访问节点上的 GPU。
在以下过程中,每个节点都会重新启动。您的虚拟机可能会受到此重新启动过程的影响。如果可能并配置为如此,可迁移的虚拟机会迁移到其他节点。如需了解详情,请参阅如何在维护事件期间为虚拟机配置逐出政策。
如需在 Google Distributed Cloud 上的虚拟机运行时中启用 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 Google Distributed Cloud 中配置 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 硬件可用。