使用 Amazon EKS 混合节点跨环境运行 GenAI 推理
这篇博文由澳大利亚首席容器专家罗伯特·诺萨德、EKS 高级产品经理埃里克·查普曼和南非高级专家合伙人 Elamaran Shanmugam 撰写。
导言
Amazon Elastic Kubernetes Service(Amazon EKS)混合节点改变了您在云和本地环境中运行生成式 AI 推理工作负载的方式。将您的 EKS 集群扩展到本地基础架构允许您部署具有一致管理和降低操作复杂性的 AI 应用程序。Amazon EKS 提供托管的 Kubernetes 控制平面,而 EKS 混合节点使您能够将本地基础设施作为工作节点加入 Amazon EKS 控制平面,从而无需为本地部署管理 Kubernetes 控制平面。EKS 混合节点还允许您在单个 EKS 集群中同时运行云和本地容量。
EKS 混合节点支持各种 AI/机器学习 (ML) 用例和架构,例如:
- 在离用户更近的地方运行服务,以支持延迟敏感型工作负载,包括边缘的实时推理。
- 使用由于数据驻留要求而必须留在本地的数据训练模型。
- 使用您的知识库在离源数据更近的地方运行推理工作负载,例如 RAG 应用程序。
- 在需求高峰期间,使用亚马逊云科技云的弹性获得更多计算资源。
- 使用现有的本地硬件。
这篇文章描述了使用单个 EKS 集群通过 EKS 混合节点在本地运行 AI 推理以及使用 Amazon EKS 自动模式在亚马逊云科技云中运行 AI 推理的概念验证。EKS 自动模式可完全自动管理计算、存储和联网的 Kubernetes 集群。在 Amazon EKS 用户指南中了解有关 EKS 自动模式的更多信息。
解决方案概述
对于我们的示例推理工作负载,我们通过 NVIDIA NIM 部署模型。NVIDIA NIM 是由 NVIDIA 优化的微服务,用于在 GPU 上运行 AI 模型。我们创建了一个同时支持 EKS 混合节点和 EKS 自动模式的 EKS 集群,然后将我们的本地计算机作为混合节点加入到集群中。对于本地部署,我们先安装适用于 Kubernetes 的 NVIDIA 驱动程序和 NVIDIA 设备插件,然后再将模型部署到 EKS 混合节点。最后,我们将模型部署到 EKS 自动模式节点,这些节点预先配置了 NVIDIA GPU 和亚马逊云科技实例所需的驱动程序。本演练不包括为运行 EKS 混合节点建立混合网络和身份验证前提条件的步骤,这些步骤可在 Amazon EKS 用户指南中找到。

