使用 GPU 和灵活启动预配模式运行小型批处理工作负载


本指南介绍了如何使用灵活启动预配模式,针对中型和小型训练工作负载优化 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

  1. 使用 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 个节点。

  2. 验证节点池中 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 搭配使用。

  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 会调用 API,以创建一个包含使用 GPU 的 flex-start 节点池的集群。 Google Cloud 节点池最初没有节点,并且启用了自动扩缩功能。如需详细了解 Terraform,请参阅 terraform.io 上的 google_container_node_pool 资源规范

运行批量工作负载

在本部分中,您将创建两个 Kubernetes Job,每个 Job 需要一个 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
    

后续步骤