管理 GPU 和 TPU 的 GKE 节点中断


本页面可帮助您了解、配置和监控运行人工智能 (AI) 或机器学习 (ML) 工作负载的 Google Kubernetes Engine (GKE) 节点上可能发生的中断事件,包括:

在长时间运行的 GKE 集群的生命周期内,由于 Google Cloud 为底层 GKE 基础架构的 Compute Engine 资源发出自动维护事件,因此工作负载会定期中断。当这些中断影响运行 AI/机器学习工作负载的 GKE 节点时,GKE 需要重启正在运行的工作负载和底层节点。

为何 GPU 和 TPU 需要中断管理

GKE 集群会管理 GKE 节点的生命周期。这些节点会在 Compute Engine 虚拟机上进行预配。Compute Engine 虚拟机会定期遇到由于多种原因而导致的主机事件,例如硬件或软件更新、维护和硬件故障。主机事件是针对底层 Google Cloud 基础架构发出的,会绕过 GKE 维护政策和排除项。

大多数 Compute Engine 虚拟机(但有一些例外情况)的主机维护政策设置为实时迁移,这意味着几乎不会中断正在运行的工作负载。不过,某些类别的虚拟机不支持实时迁移,包括运行 AI/机器学习工作负载且挂接了 GPUTPU 的虚拟机。此外,由于碎片整理原因,GKE 可能还会使用抢占功能重启按需 TPU,从而使 GKE 可以预配更大的 TPU。

发生主机事件时,GKE 会终止节点及其 Pod。如果 Pod 是作为更大的工作负载(例如作业部署)的一部分部署的,GKE 会在受影响的节点上重启 Pod。由您或是您用于处理工作负载或作业的框架决定如何适当地响应中断。例如,您可以保存 AI 训练作业的状态,以减少数据丢失。

正常终止的过程

以下工作流展示了 Compute Engine 发出中断后 GKE 如何执行正常节点终止:

  1. Compute Engine 为虚拟机元数据maintenance-event 发出更新后的 TERMINATE_ON_HOST_MAINTENANCE 值。
  2. 在 60 秒内会发生以下情况:

    1. 系统组件会将以下新的节点标签集应用于 true,以指示维护正在进行: cloud.google.com/active-node-maintenance

    2. GKE 会应用节点污点,以防止在节点上调度新的 Pod:cloud.google.com/impending-node-termination:NoSchedule。我们建议您修改工作负载,以容忍由于发生已知终止而导致的此污点。

  3. maintenance-handler 组件会开始按以下顺序逐出 Pod:首先是工作负载 Pod,然后是系统 Pod(例如 kube-system)。

  4. GKE 会发送关停信号 SIGTERM,以提醒节点上正在运行的工作负载 Pod 即将关停。Pod 可以使用此提醒来完成任何正在进行的任务。GKE 会尽最大努力正常终止这些 Pod。

当 GKE 节点的底层 Compute Engine 虚拟机发生导致节点终止的中断性主机事件时,maintenance-event 通知会出现。发生这种情况时,Compute Engine 会更新 maintenance-event 元数据键。节点终止之前的高级维护通知时段如下所示:

  • GPU:60 分钟。
  • TPU:5 分钟。

之后,系统会执行节点终止并分配替换节点。该过程完成后,GKE 会清除标签和污点。如需延长使用 GPU 或 TPU 的工作负载的终止时段,请完成配置 GKE 以正常终止工作负载部分中的步骤。

在 GKE 中处理工作负载中断

为了管理 GKE 终止事件并减少集群中工作负载的中断,GKE 会为您监控这些通知,并执行以下操作:

  • GKE 会在即将关停之前通知您的工作负载:当 GKE 节点因主机维护事件而需要停止时,GKE 会在提前通知期开始时向节点上正在运行的 Pod 发送 SIGTERM 信号。大多数标准库(例如 PythonGo)都可以原生处理 SIGTERM 等操作系统信号。可以捕获 SIGTERM 的框架包括 MaxTextPax 以及带有 Orbax 的 JAX。
  • GKE 会正常终止您的工作负载:您可以配置 GKE 以正常终止工作负载,并设置 Pod 终止宽限期。Pod 可以响应 SIGTERM 信号,以完成任何正在进行的任务并执行您定义的任何终止操作,例如保存训练状态。在正常终止期间,GKE 会尽最大努力正常终止 Pod 并执行清理过程或您在应用中定义的终止操作,例如存储工作负载数据以减少数据丢失或保存训练状态。

