您可以在容器中启用和管理图形处理单元 (GPU) 资源。例如,您可能更喜欢在 GPU 环境中运行人工智能 (AI) 和机器学习 (ML) 笔记本。如需运行 GPU 容器工作负载,您必须拥有支持 GPU 设备的 Kubernetes 集群。对于已预配 GPU 机器的 Kubernetes 集群,默认情况下会启用 GPU 支持。
本文档适用于应用运维人员群组中的应用开发者,他们负责为组织创建应用工作负载。如需了解详情,请参阅 GDC 气隙环境文档的受众群体。
准备工作
如需完成本文档中的任务,您必须请求必要的权限并准备好环境。
申请 IAM 角色
您必须拥有特定角色,才能获得将 GPU 部署到容器所需的权限。您需要的角色取决于您是在组织范围的共享集群中工作,还是在项目范围的标准集群中工作。如需了解详情,请参阅 Kubernetes 集群配置。
共享集群角色
如需验证支持 GPU 的节点池并在共享集群中部署 GPU 工作负载,请根据要执行的任务请求以下角色:
- 用户集群管理员 (
user-cluster-admin):创建、删除、修改或查看托管在管理 API 服务器上的共享集群的资源。借助此角色,您可以检查共享集群中的 GPU,并且此角色不受项目命名空间的限制。 - 命名空间管理员 (
namespace-admin):创建、删除、修改或查看项目中托管的共享集群的资源。借助此角色,您可以将 GPU 工作负载部署到标准集群,并且该角色已绑定到您的项目命名空间。
标准集群角色
如需验证支持 GPU 的节点池并将 GPU 工作负载部署到标准集群,请让项目 IAM 管理员为您授予以下角色:
- 标准集群管理员 (
standard-cluster-admin):创建、删除、修改或查看托管在管理 API 服务器上的标准集群的资源。此角色可让您检查共享集群中的 GPU,并绑定到您的项目命名空间。 - Cluster Developer (
cluster-developer):创建、删除、修改或查看标准集群。此角色可让您通过访问标准集群内托管的数据平面 API,将 GPU 工作负载部署到标准集群。此角色绑定到您的项目命名空间。
准备环境
如需配置容器以使用 GPU 资源,请确保您拥有以下资源:
具有 GPU 机器类的 Kubernetes 集群。如需了解详情,请参阅支持的 GPU 卡部分。
找到 Kubernetes 集群名称,或向平台管理员群组的成员询问集群名称。
登录并生成 Kubernetes 集群的 kubeconfig 文件。
使用 Kubernetes 集群的 kubeconfig 路径替换这些说明中的
KUBERNETES_CLUSTER_KUBECONFIG。登录并生成托管 Kubernetes 集群的区域管理 API 服务器的 kubeconfig 文件。使用此路径替换这些说明中的
MANAGEMENT_API_SERVER。登录并生成组织基础设施集群的 kubeconfig 文件,该集群位于旨在托管 GPU 的可用区中。
配置容器以使用 GPU 资源
如需在容器中使用这些 GPU,请完成以下步骤:
验证您的 Kubernetes 集群是否具有支持 GPU 的节点池:
kubectl describe clusters.cluster.gdc.goog/KUBERNETES_CLUSTER_NAME \ -n KUBERNETES_CLUSTER_NAMESPACE \ --kubeconfig MANAGEMENT_API_SERVER替换以下内容:
KUBERNETES_CLUSTER_NAME:集群的名称。KUBERNETES_CLUSTER_NAMESPACE:集群的命名空间。对于共享集群,请使用platform命名空间。对于标准集群,请使用集群的项目命名空间。MANAGEMENT_API_SERVER:托管 Kubernetes 集群的区域 API 服务器的 kubeconfig 路径。如果您尚未为目标可用区中的 API 服务器生成 kubeconfig 文件,请参阅登录。
相关输出类似于以下代码段:
# Several lines of code are omitted here. spec: nodePools: - machineTypeName: a2-ultragpu-1g-gdc nodeCount: 2 # Several lines of code are omitted here.如需查看支持的 GPU 机器类型和多实例 GPU (MIG) 配置的完整列表,请参阅集群节点机器类型。
将
.containers.resources.requests和.containers.resources.limits字段添加到容器规范中。每个资源名称都因机器类而异。 检查 GPU 资源分配,找到 GPU 资源名称。例如,以下容器规范从
a2-ultragpu-1g-gdc节点请求了 GPU 的三个分区:# Several lines of code are omitted here. containers: - name: my-container image: "my-image" resources: requests: nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 3 limits: nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 3 # Several lines of code are omitted here.容器还需要额外的权限才能访问 GPU。对于每个请求 GPU 的容器,请将以下权限添加到容器规范中:
# Several lines of code are omitted here. securityContext: seLinuxOptions: type: unconfined_t # Several lines of code are omitted here.应用容器清单文件:
kubectl apply -f CONTAINER_MANIFEST_FILE \ -n KUBERNETES_CLUSTER_NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG替换以下内容:
CONTAINER_MANIFEST_FILE:容器工作负载的 YAML 清单文件。KUBERNETES_CLUSTER_NAMESPACE:集群的命名空间。对于共享集群,请使用platform命名空间。对于标准集群,请使用集群的项目命名空间。KUBERNETES_CLUSTER_KUBECONFIG:集群的 kubeconfig 路径。
检查 GPU 资源分配
如需检查 GPU 资源分配情况,请使用以下命令:
kubectl describe nodes NODE_NAME --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG替换以下内容:
NODE_NAME:管理您要检查的 GPU 的节点。KUBERNETES_CLUSTER_KUBECONFIG:集群的 kubeconfig 路径。
相关输出类似于以下代码段:
# Several lines of code are omitted here. Capacity: nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 7 Allocatable: nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 7 # Several lines of code are omitted here.
记下 GPU 的资源名称;在配置容器以使用 GPU 资源时,您必须指定这些名称。