管理 GPU 工作负载

本页介绍了如何在 Google Distributed Cloud 上启用和管理图形处理单元 (GPU) 工作负载。如需利用此功能,您必须拥有包含 GPU 的 Distributed Cloud 硬件配置。GPU 支持默认处于停用状态。您必须在 Distributed Cloud 集群上明确启用 GPU 支持。

如需规划和订购此类配置,请在以下文档中选择配置 2:

如果您的 Distributed Cloud 机架包含 GPU,您可以配置 Distributed Cloud 工作负载以使用 GPU 资源。

Distributed Cloud 工作负载可以在容器中和虚拟机上运行:

  • 在容器中运行的 GPU 工作负载。启用 GPU 支持后,Distributed Cloud 集群上的所有 GPU 资源最初都会分配给在容器中运行的工作负载。用于运行基于 GPU 的容器化工作负载的 GPU 驱动程序包含在 Distributed Cloud 中。在每个容器中,GPU 库都装载在 /opt/nvidia

  • 在虚拟机上运行的 GPU 工作负载。如需在虚拟机上运行基于 GPU 的工作负载,您必须在目标 Distributed Cloud 节点上为虚拟机分配 GPU 资源,如本页稍后所述。这样做会绕过内置 GPU 驱动程序,并将 GPU 直接传递给虚拟机。您必须在每个虚拟机的 guest 操作系统上手动安装兼容的 GPU 驱动程序。您还必须获得在虚拟机上运行专用 GPU 驱动程序所需的所有许可。

如需确认 Distributed Cloud 节点上是否存在 GPU,请验证该节点是否具有 vm.cluster.gke.io.gpu=true 标签。如果节点上没有该标签,则表示相应的 Distributed Cloud 物理机上未安装 GPU。

启用 GPU 支持

如需为工作负载启用 GPU 支持,您必须创建或修改 VMRuntime 自定义资源,该资源包含 enableGPU 参数,且该参数的值设置为 true,然后将其应用于 Distributed Cloud 集群。例如:

apiVersion: vm.cluster.gke.io/v1
kind: VMRuntime
metadata:
  name: vmruntime
spec:
  # Enable GPU support
  enableGPU: true

根据您要在哪个类型的集群上启用 GDC 虚拟机子系统上的虚拟机运行时,执行以下操作之一:

  • 对于尚未启用 VM Runtime on GDC 虚拟机子系统的云控制平面集群,您必须手动创建 VMRuntime 资源。
  • 对于您已在其中启用 VM Runtime on GDC 虚拟机子系统的云控制平面集群,您必须修改现有的 VMRuntime 资源
  • 对于本地控制平面集群,您必须修改现有的 VMRuntime 资源。

同一 VMRuntime 资源还可通过使用 enable 参数在集群上配置 VM Runtime on GDC 支持。请务必根据工作负载需求配置这两个参数。您不必启用 VM Runtime on GDC 支持,即可在 Distributed Cloud 集群上启用 GPU 支持。

下表介绍了可用的配置。

enable enableGPU 生成的配置
false false 工作负载仅在容器中运行,无法使用 GPU 资源。
false true 工作负载仅在容器中运行,并且可以使用 GPU 资源。
true true

工作负载可以在虚拟机上运行,也可以在容器中运行。

这两种类型的工作负载都可以使用 GPU 资源。

true false

工作负载可以在虚拟机上运行,也可以在容器中运行。

这两种类型的工作负载都无法使用 GPU 资源。

验证是否已启用 GPU 支持

如需验证集群是否已启用 GPU 支持,请使用以下命令:

kubectl get pods --namespace vm-system

该命令会返回类似于以下示例的输出:

NAME                                         READY   STATUS     RESTARTS  AGE
...
gpu-controller-controller-manager-vbv4w      2/2     Running    0         31h
kubevirt-gpu-dp-daemonset-gxj7g              1/1     Running    0         31h
nvidia-gpu-dp-daemonset-bq2vj                1/1     Running    0         31h
...

在输出中,您可以验证 GPU 控制器 Pod 是否已部署并正在 vm-system 命名空间中运行。

分配 GPU 资源

默认情况下,在分布式云集群上启用 GPU 支持后,集群中每个节点上的所有 GPU 资源都会分配给容器化工作负载。如需自定义每个节点上 GPU 资源的分配,请完成本部分中的步骤。

