【阅读原文】戳:应对IDC资源紧缺:ACK Edge如何解决LLM推理服务的弹性挑战
背景
春节期间,国产大模型DeepSeek凭借其卓越的性能和创新能力在全球范围内迅速走红,引发了广泛的关注和讨论。然而,随着访问量的急剧攀升,其推理服务器资源很快变得捉襟见肘,最终不得不暂停API充值服务。这一系列事件让业界认识到,大语言模型(LLM)的推理业务正逐渐成为AI产业竞争的又一个至关重要的业务场景。
LLM推理业务的需求往往呈现出显著的潮汐流量特性,在某些特定时间段内,需求量会急剧增加,而在其他时间段则相对较低。这种不均衡的流量模式对GPU计算资源的分配和管理提出了严峻的挑战。特别是在线下数据中心(IDC)中部署LLM推理服务时,常常会遇到高峰期计算资源不足,而低峰期资源闲置的问题。这不仅导致了资源的浪费,还会影响服务的高可用性和响应速度,进而影响用户体验和业务连续性。为了解决这一问题,我们基于ACK Edge提供了一套混合云LLM弹性推理解决方案。通过ACK Edge统一管理云上和云下的计算资源,业务低峰期优先使用线下GPU资源进行推理任务,在业务高峰期,当线下资源不足时,ACK Edge能够迅速弹出云上的GPU资源来承接业务流量。通过该方案,企业可以显著降低LLM推理服务的运营成本,根据实际需求动态调整资源的使用,避免了在低峰期不必要的资源开支,同时也确保了在高峰期能够获得足够的计算能力来满足业务需求。这种灵活的资源利用方式,不仅确保了服务的稳定性,还能有效避免资源的闲置和浪费。
方案介绍
整体架构
整体方案基于阿里云容器服务Edge版(ACK Edge)实现,利用ACK Edge云边一体化管理的能力,统一纳管云上云下的计算资源,实现计算任务的动态分配。此外,我们在集群中采用KServe来配置弹性策略,快速部署一套LLM弹性推理服务。
在业务低峰期,该方案通过ACK Edge的自定义资源优先级调度(ResourcePolicy)能力设置资源池的优先级,保证优先使用云下资源池进行推理任务。当业务进入高峰期,借助ACK Edge的强大监控能力,KServe能够实时监测GPU资源的使用情况和业务负载,根据实际需求动态扩容推理服务的副本数。此时线下GPU资源池可能无法满足突增的计算需求。通过预先配置的弹性节点池,系统能够迅速自动地弹出云上GPU资源,快速承接业务的流量峰值,确保服务的连续性和稳定性。
关键技术
1. ACK Edge
ACK Edge是一款提供标准Kubernetes集群云端托管,支持边缘计算资源、业务快速接入、统一管理、统一运维的云原生应用平台,能够帮助用户快速实现云边一体协同。面向云端,通过ACK Edge,用户可以直接享受到阿里云丰富的云上生态能力,如网络、存储、弹性、安全、监控、日志等。面向边缘,ACK Edge针对边缘场景面对的复杂的环境,提供了边缘节点自治、跨网域容器网络方案、多地域工作负载和服务管理等一系列的支持来解决边缘场景的痛点问题。
2. KServe
KServe是一个开源的云原生模型服务平台,旨在简化在Kubernetes上部署和运行机器学习模型的过程,支持多种机器学习框架、具备弹性扩容能力。KServe通过定义简单的YAML文件,提供声明式的API来部署模型,使得配置和管理模型服务变得更加容易。
KServe提供了一系列自定义资源(CRD),用于管理和提供机器学习模型的服务。并针对TensorFlow、XGBoost、scikit-learn、PyTorch和Huggingface Transformer/LLM等模型,提供了易用的高级接口及标准化的数据平面协议。此外,KServe隐藏了自动扩缩(AutoScaling)、网络、健康检查和服务器配置的复杂操作,实现了GPU的自动扩缩、按需扩缩至零(Scale to Zero)功能以及灰度发布能力(Canary Rollouts),简化了AI模型的部署和维护流程。
3. 弹性节点池(节点自动伸缩)
节点自动伸缩是一种自动调整集群资源的机制,以应对应用Pod的调度需求。主要由cluster-autoscaler组件负责,它定期检查集群状态,自动扩展或缩减节点。当Pod因资源不足无法调度时,节点伸缩机制会监听并判断是否需要扩容。它会模拟调度过程,找到能满足需求的节点池,并自动添加节点。这种自动化伸缩机制能高效管理资源,确保应用稳定运行。
4. resourcePolicy(自定义弹性资源优先级调度)
自定义弹性资源优先级调度是ACK Edge调度器提供的一项高级弹性调度策略,旨在满足企业对不同类型的资源的精细化管理需求。通过这一策略,用户可以在应用发布或扩容过程中,灵活自定义资源策略(ResourcePolicy),以精准控制应用实例Pod在不同类型节点资源上的调度顺序。
具体而言,用户可以根据业务需求和资源特性,预先定义好Pod调度的优先级顺序。例如,可以将高性能计算节点优先分配给对计算资源要求较高的应用实例,而将存储资源丰富的节点优先分配给需要大量存储数据的应用实例。此外,在应用缩容过程中,自定义弹性资源优先级调度策略能够按照发布或扩容时的调度顺序逆序进行缩容。这意味着,最先被调度到高性能计算节点的Pod,将在缩容时最后被释放,而最先被调度到存储资源丰富节点的Pod,将在缩容时最先被释放。
快速实践
1. 集群环境准备
a. 创建ACK Edge集群[1]
b. 创建弹性节点池[2]
c. 集群中安装KServe[3]
d. 配置Arena客户端[4]
e. 部署监控组件并配置GPU监控指标[5]
完成后,集群中的资源可以按照节点池划分为三类:
• 云上管控资源池:部署ACK Edge,KServe,autoscaler等管控组件的云上节点池
• IDC资源池:包含用户的线下IDC资源,承载LLM推理服务
• 云上弹性资源池:根据集群资源使用情况灵活伸缩,在高峰期承载LLM推理服务
2. AI模型准备
您可以使用OSS或NAS准备模型数据,具体操作可以参考部署vLLM推理应用文档[6]中的第一步。
3. 定义调度优先级
您可以通过创建ResourcePolicy CRD来定义弹性资源优先级调度规则。举一个例子,在这里,我们为labelSelector匹配app: isvc.qwen-predictor的应用定义了一个规则。这个规则明确了,这类应用应该优先调度到 IDC资源池,然后才调度到云上弹性资源池。关于Resource Policy的具体使用说明,可以参考如何自定义Pod调度顺序_容器服务Kubernetes版ACK(ACK)-阿里云帮助中心[7]。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: qwen-chat namespace: default spec: selector: app: isvc.qwen-predictor # 此处要与后续创建的Pod的label相关联。 strategy: prefer units: - resource: ecs nodeSelector: alibabacloud.com/nodepool-id: npxxxxxx #IDC资源池 - resource: elastic nodeSelector: alibabacloud.com/nodepool-id: npxxxxxy #弹性资源池
4. 部署LLM推理服务
通过arena客户端,您可以用一条命令拉起一个基于KServe部署的弹性LLM推理服务。在命令行参数里,这条命令定义了这个推理服务的名称为qwen-chat,使用vllm推理框架,使用GPU卡利用率(DCGM_CUSTOM_PROCESS_SM_UTIL,其他指标可以参考文档[8])这个指标来进行应用的弹性伸缩,当GPU利用率超过50%开始扩容副本,最小副本是1,最大副本是3,每个Pod需要一张gpu卡,4核12G配置,模型存储在提前准备好的llm-model中。
arena serve kserve \ --name=qwen-chat \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \ --scale-metric=DCGM_CUSTOM_PROCESS_SM_UTIL \ --scale-target=50 \ --min-replicas=1 \ --max-replicas=3 \ --gpus=1 \ --cpu=4 \ --memory=12Gi \ --data="llm-model:/mnt/models/Qwen" \ "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"
部署完成后,我们就得到了一个弹性伸缩的LLM推理服务。我们可以通过直接请求该服务来验证是否部署成功,请求的地址可以在KServe自动创建的Ingress资源详情中找到。
curl -H "Host: qwen-chat-default.example.com" \ -H "Content-Type: application/json" \ http://xx.xx.xx.xx:80/v1/chat/completions \ -X POST \ -d '{"model": "qwen", "messages": [{"role": "user", "content": "你好"}], "max_tokens": 512, "temperature": 0.7, "top_p": 0.9, "seed": 10, "stop":["<|endoftext|>", "<|im_end|>", "<|im_start|>"]}'
5. 模拟业务高峰请求
接下来我们通过压测工具hey来模拟发送大量的请求到这个服务中。
hey -z 2m -c 5 \ -m POST -host qwen-chat-default.example.com \ -H "Content-Type: application/json" \ -d '{"model": "qwen", "messages": [{"role": "user", "content": "测试一下"}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10}' \ http://xx.xx.xx.xx:80/v1/chat/completions
首先这些请求会发送到现有的Pod,由于请求太多GPU使用率上升超过阈值,此时触发了我们之前定义的应用HPA规则,开始扩容Pod副本数,可以看到下图中出现了三个副本。
由于在我们的测试环境中IDC只有一张卡,扩容出的两个Pod找不到可用的资源,处于pending状态。此时pending的Pod触发了弹性节点池节点伸缩,auto-scaler会自动弹出两个云上的GPU节点来承载这两个Pod。
总结
LLM推理业务的潮汐流量特性导致了计算资源的分配难题。本文中我们基于ACK Edge提供了一种混合云LLM弹性推理解决方案,通过统一管理云上和云下资源,实现在低峰期优先使用线下GPU资源,高峰期自动扩展云上资源。该方案能动态调整资源,显著降低运营成本,确保服务稳定性和资源高效利用。
欢迎加入ACK Edge客户交流钉钉群,与我们一同交流。(钉钉群号:21976595)
相关链接:
[1] ACK Edge集群
https://help.aliyun.com/zh/ack/ack-edge/user-guide/create-an-ack-edge-cluster-1
[2] 创建弹性节点池
[3] 安装KServe
[4] 配置Arena客户端
https://help.aliyun.com/zh/ack/cloud-native-ai-suite/user-guide/install-arena#task-1917487
[5] 部署监控组件并配置GPU监控指标
[6] 部署vLLM推理应用文档
[7] 如何自定义Pod调度顺序_容器服务Kubernetes版ACK(ACK)-阿里云帮助中心
[8] 文档
我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。
获取关于我们的更多信息~