本指南介绍了如何使用灵活启动预配模式,针对中型和小型训练工作负载优化 GPU 预配。在本指南中,您将使用 flex-start 部署由两个 Kubernetes Job 组成的工作负载。每个作业都需要一个 GPU。GKE 会自动预配一个包含两个 A100 GPU 的单个节点来运行这两个作业。
如果您的工作负载需要多节点分布式处理,请考虑使用启动时可灵活调整且采用队列化预配。如需了解详情,请参阅使用 Flex-Start 和队列化预配运行大规模工作负载。
本指南适用于机器学习 (ML) 工程师、平台管理员和运维人员,以及对使用 Kubernetes 容器编排功能运行批处理工作负载感兴趣的数据和 AI 专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
- 验证您是否拥有运行 1.33.0-gke.1712000 或更高版本的 Autopilot 集群或 Standard 集群。
- 请确保您熟悉 flex-start 的限制。
- 使用标准集群时,请验证您是否至少维护一个未启用灵活启动的节点池,以便集群能够正常运行。
- 验证您在节点位置是否有可抢占型 GPU 配额。
创建使用 flex-start 的节点池
如需在现有 Standard 集群上创建启用了 Flex Start 的节点池,您可以使用 gcloud CLI 或 Terraform。
如果您使用的是 Autopilot 模式集群,请跳过本部分,前往运行批处理工作负载部分。
gcloud
使用 flex-start 创建节点池:
gcloud container node-pools create NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --project PROJECT_ID \ --accelerator type=nvidia-a100-80gb,count=2 \ --machine-type a2-ultragpu-2g \ --max-run-duration MAX_RUN_DURATION \ --flex-start \ --num-nodes 0 \ --enable-autoscaling \ --total-min-nodes 0 \ --total-max-nodes 5 \ --location-policy ANY \ --reservation-affinity none \ --no-enable-autorepair
替换以下内容:
NODE_POOL_NAME
:您为节点池选择的名称。LOCATION_NAME
:集群控制平面的计算区域。PROJECT_ID
:您的项目 ID。CLUSTER_NAME
:您要修改的标准集群的名称。MAX_RUN_DURATION
:可选。节点的最长运行时(以秒为单位),最长为 7 天(默认值)。
在此命令中,
--flex-start
标志指示gcloud
创建启用了灵活启动的节点池。GKE 会创建一个节点池,其中节点包含两个 A100 GPU (
a2-ultragpu-2g
)。此节点池会自动将节点从 0 扩缩到最多 5 个节点。验证节点池中 flex-start 的状态:
gcloud container node-pools describe NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --format="get(config.flexStart)"
如果在节点池中启用了 flex-start,则
flexStart
字段会设置为True
。
Terraform
您可以使用 Terraform 模块将 flex-start 与 GPU 搭配使用。
- 将以下块添加到 Terraform 配置中:
```hcl
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"
queued_provisioning {
enabled = false
}
}
node_config {
machine_type = "a3-highgpu-8g"
flex_start = true
}
```
Terraform 会调用 API,以创建一个包含使用 GPU 的 flex-start 节点池的集群。 Google Cloud 节点池最初没有节点,并且启用了自动扩缩功能。如需详细了解 Terraform,请参阅 terraform.io 上的 google_container_node_pool
资源规范。
运行批量工作负载
在本部分中,您将创建两个 Kubernetes Job,每个 Job 需要一个 GPU。 Kubernetes 中的 Job 控制器会创建一个或多个 Pod,并确保它们成功执行特定任务。在 Google Cloud 控制台中,点击
激活 Cloud Shell 以启动 Cloud Shell 会话。 Google Cloud 控制台的底部窗格中会打开一个会话。
创建一个名为
dws-flex-start.yaml
的文件:apiVersion: batch/v1 kind: Job metadata: name: job-1 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" containers: - name: container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure --- apiVersion: batch/v1 kind: Job metadata: name: job-2 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" containers: - name: container-2 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure
应用
dws-flex-start.yaml
清单:kubectl apply -f dws-flex-start.yaml
验证作业是否在同一节点上运行:
kubectl get pods -l "job-name in (job-1,job-2)" -o wide
输出类似于以下内容:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES job-1 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none> job-2 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none>
清理
为避免因您在此页面上使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留该项目但删除各个资源。
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
逐个删除资源
删除作业:
kubectl delete job -l "job-name in (job-1,job-2)"
删除节点池:
gcloud container node-pools delete NODE_POOL_NAME \ --location LOCATION_NAME
删除集群:
gcloud container clusters delete CLUSTER_NAME
后续步骤
- 详细了解 GKE 中的 GPU。
- 详细了解节点自动预配。
- 详细了解在 GKE 上运行批处理工作负载的最佳实践。