本文档简要介绍了 Google Kubernetes Engine (GKE) 中 AI/机器学习工作负载的自动扩缩概念。
本文档适用于刚开始接触 GKE 的机器学习 (ML) 工程师。
准备工作
您应该对以下概念有基本的了解:
- 基本 Kubernetes 对象:了解容器、Pod 和节点是什么,以及它们之间的关系。
- 基本 GKE 集群架构:了解各种 GKE 集群组件如何相互交互。
挑战:满足高峰需求
Cymbal Shops 是一家虚构的线上零售商,目前正在为年度特惠活动做准备。商店 AI 赋能的商品推荐引擎必须能够向大量涌入的在线买家提供实时个性化建议。
如果商品推荐引擎运行缓慢,用户体验会受到影响,销售额也会下降。不过,在正常流量期间,预配过多的服务器容量并不经济实惠。目标是让资源能够根据需求自动扩缩,从而确保良好的用户体验,同时控制成本。
解决方案:按需自动扩缩
GKE 自动扩缩功能就像商店经理为销售旺季做准备一样。与让大型建筑始终配备充足的人员并保持供电不同,经理会根据买家需求随时动态调整商店的整体容量,包括员工、营业面积和设备。
GKE 也应用了这一原则:它会根据实时需求自动扩缩分配给应用(包括工作负载和基础设施)的资源。
GKE 自动扩缩的业务优势
通过结合使用横向和纵向扩缩策略,GKE 提供了一种强大的方法,可带来以下三项核心优势:
- 费用优化:您只需为使用的计算资源付费,避免过度预配带来的费用。GKE 自动扩缩可根据应用的实际 CPU 和内存要求自动调整应用的大小,从而避免浪费。它还可以仅在需要时才预配昂贵的专用硬件(如 GPU),并在作业完成后将其移除。
- 增强可靠性和性能:您的应用可以自动扩容(添加更多副本)来应对突如其来的流量高峰,从而确保用户获得稳定的体验。与此同时,GKE 的自动扩缩功能有助于防止可能导致应用崩溃的常见“内存不足”(OOM) 错误。对于要求严苛的 AI/机器学习作业,它有助于确保提供必要的高性能硬件,以便高效运行并按时完成作业。
- 减少运营开销:GKE 的多维度自动扩缩策略可显著简化资源管理。GKE 可自动执行以下复杂任务:调整资源请求和管理不同硬件的专用节点池。这种自动化可让工程团队专注于应用开发,而不是基础设施调优。
工作负载自动扩缩
工作负载自动扩缩可自动调整应用的性能以满足需求。GKE 采用双层自动扩缩系统来高效管理应用的资源。
Pod 横向自动扩缩器 (HPA):添加更多资源
Pod 横向自动扩缩器 (HPA) 会监控应用 Pod 的资源利用率。在我们的类比中,Pod 是“销售助理”,而 HPA 是“团队经理”,负责观察销售助理的忙碌程度。
当 Pod 的需求增加时,HPA 会自动预配更多 Pod 来分摊负载。当需求减少时,HPA 会终止空闲 Pod 以节省资源。
如需了解详情,请参阅 Pod 横向自动扩缩。
Pod 纵向自动扩缩器 (VPA):让资源更强大
横向扩缩侧重于增加资源数量,而纵向扩缩是一种补充策略,侧重于提高现有资源的性能。在实体店类比中,这并不是要聘用更多员工,而是要提升现有团队的能力,以提高他们的个人效率。
这种 Pod 级纵向扩缩方法由 Pod 纵向自动扩缩器 (VPA) 管理。VPA 会分析应用的资源消耗情况,并根据实际用量向上或向下调整 Pod 的 CPU 和内存请求。
VPA 可以调整 Pod 的资源请求和限制,例如通过重新预配 Pod 将其从 1 CPU 和 16 GB RAM 扩容到 4 CPU 和 64 GB RAM。此过程涉及重启 Pod 并使用功能更强大的新配置,以便更好地处理其工作负载。
如需了解详情,请参阅以下资源:
HPA 和 VPA 是相辅相成的。HPA 会根据流量变化调整 Pod 数量,而 VPA 有助于确保每个 Pod 的大小都适合其任务。这些扩缩策略可防止资源浪费,避免不必要的费用,并有助于确保您的应用在流量波动期间保持快速响应和可用性。不过,我们不建议对相同的指标(CPU 和内存)使用 HPA 和 VPA,因为它们可能会发生冲突。如需了解详情,请参阅 Pod 横向自动扩缩限制。
基础设施自动扩缩
基础设施自动扩缩会自动添加或移除硬件,以满足工作负载的需求。
集群自动扩缩器:大楼管理员
集群自动扩缩器可帮助确保有足够的底层基础设施(虚拟机,或 GKE 中的节点)来容纳 Pod。节点可以比作商店的“楼层”,而集群自动扩缩器则是“大楼管理员”。
如果 HPA 需要添加更多 Pod,但现有节点上缺少可用容量,集群自动扩缩器会预配新节点。相反,如果任何节点的利用率过低,集群自动扩缩器会将该节点的 Pod 移至其他节点,并终止当前的空节点。
如需了解详情,请参阅集群自动扩缩器。
节点池自动创建:自动化专家
虽然集群自动扩缩器会向现有节点池添加节点,但节点池自动创建可让集群自动扩缩器自动创建符合 Pod 特定需求的新节点池,从而扩展集群自动扩缩器的功能。
某些 AI/机器学习工作负载需要专用高性能硬件(例如 GPU 或 TPU),而通用节点池中没有此类硬件。节点池自动创建可在工作负载需要时,完全自动预配此类专用硬件。这有助于确保即使是计算密集程度最高的任务也能在需要时获得所需的硬件。
如需了解详情,请参阅节点池自动创建简介。
如需了解 GKE 中可用的加速器,请参阅以下内容:
ComputeClass:节点池自动创建的触发器
虽然节点池自动创建可以由 Pod 对特定硬件类型(例如 nvidia-l4-vws)的请求触发,但使用 ComputeClass 是一种更具弹性和现代化的方法。ComputeClass 是您定义的 GKE 资源,它会根据一组规则来控制和自定义硬件的自动扩缩方式。虽然它本身不是自动扩缩器,但可以与集群自动扩缩器搭配使用。
为了进一步类比,您可以将 ComputeClass 视为商店设备的“智能申请表单”。
销售助理(您的 Pod)不会要求使用特定的刚性硬件(例如,“我需要 X 品牌 500 型号的收款机”),而是使用申请表单请求功能(例如,“我需要一个高速结账站”)。该表单(即 ComputeClass)包含一组针对采购团队 (GKE) 的规则,用于说明如何完成相应订单。
ComputeClass 可将 Pod 对硬件的请求与 GKE 的硬件预配操作分离开来。Pod 可以请求 ComputeClass,而不是要求使用特定机器(例如 a3-highgpu-8g)。ComputeClass 本身定义了“智能”逻辑,即一个优先级规则列表,用于告知 GKE 如何满足相应请求。
如需了解详情,请参阅 GKE ComputeClass 简介。
如需深入了解 ComputeClass,并查看实际示例和 YAML 配置,请参阅以下技术指南:使用自定义 ComputeClass 优化 GKE 工作负载。
自动扩缩的关键指标和触发器
为了做出明智的扩缩决策,自动扩缩组件会监控不同的信号。下表比较了基于指标的自动扩缩触发器。
| 组件 | 对以下内容做出反应 | 信号源 | 思维过程 | GKE 的操作 |
|---|---|---|---|---|
| HPA | 当前负载 | 实时消耗量,例如,CPU 目前的利用率为 90%。 | “当前 Pod 已不堪重负。我们需要立即分配这些流量”。 | 横向扩容或缩容:更改 Pod 副本数量以满足需求。 |
| VPA | 调整规模的效率 | 历史消耗量,例如过去 24 小时内的平均 RAM 使用量。 | “相应 Pod 的资源需求已发生变化,或者我们最初的估计有误。我们需要调整其资源分配,以匹配其实际用量” | 纵向扩容或缩容:更改 Pod 的大小(CPU 或 RAM 限制),使其大小合适。 |
| 节点池自动创建 | 硬件可用性 | 未满足的请求,例如,由于不存在 GPU 节点,Pod 处于“待处理”状态。 | “此 Pod 无法启动,因为其请求的物理硬件缺失”。 | 预配基础设施:创建具有特定硬件的新节点池。 |
Pod 横向自动扩缩器 (HPA) 触发器:对负载做出反应
HPA 通过监控实时性能指标来扩缩 Pod 数量(横向缩容或扩容)。例如,CPU 和内存利用率(用于指示 Pod 的处理负载的基本指标)可供 HPA 开箱即用。
不过,有些指标需要明确的配置,例如:
- 负载均衡器指标(每秒请求数 [RPS]):直接衡量应用流量,可实现更快的扩缩响应。如需使用此指标,请参阅启用基于利用率的负载均衡和性能 HPA 配置文件。
- 自定义指标:根据自定义业务指标(例如“活跃用户数”)配置自动扩缩,以便根据预期需求主动管理资源。如需使用自定义指标,您需要设置指标流水线,以便将这些指标公开给 HPA。如需了解详情,请参阅 Google Cloud Managed Service for Prometheus。
Pod 纵向自动扩缩器 (VPA) 触发器:针对资源需求做出反应
VPA 会通过监控 Pod 的历史资源消耗情况来扩缩 Pod 的大小(纵向扩容或缩容):
- CPU 和内存利用率:VPA 会分析 Pod 的过往使用情况,以确定其资源请求是否正确。VPA 的主要目标是通过增加或减少 Pod 的内存和 CPU 请求来满足其真实需求,从而防止资源争用。
节点池自动创建触发器:针对硬件请求做出反应
节点池自动创建可预配具有专用硬件的新节点池。它不会由 CPU 负载等性能指标触发。而是由 Pod 的资源请求触发:
- 无法调度的资源请求:一个关键触发器。创建 Pod 时,它会请求特定的硬件。如果集群因没有现有节点具备相应硬件而无法满足此请求,则节点池自动创建会采取措施。
- ComputeClass 请求:Pod 请求 ComputeClass,例如
cloud.google.com/compute-class: premium-gpu。如果集群中没有节点可以提供“premium-gpu”功能,节点池自动创建会自动创建一个可以提供这些功能的新节点池。
如需了解如何使用自定义指标、Prometheus 指标和外部指标来实现自动扩缩,请参阅根据指标自动扩缩工作负载简介。
总结
应用这些自动扩缩策略,您可以有效管理波动不定的 AI/机器学习工作负载。就像 Cymbal Shops 商店经理通过灵活管理资源来应对销售高峰事件一样,您也可以使用 GKE 自动扩缩来自动扩展和缩减基础设施和工作负载资源。这有助于确保您的模型在流量高峰期保持高性能,在流量低谷期保持成本高效,从而使您的环境保持合理的规模。
后续步骤
- 简要了解 GKE 上的 AI/机器学习推理工作负载。
- 了解如何通过预配置的架构在 GKE 上部署开放 LLM。
- 了解如何默认将 ComputeClass 应用于 Pod。