使用 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 以获取最新版本。
  • 验证您是否拥有运行 1.33.0-gke.1712000 版或更高版本的 Autopilot 集群标准集群
  • 确认您已熟悉灵活启动的限制
  • 使用 Standard 集群时,验证您是否至少维护了一个未启用灵活启动的节点池,以便集群能够正常运行。
  • 验证您在节点位置是否拥有抢占式 GPU 的配额。

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

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

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

gcloud

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

    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:您要修改的 Standard 集群的名称。
    • MAX_RUN_DURATION:可选。节点的最长运行时(以秒为单位),最长为 7 天(默认值)。

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

    GKE 会创建一个节点池,其中包含包含两个 A100 GPU (a2-ultragpu-2g) 的节点。此节点池会自动将节点数量从零扩缩到最多五个节点。

  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 配置中:
```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 会调用 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"
          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
    
  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
    

后续步骤