本页面介绍了如何配置 GPU 工作负载,以便在 Google Distributed Cloud Bare Metal 集群中使用动态资源分配。动态资源分配是一项 Kubernetes API,可让您在 Pod 和容器之间请求和共享 GPU 等通用资源。这些资源由第三方驱动程序管理。
借助动态资源分配,Kubernetes 会根据引用的设备配置来调度 Pod。应用运算符无需在其工作负载中选择特定节点,也无需确保每个 Pod 请求的设备数量与附加到这些节点的设备数量完全一致。此过程类似于为存储空间分配卷。
此功能可帮助您在裸机集群中动态且精确地分配 GPU 资源,从而运行 AI 工作负载,并提高资源利用率和高需求工作负载的性能。
本页面适用于管理底层技术基础设施生命周期的管理员、架构师和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。
准备工作
在配置 GPU 工作负载以使用动态资源分配之前,请验证是否满足以下前提条件:
- 您的裸金属集群为 1.33.0 版或更高版本。
- 您的操作系统是 Ubuntu 22.04 或 Red Hat Enterprise Linux (RHEL) 9.4。
- 您已更新集群以启用动态资源分配,如启用动态资源分配中所述。
- 您至少有一台挂接了 GPU 并安装了 NVIDIA GPU 驱动程序的节点机器。如需了解详情,请参阅安装或卸载捆绑的 NVIDIA GPU Operator。
- 您已按照 NVIDIA DRA 驱动程序(适用于 GPU)中的说明在所有连接了 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
。pod1
Pod 中的容器是 NVIDIA 计算统一设备架构 (CUDA) 示例,旨在在 GPU 上运行 CUDA 工作负载。当pod1
Pod 成功完成时,表示动态资源分配功能正常运行,并且动态资源分配已准备好管理集群中的 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
下载并安装 SELinux 政策模块
nvidia_container_t
,这是访问 GPU 所必需的。如需了解详情,请参阅 NVIDIA dgx-selinux 代码库。
使用以下命令将清单应用到集群:
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 组提供更多功能,稳定性也更好。
后续步骤
- 如需详细了解动态资源分配,请参阅 Kubernetes 文档。
- 了解如何在裸机上部署第三方 LLM。