管理 GPU 工作负载

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

后续步骤