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

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

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

本指南适用于机器学习 (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 加速器类型。

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

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

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

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

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

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 资源规范

运行批量工作负载

在本部分中,您将创建两个 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

逐个删除资源

  1. 删除作业:

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

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

    gcloud container clusters delete CLUSTER_NAME
    

后续步骤