图 1:该图表概述了区域内同时包含 EKS 混合节点和 EKS 节点的 EKS 集群。
上图显示了我们在演练中使用的架构的高级示意图。Amazon Virtual Private Cloud (VPC) 有两个公有子网和两个托管 EKS 自动模式工作节点的私有子网。控制平面和 EKS 混合节点之间的通信通过 VPC 路由,出入/进入中转网关或虚拟私有网关,并通过私有网络连接。EKS 混合节点需要在本地环境和亚马逊云科技区域之间建立可靠的网络连接,这种连接可以通过亚马逊云科技点对点 VPN、Amazon Direct Connect 或用户管理的 VPN 解决方案建立。必须配置路由表、安全组和防火墙规则,以允许环境之间进行双向通信。
先决条件
要完成此解决方案,必须满足以下先决条件:
- Amazon VPC 有两个私有子网和两个公有子网,有通往互联网的路由。
- 本地网络和 Amazon VPC 之间的亚马逊云科技点对点 VPN 连接。
- 对于本地节点,来自 IPv4 RFC-1918 范围且与 VPC CIDR 范围不重叠的 CIDR 块,或 Kubernetes 服务 IPv4 CIDR。
- Amazon EKS 用户指南详细介绍了防火墙规则、路由表和安全组的混合节点联网要求。
- 本地计算机运行与混合节点兼容的操作系统,计算机映像中包含 NVIDIA 驱动程序和 NVIDIA 容器工具包。
- 用于访问 NIMS 的 NVIDIA NGC 账户和 API 密钥,请参阅 NVIDIA 文档。
- 以下工具:
- Helm 3.9+
- kubectl
- eksctl v0.205.0+
- 亚马逊云科技命令行界面 (亚马逊云科技 CLI)
演练步骤
以下步骤将引导您完成此解决方案。
创建启用 EKS 混合节点和启用 EKS 自动模式的集群
我们使用 eksctl(一种用于在 Amazon EKS 上创建和管理集群的 CLI 工具)来创建支持 EKS 混合节点和 EKS 自动模式的 EKS 集群。
- 创建 ClusterConfig 文件
cluster-configuration.yaml
。此文件包括启用 EKS 自动模式的autoModeConfig
和启用 EKS 混合节点的remoteNetworkConfig
文件。有关有效remoteNetworkConfig
值的更多信息,请参阅 EKS 混合节点文档中的创建集群。
- 创建 ClusterConfig 文件后,通过运行以下命令创建 EKS 集群:
- 等待集群状态变成
Active
。
准备混合节点
1. EKS 混合节点需要 kube-proxy 和 CoreDNS。通过运行以下 eksctl
命令安装插件。EKS 混合节点会自动收到 eks.amazonaws.com/compute-type
: hybrid
的标签。此标签可用于将工作负载定向到混合节点或远离混合节点。要了解有关使用 EKS 混合节点部署 Amazon EKS 插件的更多信息,请参阅为混合节点配置插件。
如果您在亚马逊云科技云中运行至少一个 CoreDNS 副本,则必须允许流向运行 CoreDNS 的 VPC 和节点的 DNS 流量。此外,您的本地远程 Pod CIDR 必须可以从 Amazon VPC 中的节点进行路由。有关运行混合模式集群的指导,请参阅 EKS 混合节点用户指南。
2. 您可以将本地节点作为 EKS 混合节点加入 Amazon EKS 控制平面。为此,请安装 EKS 混合节点 CLI nodeadm
,它会安装和配置将您的计算机转换为 EKS 工作节点所需的组件。这些组件包括 kubelet、containerd 和 aws-iam-authenticator。要在计算机上安装 nodeadm 并将节点加入集群,请按照 EKS 混合节点文档中连接混合节点中的步骤操作。在混合节点上运行工作负载之前,请安装兼容的容器网络接口 (CNI) 驱动程序。按照为混合节点配置 CNI,了解使用 EKS 混合节点设置 CNI 的步骤。
注册节点时,您可以修改 kubelet 配置以添加节点标签或污点,例如 topology.kubernetes.io/zone
,指定混合节点所在的区域。您还可以添加标签来表示附加的 GPU 的不同功能,以影响工作负载调度。对于混合使用 GPU 和非 GPU 容量的 EKS 混合节点容量,建议您为 GPU 节点添加 --register-with-taints=nvidia.com/gpu=Exists:NoSchedule
污点,这样非 GPU 工作负载(例如 CoreDNS)就不会在 GPU 节点上调度。查看混合节点文档,了解如何在使用 nodeadm
时修改 kubelet 配置。
3. 运行以下 kubectl 命令,验证您的节点是否已连接并处于 Ready
状态。必须安装 CNI 才能成为 Ready
混合节点。
为 Kubernetes 安装 NVIDIA 设备插件
本节假设您的本地 EKS 混合节点已配置必要的 NVIDIA 驱动程序和 NVIDIA 容器工具包。Kubernetes 设备插件可用于向 kubelet 发布系统硬件,例如 GPU。由于本演练使用 NVIDIA GPU,因此我们必须安装适用于 Kubernetes 的 NVIDIA 设备插件,才能将 GPU 设备暴露给 Kubernetes 调度器。如果您的计算机映像中未包含 NVIDIA 驱动程序和 NVIDIA 容器工具包,且配置为容器可以使用 NVIDIA 容器运行时,则可以改为部署 NVIDIA GPU 操作员,负责在运行时安装这些组件,以及 NVIDIA 设备插件。
1. 要使用 kubectl
安装 NVIDIA 设备插件,请先下载部署清单:
查看 NVIDIA 设备插件 GitHub 存储库以获取最新版本。
2. 您无需在 EKS 自动模式下安装 NVIDIA 设备插件,设备插件 DaemonSet 只能在具有 GPU 的混合节点上运行。使用标签 eks.amazonaws.com/compute-type: hybrid
将 NVIDIA 设备插件更新为目标混合节点,如果您混合使用 GPU 和非 GPU 工作节点,则在 .spec.template.spec.nodeSelector
中添加任何其他标签:
3. 通过应用清单安装 NVIDIA 设备插件:
4. 使用以下命令验证 NVIDIA 设备插件 pod 是否正在运行:
在 kube-system
列出 NVIDIA 设备插件的 Pod 时,您应该会看到以下输出,并且 DaemonSet 只能在带有 GPU 的节点上调度:
5. 你可以通过验证 GPU 状态在可分配的节点中是否可见,来检查 GPU 是否暴露在 kubelet 中:
以下显示了在列出附有 GPU 的节点时您期望看到的可分配节点:
部署 NVIDIA NIM 以在 EKS 混合节点上进行推理
1. 在部署 NVIDIA NIM 之前,请配置容器注册表和 NVIDIA API 密钥,这是先决条件,并将 NGC_API_KEY
替换为你的 API 密钥:
2. 通过运行以下命令克隆 NIM Helm 图:
3. 创建 Helm 图表替代项。将 NodeSelector 设置为以您的混合节点为目标。
您可以修改 values.yaml
文件中的镜像存储库以部署其他模型。
此部署不使用模型缓存。在扩展事件期间,您可能需要考虑使用模型缓存来加快应用程序初始化速度。要实现模型缓存,需要配置适当的 CSI 驱动程序和存储基础架构。
使用示例提示测试 NIM
1. 要测试 NIM 微服务,请创建到 NIM 服务的 Kubernetes 端口转发:
2. 运行以下 curl 命令并观察输出:
期待回应:
您已成功将模型部署到 EKS 混合节点。现在,您可以部署在同一 EKS 集群中运行的 EKS 自动模式节点的模型。
部署到 EKS 自动模式
您可以部署不需要在区域内的 EKS 混合节点上运行的工作负载。内置 EKS 自动模式的 NodePools 没有基于 GPU 的实例,因此你必须定义一个带有 GPU 的节点池。EKS 自动模式提供与 NVIDIA GPU 和 Neuron 设备的开箱即用集成,因此您无需安装驱动程序和设备插件。
1. 通过运行以下命令创建具有 g6
实例系列的节点池:
如果您的工作负载具有特定的网络带宽或实例 GPU 要求,则还可考虑设置其他知名的 EKS 自动模式支持标签。
2. 通过创建以下文件,更新 NVIDIA NIM 值,以便在 EKS 自动模式下部署:
3. 运行以下命令将 NIM Helm 版本升级到新版本:
4. 列出 EKS 自动模式已在该地区推出的 NodeClaims
,g6.xlarge
为 NVIDIA NIM 提供服务。
要进行测试,请重复前面的步骤,使用示例提示测试 NIM。
清理
为了不产生长期成本,请运行以下命令来清理本文中创建的所有亚马逊云科技资源:
如果不再需要作为先决条件的一部分创建的任何其他资源,请将其清除。
结论
这篇文章举例说明了 Amazon EKS 混合节点如何为 AI 工作负载提供动力。混合节点将您的 Kubernetes 占用空间统一到 Amazon EKS 上,从而无需管理 Kubernetes 控制平面并减少运营开销。
要了解更多信息并开始使用 EKS 混合节点,请参阅 EKS 混合节点用户指南并浏览 re: Invent 2024 会议 (KUB205),该会议解释了混合节点的工作原理、功能和最佳实践。有关在 Amazon EKS 上运行 AI/ML 工作负载的更多指导,请查看 EKS 数据项目。