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

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

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

此功能可帮助您在裸机集群中动态且精确地分配 GPU 资源,从而运行 AI 工作负载,并提高资源利用率和高需求工作负载的性能。

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

准备工作

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

创建使用动态资源分配的 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. 下载并安装 SELinux 政策模块 nvidia_container_t,这是访问 GPU 所必需的。

      如需了解详情,请参阅 NVIDIA dgx-selinux 代码库。

    2. 使用以下命令将清单应用到集群:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        securityContext:
          seLinuxOptions:
            type: nvidia_container_t
        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 操作系统时,SELinux 政策可能会干扰尝试访问 GPU 的容器。如需了解详情,请参阅如何在裸机 RHEL 8 上使用容器中的 GPU

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

后续步骤