借助动态资源分配,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 资源:
如需创建与动态资源分配相关的资源,请在集群中创建新的
Namespace:cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Namespace metadata: name: NAMESPACE_NAME EOF替换以下内容:
CLUSTER_KUBECONFIG:用户集群 kubeconfig 文件的路径。将
NAMESPACE_NAME替换为动态资源分配命名空间的名称。
创建一个
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 请求的资源声明的名称。创建引用在上一步中创建的
ResourceClaim的工作负载。以下工作负载示例展示了如何在
dra-test命名空间中引用名为gpu-claim的ResourceClaim。pod1Pod 中的容器是 NVIDIA 计算统一设备架构 (CUDA) 示例(设计为在 GPU 上运行 CUDA 工作负载)。当pod1Pod 成功完成时,表示动态资源分配功能正常运行,并且动态资源分配已准备好管理集群中的 GPU 资源。Ubuntu
使用以下命令将清单应用于集群:
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
使用以下命令将清单应用于集群:
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/v1beta1API 组,该组与此功能的开源 Kubernetes API 组resource.k8s.io/v1不同。与v1beta1API 组相比,v1开源 API 组提供更多功能,稳定性更高。
后续步骤
- 如需详细了解动态资源分配,请参阅 Kubernetes 文档。
- 了解如何在裸金属上部署第三方 LLM。