配置 GKE 以正常终止工作负载

在本部分中,您将配置 GKE 以管理应用生命周期并最大限度地减少工作负载的中断。如果您未配置宽限期,则宽限期默认为 30 秒。

GKE 会尽最大努力正常终止这些 Pod 并执行您定义的终止操作,例如保存训练状态。GKE 会在宽限期开始时向 Pod 发送 SIGTERM 信号。如果 Pod 未在宽限期结束前退出,GKE 会向仍在 Pod 中的任何容器中运行的任何进程发送跟进 SIGKILL 信号。

如需为工作负载配置正常终止期,请按照适用于 GPU 或 TPU 的说明操作。

GPU

在 Pod 清单中,将 spec.terminationGracePeriodSeconds 字段值设置为不超过 3600 秒(60 分钟)。例如,如需获得 10 分钟的通知时间,请在 Pod 清单中将 spec.terminationGracePeriodSeconds 字段设置为 600 秒,如下所示:

    spec:
      terminationGracePeriodSeconds: 600

我们建议您设置的终止宽限期足够长,以便任何正在进行的任务在通知时间范围内完成。

TPU

如需分配执行清理过程的最长时间,请在 Pod 清单中将 spec.terminationGracePeriodSeconds 字段设置为 300 秒(五分钟)。例如:

    spec:
      terminationGracePeriodSeconds: 300

我们建议您设置的终止宽限期足够长,以便任何正在进行的任务在通知时间范围内完成。

如果您的工作负载使用机器学习框架(例如 MaxText、Pax 或带有 Orbax 的 JAX),则工作负载可以捕获关停 SIGTERM 信号并启动检查点过程。如需了解详情,请参阅 TPU 自动检查点

监控活跃正常终止的进度

在控制平面运行 1.29.1-gke.1425000 或更高版本的 GKE 集群中,GKE 会部署一个名为 gpu-maintenance-handler 的节点级组件。此组件与相应的控制平面组件一起在所有 GPU 和 TPU 节点上运行。这些组件执行以下操作:

  • 处理正常终止事件。
  • 通过将 SIGTERM 信号转发到节点的正在运行的工作负载,响应 GKE 虚拟机上即将发生的中断事件。这些中断会记录为 Pod 逐出删除请求。

GKE 会向具有即将关停状态的节点添加标签和污点。GKE 使用在每个 GPU 和 TPU 节点上运行的系统组件 maintenance-handler 监控主机事件通知(例如维护)。

GKE 会记录以下正常终止事件:

GKE 完成正常终止后,标签和污点会被清除。

如需监控因中断而导致的活跃正常终止状态,您可以使用控制台或 Google Cloud CLI 查看 gpu-maintenance-handler 日志。

gcloud

  1. 通过运行以下命令找到运行 gpu-maintenance-handler 实例的节点和 Pod 的名称:

    kubectl get pods -l name=maintenance-handler -A -o wide
    

    输出的每一行都包含节点名称Pod 名称状态

  2. 查看日志:

    kubectl logs -n=kube-system MAINTENANCE_HANDLER_POD_NAME
    

    MAINTENANCE_HANDLER_POD_NAME 替换为处理程序实例的名称。

    如果检测到维护事件,Pod 会记录一条消息、应用标签,然后开始逐出。

  3. 检查节点标签和污点:

    kubectl describe node NODE_NAME
    

    NODE_NAME 替换为您要查看的节点的名称。

    输出结果会显示要监控的节点标签和污点的列表。

控制台

  1. 进入 Google Cloud 控制台中的 Logs Explorer 页面。

    进入 Logs Explorer

  2. 查询字段中,指定以下查询:

    resource.type="k8s_container"
    resource.labels.namespace_name="kube-system"
    resource.labels.container_name="maintenance-handler"
    resource.labels.cluster_name="CLUSTER_NAME"
    

    替换 CLUSTER_NAME:您的集群名称。

后续步骤