通过动态资源分配管理 GPU 设备

本页面介绍了如何配置 GPU 工作负载,以便在 Google Distributed Cloud 裸金属集群中使用动态资源分配。动态资源分配是一个 Kubernetes API,可让您在 Pod 和容器之间请求和共享 GPU 等通用资源。这些资源由第三方驱动程序管理。

借助动态资源分配,Kubernetes 会根据引用的设备配置来调度 Pod。应用运维人员无需在其工作负载中选择特定节点,也无需确保每个 Pod 请求的设备数量与挂接到这些节点的设备数量完全一致。此过程类似于为存储空间分配卷。

此功能通过在裸金属集群中动态且精确地分配 GPU 资源来帮助您运行 AI 工作负载,从而为要求严苛的工作负载提高资源利用率和性能。

本页面适用于管理底层技术基础设施生命周期的管理员、架构师和运维人员。如需详细了解我们在内容中提及的常见 角色和示例任务,请参阅常见的 GKE 用户角色和 任务。 Google Cloud

准备工作

在配置 GPU 工作负载以使用动态资源分配之前,请验证是否满足以下前提条件:

  • 您的裸金属集群为 1.33.0 版或更高版本。
  • 您的操作系统为 Ubuntu 22.04 或 Red Hat Enterprise Linux (RHEL) 9.4。
  • 您已更新集群以启用动态资源分配,如启用动态资源分配中所述。
  • 您至少有一台挂接了 GPU 并安装了 NVIDIA GPU 驱动程序的节点机器。如需了解详情,请参阅安装或卸载 捆绑的 NVIDIA GPU Operator
  • 如果您使用的是捆绑的 NVIDIA GPU 运算符,则 1.33.0 版或更高版本默认启用容器设备接口 (CDI)。 如果您使用的是手动安装的 GPU 运算符,请确保在 ClusterPolicy 中启用了 CDI。
  • 您已按照适用于 GPU 的 NVIDIA DRA 驱动程序 中的说明在所有挂接了 GPU 的节点上安装 NVIDIA DRA 驱动程序。

创建使用动态资源分配的 GPU 工作负载

如需让 GPU 工作负载能够利用动态资源分配来请求 GPU,它们必须位于共享命名空间中,并具有描述 GPU 设备分配请求的 ResourceClaim。您的工作负载必须引用 ResourceClaim,以便 Kubernetes 分配 GPU 资源。

以下步骤将设置一个环境,您的工作负载可以在其中使用动态资源分配来请求 GPU 资源:

  1. 如需创建与动态资源分配相关的资源,请在集群中创建新的 Namespace

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

    替换以下内容:

    • CLUSTER_KUBECONFIG:用户集群 kubeconfig 文件的路径。

    • NAMESPACE_NAME 替换为动态资源分配命名空间的名称。

  2. 创建一个 ResourceClaim 来描述 GPU 访问权限请求:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    RESOURCE_CLAIM_NAME 替换为 GPU 请求的资源声明的名称。

  3. 创建引用在上一步中创建的 ResourceClaim 的工作负载。

    以下工作负载示例展示了如何在 dra-test 命名空间中引用名为 gpu-claimResourceClaimpod1 Pod 中的容器是 NVIDIA 计算统一设备架构 (CUDA) 示例(设计为在 GPU 上运行 CUDA 工作负载)。当 pod1 Pod 成功完成时,表示动态资源分配功能正常运行,并且动态资源分配已准备好管理集群中的 GPU 资源。

    Ubuntu

    1. 使用以下命令将清单应用于集群:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. 使用以下命令将清单应用于集群:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
      
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

限制

使用动态资源分配时,请考虑以下限制:

  • 当您将 RHEL 操作系统与受支持版本的 NVIDIA GPU 运算符搭配使用时,容器设备接口 (CDI) 会自动处理设备注入和 SELinux 标签。您无需使用手动 SELinux 政策配置或设置 pod securityContext

  • 此功能使用 resource.k8s.io/v1beta1 API 组,该组与此功能的开源 Kubernetes API 组 resource.k8s.io/v1 不同。与 v1beta1 API 组相比,v1 开源 API 组提供更多功能,稳定性更高。

后续步骤