在 GDC 上的虚拟机运行时内启用和使用 NVIDIA GPU

本文档介绍如何为使用 GDC 上的虚拟机运行时运行的虚拟机启用 NVIDIA® GPU 支持。了解如何在 GKE on Bare Metal 节点上安装 NVIDIA 驱动程序,验证 GPU 可用,并将 GPU 分配给虚拟机。

准备工作

要完成本文档,您需要拥有以下资源的访问权限:

支持的 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 版本

  1. 连接到要配置 GPU 支持的 GKE on Bare Metal 节点。
  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 上的虚拟机运行时中启用 GPU 支持

在 GKE on Bare Metal 节点上安装 NVIDIA 驱动程序后,您可以在 GDC 上的虚拟机运行时启用 GPU 支持。然后,您的虚拟机可以访问节点上的 GPU。

在以下过程中,每个节点都会重新启动。您的虚拟机可能会受到此重新启动过程的影响。如果可能并配置为如此,可迁移的虚拟机会迁移到其他节点。如需了解详情,请参阅如何在维护事件期间为虚拟机配置逐出政策

如需在 GDC 上的虚拟机运行时中启用 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
    

    成功启用控制器大约需要 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
    
  5. 验证 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(容器)。

  1. 修改 GPUAllocation 自定义资源,以用于虚拟机。此步骤会分配节点上的 GPU 以用于虚拟机:

    kubectl edit gpuallocation NODE_NAME --namespace vm-system
    

    NODE_NAME 替换为您要从中分配 GPU 的节点的名称。

  2. 配置要分配给虚拟机的 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。

  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 的虚拟机

您现在可以创建使用节点上的 GPU 的虚拟机。在虚拟机自定义资源中,指定要从节点分配的 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:您的虚拟机的名称。
    • GPU_NAME:节点中要分配给虚拟机的 GPU 名称。
      • 此 GPU 名称显示在上一步的 kubectl describe node 命令的输出中,例如 NVIDIA_A100_SXM4_40GB

    虚拟机将 eth0 连接到默认的 pod-network 网络。

    名为 VM_NAME-boot-dv 的启动磁盘必须已存在。如需了解详情,请参阅创建和管理虚拟磁盘

  4. 在编辑器中保存并关闭虚拟机清单。

  5. 使用 kubectl 创建虚拟机:

    kubectl apply -f my-gpu-vm.yaml
    
  6. 当虚拟机运行时,请连接到虚拟机并验证 GPU 硬件可用。

后续步骤