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

本文档介绍如何为使用 GDC 上的虚拟机运行时运行的虚拟机启用 NVIDIA® GPU 支持。您将了解如何在 Google Distributed Cloud 节点上安装 NVIDIA 驱动程序、验证 GPU 是否可用,以及将 GPU 分配给虚拟机。

准备工作

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

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

  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 上的虚拟机运行时中启用 GPU 支持

在 Google Distributed Cloud 节点上安装 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 节点和 GDC 上的 VM Runtime 中配置 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 硬件是否可用。

后续步骤