使用 GPU 和灵活启动虚���机运行小型批量工作负载

本指南介绍如何使用灵活启动虚拟机优化中小型训练工作负载的 GPU 预配。灵活启动虚拟机是使用灵活启动使用选项创建的。在本指南中,您将使用灵活启动虚拟机来部署包含两个 Kubernetes 作业的工作负载。每个作业需要一个 GPU。GKE 会自动配置一个具有两个 A100 GPU 的单节点来运行这两个作业。

如果您的工作负载需要多节点分布式处理,请考虑使用“灵活启动(带排队配置)”。如需了解详情,请参阅通过灵活启动(带排队配置)运行大规模工作负载。

本指南适用于机器学习 (ML) 工程师、平台管理员和运维人员,以及对使用 Kubernetes 容器编排功能运行批量工作负载感兴趣的数据和 AI 专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。

灵活启动价格

如果您的工作负载需要根据需要动态配置资源(最多 7 天,短期预留)、无需复杂的配额管理且可经济高效地访问,建议使用灵活启动。 灵活启动由动态工作负载调度器提供支持,并按照动态工作负载调度器价格计费:

  • vCPU、GPU、TPU 和任何连接的本地 SSD 磁盘均可享受折扣(最高 53%)。
  • 随用随付 (PAYG)。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 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 加速器类型。

  1. 获取集群所在的位置:

    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
    
  2. 列出可用的 GPU 加速器类型(不包括相应位置的虚拟工作站):

    gcloud compute accelerator-types list | grep CONTROL_PLANE_LOCATION | grep -v "Workstation"
    

    将 CONTROL_PLANE_LOCATION 替换为集群的位置。

    例如,如需获取 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 限制为特定机器系列。请按照以下步骤查找机器类型:

  1. 请参阅可用的 GPU 型号表。
  2. 找到您选择的 GPU 加速器类型对应的行。
  3. 查看相应行的“机器系列”列。此列会告知您必须使用的机器系列。
  4. 如需查看可指定的机器类型名称,请点击机器系列中的链接。

唯一的例外是 N1 机器系列,其中提供了有关哪些 N1 机器类型可与所选加速器类型搭配使用的其他指导。

在使用加速器优化机器之前,请确保该机器支持灵活启动预配模式,如使用选项可用性(按机器类型)中所述。

确定加速器数量

如果您在 Autopilot 模式下使用集群,请跳过本部分,然后前往运行批量工作负载部分。

如需创建节点池,您需要确定要挂接到节点池中每个节点的加速器数量。有效值取决于加速器类型和机器类型。每种机器类型对可支持的 GPU 数量都有限制。如需确定要使用的值(除了默认值 1),请执行以下操作:

  1. 请参阅 GPU 机器类型。
  2. 在表中,搜索适用于您的机器系列类型的加速器类型。
  3. 使用“GPU 数量”列中的值。

创建具有灵活启动的节点池

如果您在 Autopilot 模式下使用集群,请跳过本部分,然后前往运行批量工作负载部分。

如需在现有 Standard 集群上创建启用了灵活启动的节点池,您可以使用 gcloud CLI 或 Terraform。

gcloud

  1. 创建具有灵活启动的节点池:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --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 \
        --no-enable-autorepair \
        --consolidation-delay=CONSOLIDATION_DELAY
    

    替换以下内容:

    • NODE_POOL_NAME:您为节点池选择的名称。
    • CLUSTER_NAME:您要修改的 Standard 集群的名称。
    • CONTROL_PLANE_LOCATION:集群控制平面的计算区域。
    • PROJECT_ID:您的项目 ID。
    • ACCELERATOR_TYPE:要挂接到实例的特定类型的加速器(例如,nvidia-tesla-t4 表示 NVIDIA T4)。
    • COUNT:要挂接到实例的加速器数量。默认值为 1。
    • MACHINE_TYPE:要用于节点的机器类型。
    • MAX_RUN_DURATION:可选。节点的最长运行时(以秒为单位),最长为 7 天(默认值)。 您输入的数字必须以 s 结尾。例如,如需指定 1 天,请输入 86400s。
    • CONSOLIDATION_DELAY:可选。集群自动扩缩器在可以缩������用率不足的节点之前等待的时长。使用此设置可延迟缩减规模,并保留节点池以供其他 Pod 稍后重复使用。您输入的数字必须以 s 结尾。例如,如需指定 1 小时,请输入 3600s。适用于 GKE 1.34.1-gke.2364000 版及更高版本。
    • NODE_ZONES:GKE 在其中创建节点池的一个或多个可用区的英文逗号分隔列表。

    在此命令中,--flex-start 标志指示 gcloud 创建一个具有灵活启动虚拟机的节点池。

    GKE 会创建一个节点池,其中的节点包含两个具有指定加速器类型的实例。节点池最初没有节点,并且启用了自动扩缩

Terraform

您可以使用 Terraform 模块将灵活启动与 GPU 搭配使用。

  1. 将以下块添加到 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 资源规范。

验证节点池中灵活启动的状态

运行以下命令:

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --location CONTROL_PLANE_LOCATION \
    --format="get(config.flexStart)"

如果节点池中启用了灵活启动,则 flexStart 字段会设置为 True。

运行批量工作负载

在本部分中,您将创建两个 Kubernetes 作业,每个作业需要一个 GPU。 Kubernetes 中的 Job 控制器会创建一个或多个 Pod,并帮助确保它们成功执行特定任务。

  1. 在 Google Cloud 控制台中,点击 Cloud Shell 激活图标 激活 Cloud Shell 以启动 Cloud Shell 会话。系统会在 Google Cloud 控制台的底部窗格中打开会话。

  2. 创建一个名为 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
    
  3. 应用 dws-flex-start.yaml 清单:

    kubectl apply -f dws-flex-start.yaml
    
  4. 验证作业是否在同一节点上运行:

    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 账号产生费用,请删除包含这些资源的项目,或者保留该项目但删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,前往管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除。
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

逐个删除资源

  1. 删除作业:

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. 删除节点池:

    gcloud container node-pools delete NODE_POOL_NAME \
          --location CONTROL_PLANE_LOCATION
    
  3. 删除集群:

    gcloud container clusters delete CLUSTER_NAME
    

后续步骤