摘要:Kubernetes 已成为现代基础设施的基石,特别是在部署、扩展和管理人工智能和机器学习 (AI/ML) 工作负载方面。随着组织越来越依赖机器学习模型来完成数据处理、模型训练和推理等关键任务,Kubernetes 提供了有效管理这些复杂工作负载所需的灵活性和
了解如何在 Kubernetes 中管理 AI/ML 工作负载,并按照分步教程部署基于 TensorFlow 的情感分析模型示例。
编者注:以下是为 DZone 的 2024 年趋势报告《企业中的 Kubernetes:曾经定义十年,现在在 SDLC 中打造未来》撰写并发表的文章。
Kubernetes 已成为现代基础设施的基石,特别是在部署、扩展和管理人工智能和机器学习 (AI/ML) 工作负载方面。随着组织越来越依赖机器学习模型来完成数据处理、模型训练和推理等关键任务,Kubernetes 提供了有效管理这些复杂工作负载所需的灵活性和可扩展性。通过利用 Kubernetes 强大的生态系统,可以动态编排 AI/ML 工作负载,确保跨云环境的最佳资源利用率和高可用性。 Kubernetes 和 AI/ML 之间的这种协同作用使组织能够以更高的敏捷性和可靠性部署和扩展其 ML 工作负载。
本文深入探讨了在 Kubernetes 中管理 AI/ML 工作负载的关键方面,重点关注特定于该平台的资源分配、扩展和自动化策略。通过解决 Kubernetes 环境中 AI/ML 任务的独特需求,它提供了实用的见解来帮助组织优化其 ML 操作。无论是处理资源密集型计算还是自动化部署,本指南都提供了利用 Kubernetes 提高 AI/ML 工作流程的性能、效率和可靠性的可行建议,使其成为现代企业不可或缺的工具。
为了有效管理 Kubernetes 中的 AI/ML 工作负载,首先了解平台的架构和组件非常重要。
图 1. Kubernetes 架构
如需了解更多信息,或查看图 1 中架构的各个组件,请查看Kubernetes 文档。
AAI/ML 工作负载是计算任务,涉及训练机器学习模型、根据这些模型进行预测(推理)以及处理大型数据集以获取见解。 AI/ML 工作负载对于推动现代企业创新和制定数据驱动型决策至关重要:
模型训练使系统能够从大量数据集中学习,揭示为智能应用程序提供动力的模式。推理允许这些模型生成实时预测,增强用户体验并自动化决策过程。高效的数据处理对于将原始数据转化为可操作的见解至关重要,从而推动整个人工智能/机器学习管道的发展。然而,管理这些计算密集型任务需要强大的基础设施。这就是 Kubernetes 发挥作用的地方,它提供有效处理 AI/ML 工作负载所需的可扩展性、自动化和资源管理,确保它们在生产环境中无缝运行。
成功管理 Kubernetes 中的 AI/ML 工作负载需要仔细关注几个关键因素。本节概述了确保针对 Kubernetes 环境中的性能和可靠性优化 AI/ML 工作负载的关键注意事项。
在 Kubernetes 上部署 AI/ML 工作负载时,有效的资源管理至关重要。 AI/ML 任务,特别是模型训练和推理,是资源密集型任务,通常需要专门的硬件,例如 GPU 或 TPU。 Kubernetes 允许通过资源请求和限制来有效分配 CPU、内存和 GPU 。这些配置确保容器拥有必要的资源,同时防止它们独占节点容量。
此外,Kubernetes 支持使用节点选择器和污点/容忍将工作负载分配给具有所需硬件的节点(例如 GPU 节点)。有效管理资源有助于优化集群性能,确保 AI/ML 任务顺利运行,而不会过度配置或利用基础设施不足。处理资源密集型任务需要仔细规划,特别是在管理需要跨多个节点运行的分布式训练作业时。这些工作负载受益于 Kubernetes 分配资源的能力,同时确保高优先级任务获得足够的计算能力。
可扩展性是管理 Kubernetes 中的 AI/ML 工作负载的另一个关键因素。水平扩展(即添加额外的 Pod 来处理增加的需求)对于无状态工作负载(例如可以轻松分布在多个 Pod 之间的推理任务)特别有用。垂直扩展涉及增加单个 Pod 可用的资源(例如,更多的 CPU 或内存),这对于资源密集型流程(例如需要更多功率来处理大型数据集的模型训练)可能是有益的。
除了 Pod 自动缩放之外,Kubernetes 集群还受益于集群自动缩放,可以根据需求动态调整工作节点的数量。 Karpenter特别适合 AI/ML 工作负载,因为它能够根据实时资源需求快速配置和扩展节点。 Karpenter 通过选择最合适的实例类型和区域来优化节点放置,同时考虑 GPU 或内存需求等工作负载要求。通过利用 Karpenter,Kubernetes 集群可以在资源密集型 AI/ML 任务期间高效扩展,确保工作负载具有足够的容量,而不会在空闲时间过度配置资源。这可以提高成本效率和资源利用率,特别是对于需要按需可扩展性的复杂 AI/ML 操作。
这些自动扩展机制使 Kubernetes 能够动态调整工作负载需求,从而优化成本和性能。
AI/ML 工作负载通常需要访问大型数据集以及模型检查点和日志的持久存储。 Kubernetes 提供了多种持久存储选项来满足这些需求,包括PersistentVolumes (PV) 和 PersistentVolumeClaims (PVC)。这些选项允许工作负载跨各种云和本地环境访问持久存储。此外,Kubernetes 还与AWS EBS 、 Google Cloud Storage和Azure Disk Storage等云存储解决方案集成,从而可以更轻松地管理混合或多云设置中的存储。
处理大量训练数据需要高效的数据管道,可以将数据流式或批量处理到集群中运行的模型中。这可能涉及与外部系统(例如分布式文件系统或数据库)集成,以及使用Apache Kafka等工具进行实时数据摄取。正确管理数据对于维护高性能 AI/ML 管道至关重要,确保模型能够快速可靠地访问训练和推理所需的数据。
自动化是管理 AI/ML 工作流程复杂性的关键,尤其是在将模型部署到生产中时。 CI/CD 管道可以自动化构建、测试和部署过程,确保模型持续集成和部署,而需要最少的手动干预。 Kubernetes 与Jenkins 、 GitLab CI/CD和Argo CD等 CI/CD 工具很好地集成,从而实现模型部署的无缝自动化。用于自动化 AI/ML 部署的工具和最佳实践包括使用Helm来管理 Kubernetes 清单、使用Kustomize进行配置管理以及使用Kubeflow来编排 ML 工作流程。这些工具有助于标准化部署过程、减少错误并确保跨环境的一致性。通过自动化部署,组织可以快速迭代 AI/ML 模型、响应新数据并有效扩展其运营,同时保持快节奏的 AI/ML 项目所需的敏捷性。
与传统应用程序相比,AI/ML 工作负载的调度和编排需要更细致的方法。 Kubernetes 擅长通过其灵活而强大的调度机制来管理这些不同的调度需求。批量调度通常用于模型训练等任务,其中大型数据集以块的形式进行处理。 Kubernetes 通过允许这些作业在资源可用时排队和执行来支持批量调度,这使得它们非常适合对时间不敏感的非关键工作负载。 Kubernetes Job 和 CronJob 资源对于根据特定条件或计划自动执行批处理作业特别有用。
另一方面,实时处理用于模型推理等延迟至关重要的任务。 Kubernetes 通过提供 Pod 优先级和抢占等机制来确保低延迟,确保实时工作负载能够立即访问必要的资源。此外,Kubernetes的HorizontalPodAutoscaler可以根据需求动态调整Pod数量,进一步支持实时处理任务的需求。通过利用这些 Kubernetes 功能,组织可以确保高效且有效地执行批量和实时 AI/ML 工作负载。
组调度是 AI/ML 工作负载分布式训练的另一个重要概念。分布式训练涉及将模型训练任务分解到多个节点以减少训练时间,而组调度则确保跨节点的所有所需资源都得到同时调度。这对于分布式训练至关重要,其中工作的所有部分必须一起开始才能正常运行。如果没有组调度,某些任务可能会开始,而其他任务仍在等待资源,从而导致效率低下和训练时间延长。 Kubernetes 通过Volcano等自定义调度程序支持组调度,该调度程序专为高性能计算和 ML 工作负载而设计。
AI/ML 工作负载的性能考虑因素不仅仅是资源分配;它们还涉及延迟和吞吐量的优化。
延迟是指处理任务所需的时间,这对于模型推理等实时 AI/ML 工作负载至关重要。确保低延迟对于在线推荐、欺诈检测或任何需要实时决策的用例等应用程序至关重要。 Kubernetes 可以通过优先考虑实时工作负载来管理延迟,使用节点亲和性等功能来确保推理任务放置在网络跳数最少或与数据源邻近的节点上。
另一方面,吞吐量是指在给定时间范围内可以处理的任务数量。对于 AI/ML 工作负载,特别是在批处理或分布式训练等场景中,高吞吐量至关重要。优化吞吐量通常涉及跨多个 Pod 和节点水平扩展工作负载。 Kubernetes 的自动扩展功能与优化的调度相结合,确保 AI/ML 工作负载保持高吞吐量——即使需求增加也是如此。在延迟和吞吐量之间实现适当的平衡对于 AI/ML 管道的效率至关重要,确保模型在满足实际应用需求的同时发挥最佳性能。
分步指南:在 AWS EKS 上部署 TensorFlow 情绪分析模型在此示例中,我们演示如何使用AWS Elastic Kubernetes Service (EKS) 部署基于TensorFlow的情感分析模型。本实践指南将引导您设置基于 Flask 的 Python 应用程序、使用 Docker 将其容器化,以及使用 Kubernetes 将其部署在 AWS EKS 上。尽管许多工具都适用,但本示例选择 TensorFlow 是因为它在开发 AI/ML 模型方面很受欢迎且稳健,而 AWS EKS 提供了可扩展且托管的 Kubernetes 环境,可以简化部署过程。
通过遵循本指南,读者将获得在云原生环境中部署 AI/ML 模型、利用 Kubernetes 进行高效资源管理和可扩展性的实用见解。
第 1 步:创建基于 Flask 的 Python 应用程序设置
使用Hugging Face 转换器管道创建 Flask 应用程序 ( app.py ) 进行情感分析:
rom flask import Flask, request, jsonifyfrom transformers import pipelineapp = Flask(__name__)sentiment_model = pipeline("sentiment-analysis")@app.route('/analyze', methods=['POST'])def analyze: data = request.get_json result = sentiment_model(data['text']) return jsonify(result)if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)第2步:创建requirements.txt
transformers==4.24.0torch==1.12.1flaskjinja2markupsafe==2.0.1第3步:构建Docker镜像
创建一个 Dockerfile 来容器化应用程序:
FROM python:3.9-slimWORKDIR /appCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .CMD ["python", "app.py"]构建并推送 Docker 镜像:
docker build -t brainupgrade/aiml-sentiment:20240825 .docker push brainupgrade/aiml-sentiment:20240825步骤 4:使用 Karpenter 部署到 AWS EKS
创建 Kubernetes 部署清单 ( deployment.yaml ):
apiVersion: apps/v1kind: Deploymentmetadata: name: sentiment-analysisspec: replicas: 1 selector: matchLabels: app: sentiment-analysis template: metadata: labels: app: sentiment-analysis spec: containers: - name: sentiment-analysis image: brainupgrade/aiml-sentiment:20240825 ports: - containerPort: 5000 resources: requests: aws.amazon.com/neuron: 1 limits: aws.amazon.com/neuron: 1 tolerations: - key: "aiml" operator: "Equal" value: "true" effect: "NoSchedule"将部署应用到 EKS 集群:
kubectl apply -f deployment.yamlKarpenter 将自动扩展集群并根据资源规范启动inf1.xlarge EC2实例 ( aws.amazon.com/neuron: 1 )。 Karpenter 还为inf1.xlarge这个特殊的 AWS EC2 实例安装了适当的设备驱动程序,该实例针对深度学习推理进行了优化,具有四个 vCPU、16 GiB RAM 和一个 Inferentia 芯片。
参考Karpenter规范如下:
apiVersion: karpenter.sh/v1alpha5kind: Provisionermetadata: name: defaultspec: limits: resources: cpu: "16" provider: instanceProfile: eksctl-KarpenterNodeInstanceProfile- securityGroupSelector: karpenter.sh/discovery: subnetSelector: karpenter.sh/discovery: requirements: - key: karpenter.sh/capacity-type operator: In values: - spot - key: node.kubernetes.io/instance-type operator: In values: - inf1.xlarge - key: kubernetes.io/os operator: In values: - linux - key: kubernetes.io/arch operator: In values: - amd64 ttlSecondsAfterEmpty: 30第 5 步:测试应用程序
通过AWS 负载均衡器或 Ingress部署并公开后,使用以下 cURL 命令测试应用程序:
curl -X POST -H "Content-Type: application/json" -d '{"text":"I love using this product!"}' https:///analyze此命令将情感分析请求发送到已部署的模型端点: https:///analyze 。
在 Kubernetes 中管理 AI/ML 工作负载也面临着一系列挑战,从处理临时容器到确保安全性和维护可观察性。在本节中,我们将详细探讨这些挑战并提供实用的解决方案,帮助您在 Kubernetes 环境中有效管理 AI/ML 工作负载。
在 Kubernetes 中管理 AI/ML 工作负载的主要挑战之一是在维护状态的同时处理临时容器。容器被设计为无状态的,这可能会使需要持久存储数据集、模型检查点或中间输出的 AI/ML 工作流程变得复杂。为了维护临时容器中的状态,Kubernetes 提供了 PV 和 PVC,即使容器本身是短暂的,也可以长期存储 AI/ML 工作负载。
另一个重大挑战是确保安全性和合规性。 AI/ML 工作负载通常涉及敏感数据,维护多个级别的安全性(网络、访问控制和数据完整性)对于满足合规性标准至关重要。为了应对安全挑战,Kubernetes 提供基于角色的访问控制 (RBAC) 和网络策略。 RBAC确保用户和服务仅拥有必要的权限,从而最大限度地降低安全风险。网络策略允许对网络流量进行细粒度控制,确保敏感数据在集群内受到保护。
此外,可观察性是 Kubernetes 环境中的一个关键挑战。 AI/ML 工作负载可能很复杂,具有大量微服务和组件,因此很难实时监控性能、跟踪资源使用情况和检测潜在问题。监控和日志记录对于 Kubernetes 中的可观察性至关重要。 Prometheus和Grafana等工具为监控系统运行状况、资源使用情况和性能指标提供了强大的解决方案。 Prometheus 可以从 AI/ML 工作负载中收集实时指标,而 Grafana 可以可视化这些数据,为管理员提供可操作的见解。它们共同实现主动监控,使团队能够在潜在问题影响运营之前识别并解决它们。
在本文中,我们探讨了在 Kubernetes 中管理 AI/ML 工作负载的关键注意事项,重点关注资源管理、可扩展性、数据处理和部署自动化。我们介绍了一些基本概念,例如高效的 CPU、GPU 和 TPU 分配、扩展机制以及使用持久存储来支持 AI/ML 工作流程。此外,我们还研究了 Kubernetes 如何使用 RBAC 和 NetworkPolicies 等功能以及 Prometheus 和 Grafana 等工具来确保 AI/ML 工作负载的安全性、可观察性和监控。
展望未来,Kubernetes 中的 AI/ML 工作负载管理预计将随着硬件加速器和 Karpenter 等更智能的自动扩展解决方案的进步而发展。 AI 驱动的编排工具的集成以及 Kubernetes 原生 ML 框架的出现将进一步简化和优化 AI/ML 操作,从而更轻松地扩展复杂模型并处理不断增长的数据需求。
对于从业者来说,及时了解最新的 Kubernetes 工具和最佳实践至关重要。持续学习和适应新技术将使您能够有效管理 AI/ML 工作负载,确保生产环境中的稳健、可扩展和高性能应用程序。
来源:AI中国一点号