配置 GPU 资源分配

  1. 如需在 Distributed Cloud 节点上分配 GPU 资源,请使用以下命令修改目标节点上的 GPUAllocation 自定义资源:

    kubectl edit gpuallocation NODE_NAME --namespace vm-system

    NODE_NAME 替换为目标 Distributed Cloud 节点的名称。

    在以下示例中,命令的输出显示了出厂默认 GPU 资源分配。默认情况下,所有 GPU 资源都分配给容器化 (pod) 工作负载,而不会分配给虚拟机 (vm) 工作负载:

    ...
    spec:
      pod:   2  # Number of GPUs allocated for container workloads
      vm:    0  # Number of GPUs allocated for VM workloads
    
  2. 按如下方式设置 GPU 资源分配:

    • 如需为容器化工作负载分配 GPU 资源,请增加 pod 字段的值,并以相同的量减少 vm 字段的值。
    • 如需为虚拟机工作负载分配 GPU 资源,请增加 vm 字段的值,并以相同的量减少 pod 字段的值。

    分配的 GPU 资源总数不得超过节点运行所在的物理分布式云机器上安装的 GPU 数量;否则,节点会拒绝无效的分配。

    在以下示例中,两个 GPU 资源已从容器化 (pod) 工作负载重新分配给虚拟机 (vm) 工作负载:

    ...
    spec:
      pod:   0  # Number of GPUs allocated for container workloads
      vm:    2  # Number of GPUs allocated for VM workloads
    

    完成后,将修改后的 GPUAllocation 资源应用到集群,并等待其状态变为 AllocationFulfilled

检查 GPU 资源分配

  • 如需检查 GPU 资源分配情况,请使用以下命令:

    kubectl describe gpuallocations NODE_NAME --namespace vm-system

    NODE_NAME 替换为目标 Distributed Cloud 节点的名称。

    该命令会返回类似于以下示例的输出:

     Name:         mynode1
     ...
     spec:
       node:  mynode1
       pod:   2  # Number of GPUs allocated for container workloads
       vm:    0  # Number of GPUs allocated for VM workloads
     Status:
       Allocated:  true
       Conditions:
         Last Transition Time:  2022-09-23T03:14:10Z
         Message:
         Observed Generation:   1
         Reason:                AllocationFulfilled
         Status:                True
         Type:                  AllocationStatus
         Last Transition Time:  2022-09-23T03:14:16Z
         Message:
         Observed Generation:   1
         Reason:                DeviceStateUpdated
         Status:                True
         Type:                  DeviceStateUpdated
       Consumption:
         pod:         0/2   # Number of GPUs currently consumed by container workloads
         vm:          0/0   # Number of GPUs currently consumed by VM workloads
       Device Model:  Tesla T4
     Events:          <none>
    

配置容器以使用 GPU 资源

如需配置在 Distributed Cloud 上运行的容器以使用 GPU 资源,请按以下示例所示配置其规范,然后将其应用到集群:

  apiVersion: v1
  kind: Pod
  metadata:
    name: my-gpu-pod
  spec:
    containers:
    - name: my-gpu-container
      image: CUDA_TOOLKIT_IMAGE
      command: ["/bin/bash", "-c", "--"]
      args: ["while true; do sleep 600; done;"]
      env:
      resources:
        requests:
        nvidia.com/gpu-pod-TESLA_T4: 2
        limits:
        nvidia.com/gpu-pod-TESLA_T4: 2
    nodeSelector:
      kubernetes.io/hostname: NODE_NAME

替换以下内容:

  • CUDA_TOOLKIT_IMAGE:NVIDIA CUDA 工具包映像的完整路径和名称。CUDA 工具包的版本必须与在 Distributed Cloud 集群上运行的 NVIDIA 驱动程序的版本一致。 如需确定 NVIDIA 驱动程序版本,请参阅 Distributed Cloud 版本说明。 如需查找匹配的 CUDA 工具包版本,请参阅 CUDA 兼容性
  • NODE_NAME:目标 Distributed Cloud 节点的名称。

配置虚拟机以使用 GPU 资源

如需将在 Distributed Cloud 上运行的虚拟机配置为使用 GPU 资源,请按以下示例所示配置其 VirtualMachine 资源规范,然后将其应用于集群:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
...
spec:
  ...
  gpu:
    model: nvidia.com/gpu-vm-TESLA_T4
    quantity: 2

后续步骤