如果您的工作负载需要多节点分布式处理,请考虑使用“灵活启动(带排队配置)”。如需了解详情,请参阅通过灵活启动(带排队配置)运行大规模工作负载。
本指南适用于机器学习 (ML) 工程师、平台管理员和运维人员,以及对使用 Kubernetes 容器编排功能运行批量工作负载感兴趣的数据和 AI 专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
灵活启动价格
如果您的工作负载需要根据需要动态配置资源(最多 7 天,短期预留)、无需复杂的配额管理且可经济高效地访问,建议使用灵活启动。 灵活启动由动态工作负载调度器提供支持,并按照动态工作负载调度器价格计费:
- vCPU、GPU 和 TPU 可享受折扣(最高 53%)。
- 随用随付。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
命令以获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
- 验证您是否拥有运行 1.33.0-gke.1712000 版或更高版本的 Autopilot 集群或标准集群。
- 确认您已熟悉灵活启动的限制。
- 使用 Standard 集群时,验证您是否至少维护了一个未启用灵活启动的节点池,以便集群能够正常运行。
- 验证您在节点位置是否拥有抢占式 GPU 的配额。
如果您没有集群,或者您的集群不符合要求,可以使用 gcloud CLI 创建 Standard 区域级集群。添加以下标志,以便您可以了解灵活启动:
--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8
创建灵活启动节点池时,请使用前面提到的标志和 --accelerator type=nvidia-l4,count=1
。
如果您有符合要求的 Standard 集群,接下来的部分将引导您为集群选择 GPU 加速器类型和机器类型。
选择 GPU 加速器类型
如果您在 Autopilot 模式下使用集群,请跳过本部分,然后前往运行批量工作负载部分。
GPU 可用性特定于各个可用区。您需要找到在 Standard 集群所在的可用区中可用的 GPU 加速器类型。如果您有区域级 Standard 集群,则提供 GPU 加速器类型的可用区必须位于集群所在的区域中。创建节点池时,您需要为节点指定加速器类型和可用区。如果您指定的加速器类型在集群的位置中不可用,则节点池创建会失败。
运行以下命令,获取集群的位置和支持的 GPU 加速器类型。
获取集群所在的位置:
gcloud container clusters list
输出类似于以下内容:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE example-cluster-1 us-west2 1.33.2-gke.1111000 34.102.3.122 e2-medium 1.33.2-gke.1111000 9 RUNNING IPV4
列出可用的 GPU 加速器类型(不包括相应位置的虚拟工作站):
gcloud compute accelerator-types list | grep LOCATION_NAME | grep -v "Workstation"
将
LOCATION_NAME
替换为集群的位置。例如,如需获取
us-west2
区域中的 GPU 加速器类型列表,请运行以下命令:gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
输出类似于以下内容:
nvidia-b200 us-west2-c NVIDIA B200 180GB nvidia-tesla-p4 us-west2-c NVIDIA Tesla P4 nvidia-tesla-t4 us-west2-c NVIDIA T4 nvidia-tesla-p4 us-west2-b NVIDIA Tesla P4 nvidia-tesla-t4 us-west2-b NVIDIA T4
选择兼容的机器类型
如果您在 Autopilot 模式下使用集群,请跳过本部分,然后前往运行批量工作负载部分。
在了解集群位置中可用的 GPU 后,您可以确定兼容的机器类型。 Google Cloud 会将 GPU 限制为特定机器系列。请按照以下步骤查找机器类型:
- 请参阅可用的 GPU 型号表。
- 找到您选择的 GPU 加速器类型对应的行。
- 查看相应行的“机器系列”列。此列会告知您必须使用的机器系列。
- 如需查看可指定的机器类型名称,请点击机器系列中的链接。
唯一的例外是 N1 机器系列,其中提供了有关哪些 N1 机器类型可与所选加速器类型搭配使用的其他指导。
在使用加速器优化机器之前,请确保该机器支持灵活启动预配模式,如使用选项可用性(按机器类型)中所述。
确定加速器数量
如果您在 Autopilot 模式下使用集群,请跳过本部分,然后前往运行批量工作负载部分。
如需创建节点池,您需要确定要挂接到节点池中每个节点的加速器数量。有效值取决于加速器类型和机器类型。每种机器类型对可支持的 GPU 数量都有限制。如需确定要使用的值(除了默认值 1
),请执行以下操作:
- 请参阅 GPU 机器类型。
- 在表中,搜索适用于您的机器系列类型的加速器类型。
- 使用“GPU 数量”列中的值。
创建具有灵活启动的节点池
如果您在 Autopilot 模式下使用集群,请跳过本部分,然后前往运行批量工作负载部分。
如需在现有 Standard 集群上创建启用了灵活启动的节点池,您可以使用 gcloud CLI 或 Terraform。
gcloud
创建具有灵活启动的节点池:
gcloud container node-pools create NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --project PROJECT_ID \ --accelerator type=ACCELERATOR_TYPE,count=COUNT \ --machine-type MACHINE_TYPE \ --max-run-duration MAX_RUN_DURATION \ --flex-start \ --node-locations NODE_ZONES \ --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
:您为节点池选择的名称。CLUSTER_NAME
:您要修改的 Standard 集群的名称。LOCATION_NAME
:集群控制平面的计算区域。PROJECT_ID
:您的项目 ID。ACCELERATOR_TYPE
:要挂接到实例的特定类型的加速器(例如,nvidia-tesla-t4
表示 NVIDIA T4)。COUNT
:要挂接到实例的加速器数量。默认值为1
。MACHINE_TYPE
:要用于节点的机器类型。MAX_RUN_DURATION
:可选。节点的最长运行时(以秒为单位),最长为 7 天(默认值)。 您输入的数字必须以s
结尾。例如,如需指定 1 天,请输入86400s
。NODE_ZONES
:GKE 在其中创建节点池的一个或多个可用区的英文逗号分隔列表。
在此命令中,
--flex-start
标志指示gcloud
创建一个具有灵活启动虚拟机的节点池。GKE 会创建一个节点池,其中的节点包含两个具有指定加速器类型的实例。节点池最初没有节点,并且启用了自动扩缩
验证节点池中灵活启动的状态:
gcloud container node-pools describe NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --format="get(config.flexStart)"
如果节点池中启用了灵活启动,则
flexStart
字段会设置为True
。
Terraform
您可以使用 Terraform 模块将灵活启动与 GPU 搭配使用。
- 将以下块添加到 Terraform 配置中:
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"
queued_provisioning {
enabled = false
}
}
node_config {
machine_type = "MACHINE_TYPE"
accelerator_type = "ACCELERATOR_TYPE"
accelerator_count = COUNT
node_locations = ["NODE_ZONES"]
flex_start = true
}
替换以下内容:
MACHINE_TYPE
:要用于节点的机器类型。ACCELERATOR_TYPE
:要挂接到实例的特定类型的加速器(例如,nvidia-tesla-t4
表示 NVIDIA T4)。COUNT
:要挂接到机器的加速器数量。默认值为1
。NODE_ZONES
:GKE 在其中创建节点池的一个或多个可用区的英文逗号分隔列表。
Terraform 会调用 Google Cloud API,以创建一个包含将灵活启动虚拟机与 GPU 搭配使用的节点池的集群。节点池最初没有节点,并且启用了自动扩缩。如需详细了解 Terraform,请参阅 terraform.io 上的 google_container_node_pool
资源规范。
运行批量工作负载
在本部分中,您将创建两个 Kubernetes 作业,每个作业需要一个 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" cloud.google.com/gke-accelerator: ACCELERATOR_TYPE 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" cloud.google.com/gke-accelerator: ACCELERATOR_TYPE 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 上运行批处理工作负载的最佳实践。