近日,由Linux基金会、云原生计算基金会(CNCF)主办的云原生顶级盛会KubeCon+CloudNativeCon+Open Source Summit+China AI_dev 2024成功举办,浪潮云海高级软件工程师王成龙受邀出席会议,发表《通过功能化调度和RDMA加速无服务器AI大模型推理》主题演讲,以下为议题要点实录。
1 前言:今年是Kubernetes发展的十周年,在这十年里Kubernetes已经成为云原生的事实标准,根据云原生计算基金会(CNCF)调查报告,在2023年全球84%用户在生产中使用或计划使用Kubernetes,这更加巩固了其在云原生的技术地位。
与此同时,以ChatGPT为代表的AIGC技术也在迅猛地发展,将人们对AI期待推向一个新的高峰。从CNCF发布的云原生AI白皮书中我们看到,人工智能已经形成上云趋势,越来越多的AI应用正在借助Kubernetes强大的容器编排能力来提高开发和部署效率,容器和 Serverless 技术将成为未来 AI 应用开发的主要平台。
KServe作为Kubernetes上的模型推理平台,成为简化和加速机器学习模型部署、管理的重要工具。KServe最初是从 Kubeflow 项目中的 KFServing 演变而来的,从架构图中能够看出,它的底层是基于Kubernetes,对加速推理的设备进行统一管理;中间是Serverless层,依托于 Knative,支持 GPU 自动缩放、按需扩缩至零等功能;上层是支持的主流的机器学习框架、像PyTorch、Tensorflow。
总之KServe解决的就是把训练后的模型怎么快速上线提供服务的问题,简化AI模型的部署。
KServe 的 Serverless 层通过服务抽象、配置管理和流量路由实现了无服务器的 AI 模型推理。
Knative主要分为两部分:
1. 上半部分通过CRD自定义资源Configuration来管理Deployment的生命周期,每次修改Configuration都会生成一个Revision,Revision记录并对应着Deployment的一个版本,所以Knative基于这种机制来实现灰度发布的功能;
2. 下半部分通过CRD Route来定义流量的路由规则,将网络请求路由到特定的 Revision,从而实现流量切分功能。这使得不同版本的模型可以同时处理请求,进行平滑过渡和流量控制。
如何通过请求数来实现推理服务的冷启动和GPU自动弹性伸缩?
Knative提供两种访问模式:代理模式和直连模式。AI容器缩容到0后,当有推理请求时,这个时候为代理模式,请求先被送到Activator组件进行缓存,同时触发autoscaler进行快速扩容。扩容完成后,缓存的请求会被重新转发,并切换为直连模式,随后的流量就会直接请求到对应的Pod。这种动态切换模式设计,既能在没有请求时节省资源,又能在有请求时快速响应。
可以通过一个直观的例子来了解如何使用KServe快速部署AI推理服务:
第一步:创建InferenceService CR 资源,指定模型运行时和checkpoint存储路径
第二步:确定网关地址
第三步:进行推理请求
从架构图和示例中能够看出,KServe在Knative的基础上又进一步的抽象和封装,通过使用InferenceService这个CRD,KServe实现了对AI服务整个生命周期的管理。
每个 InferenceService 由多个组件组成:“预测器”、“解释器”和“转换器”:
这些组件协同工作,确保数据平面能够高效、准确地执行推理任务。KServe另一个大的优点就是模型服务的调用协议更加标准化和统一化,使得跨系统的集成更加方便,从而提升了模型推理的兼容性和灵活性
KServe原本的InferenceService是一个模型一个服务的模式,在部署大量模型的情况下,会面临计算资源限制(每个 Pod 中注入了 Sidecar,每个 InferenceService 额外增加 0.5核 CPU 和 0.5G 内存开销)、最大 Pod 限制(Kubernetes建议每个节点最多 110 个 Pod,假设每个 InferenceService 平均有 4 个 Pod,50 节点集群最多可以运行 1000 个模型)、最大IP地址限制(4096 个 IP 地址的集群最多可以部署 1024 个模型)
因此KServe开发了ModelMesh技术,一个Pod可以加载多个模型,这些模型可以共享GPU,由Mesh层来调度转发推理请求,Puller负责模型拉取,提高资源利用率。
ML 推理系统越来越大、越来越复杂,它们通常由许多模型组成,才能做出单一预测。例如,人脸识别需要先在图像中定位人脸区域,然后计算人脸的特征以匹配数据库中的记录。所以KServe推理图允许用户将多个机器学习模型和处理步骤链接在一起,形成一个图形化的推理工作流。这种方法使得用户能够在单一的推理请求中组合多个模型的输出和处理逻辑,简化了复杂机器学习应用的部署和管理。
浪潮云海云操作系统 InCloud OS 是浪潮面向私有云领域,以可继承、可演进为理念自研的一套开放、稳定、高效、安全的云平台软件,提供云主机、容器、数据库、中间件、云安全等服务和智能运维、灵活运营等能力,助力政企数字化转型。
整体架构秉承可继承、可演进的理念,横向上各组件灵活选配,不强绑定;纵向上各层次间分层解耦,开放融合。
AI 服务的生产流程涵盖了从数据准备、模型训练与微调,到模型推理服务上线的全周期管理,形成一个自我增强的闭环。在推理阶段生成的结果以及使用过程中收集的新数据,会回流至数据处理环节,持续推动模型的优化与迭代
浪潮云海推理模型的上云过程有如下步骤, 为了将导出的推理数据,也就是checkpoint存储到浪潮的分布式文件系统里, 以PVC的形式进行统一数据管理:
① 创建持久卷声明 (PVC)
② 创建一个 Pod 来访问 PVC
③ 将模型存储在持久卷上
④ 自定义运行时:基于KServe API 实现自定义 REST ServingRuntime 模型
⑤ 部署新的推理服务
⑥ 执行推理请求
通过一系列步骤确保了模型可以顺利地在云端环境中运行,满足实际业务需求。
在模型推理服务上云和使用的过程中,浪潮云海团队遇到了多个技术挑战。
浪潮云海的解决方案:
浪潮云海的解决方案:
浪潮云海的解决方案:
为了解决上述问题,浪潮云海提出了函数化的控制平面设计。通过将控制平面解耦成可拓展的控制函数,根据请求负载动态地调整每个控制函数的实例数量,应对扩容请求的高并发和稀疏性特征。弹性Serverless控制平面的设计如图所示,浪潮云海设计了一个顶层控制平面用于协调和管理函数化控制平面,它会根据请求负载动态地区调整每个控制模块的实例数量,而函数化控制平面使用解耦出的各个控制函数去管理数据平面的各个函数实例。
为了实现快速调度,浪潮云海进行了动态分区和探测两大设计。为了避免调度冲突,将节点拆分为多个分区,每个分区由单独的控制函数进行管理和调度,实现对于调度质量和调度速度的权衡。在分区资源不足时,控制函数会探测其他分区的可用资源并进行任务迁移,控制函数级的探测相比集中架构和节点级的探测开销显著降低,并且额外设计了探测缓存进行分区的预先过滤,可以进一步降低探测开销。总结:浪潮云海团队积极参与CNCF等开源社区活动,并持续为社区做出贡献。未来,浪潮云海将持续深入参与社区,聚焦资源调度、云原生AI、Serverless等方向,助力构建更为开放、智能的云原生基础设施,推动全球开源技术的落地与创新。
注:转载自浪潮云海