为解决混合云场景下部署LLM推理业务时,流量的不均衡带来的数据中心GPU资源分配问题,ACK Edge集群提供了一套混合云LLM弹性推理解决方案,帮您统一管理云上和云下的GPU资源,低峰期优先使用云下数据中心资源,高峰期资源不足时快速启用云上资源。该方案帮您显著降低LLM推理服务运营成本,动态调整并灵活利用资源,保障服务稳定性,避免资源闲置。
方案介绍
整体架构
该方案采用ACK Edge集群的云边一体化管理能力,统一纳管云上云下计算资源,实现计算任务的动态分配。您可以在集群中通过KServe来配置弹性策略,快速部署一套LLM弹性推理服务。
在业务低峰期时,您可以在集群中通过自定义资源优先级调度(ResourcePolicy)来自定义资源调度优先级,优先使用线下资源进行推理。
在业务高峰期时,通过ACK Edge集群的监控能力,KServe实时监测GPU使用情况和工作负载,动态扩容推理服务的副本数。当线下GPU资源不足时,系统通过预先配置的弹性节点池迅速启用云上GPU资源,保障服务连续性和稳定性。
推理请求:大量用户请求触发推理服务扩容。
资源调度:优先调度到云下IDC资源池。
云上扩容:当云下IDC资源不足时,调度至云上预先配置的弹性节点池启用云上资源。
关键技术
该方案涉及到的关键技术有ACK Edge集群、KServe、弹性节点池(节点自动伸缩)、ResourcePolicy(自定义弹性资源优先级调度)。
使用示例
准备环境。
准备工作完成后,将集群中的资源按照节点池划分为三类:
类别
节点池类型
作用
示例
云上管控资源池
云端
用于部署ACK Edge集群,KServe等管控组件的云上节点池。
default-nodepool
IDC资源池
边缘/专用型
线下数据中心资源,用于承载LLM推理服务。
GPU-V100-Edge
云上弹性资源池
云端
根据集群GPU资源使用情况灵活扩容,用于在高峰期承载LLM推理服务。
GPU-V100-Elastic
准备AI模型。
您可以使用OSS或NAS准备模型数据。具体操作,请参见准备模型数据并上传OSS Bucket。
定义调度优先级。
通过创建ResourcePolicy CRD来定义弹性资源优先级调度规则。本示例中,labelSelector匹配了
app: isvc.qwen-predictor
的应用来定义规则,此规则明确应用应该优先调度到IDC资源池,然后再调度到云上弹性资源池。更多ResourcePolicy使用说明,请参见自定义弹性资源优先级调度。重要后续创建应用Pod时,需要为其添加与以下labelSelector一致的Label,用于关联此处定义的调度策略。
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资源池,替换为您的IDC资源池ID。 - resource: elastic nodeSelector: alibabacloud.com/nodepool-id: npxxxxxy # 云上弹性资源池。替换为您的云上弹性资源池ID。
部署LLM推理服务。
在Arena客户端执行以下命令,启动一个基于KServe部署的弹性LLM推理服务。
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"
参数
是否必选
说明
示例值
--name
是
提交的推理服务名称,全局唯一。
qwen-chat
--image
是
推理服务的镜像地址。本示例使用vllm推理框架。
kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1
--scale-metric
否
应用弹性伸缩标准。本示例使用GPU卡利用率
DCGM_CUSTOM_PROCESS_SM_UTIL
这个指标进行应用伸缩。更多指标,请参见配置HPA。DCGM_CUSTOM_PROCESS_SM_UTIL
--scale-target
否
应用伸缩目标。当GPU利用率超过50%时,开始扩容副本。
50
--min-replicas
否
最小副本数。
1
--max-replicas
否
最大副本数。
3
--gpus
否
推理服务需要使用的GPU卡数。默认值为0。
1
--cpu
否
推理服务需要使用的CPU数量。
4
--memory
否
推理服务需要使用的内存数量。
12Gi
--data
否
服务的模型地址,本示例指定的模型存储在llm-model中,挂载到容器的/mnt/models/目录下。
"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推理服务是否部署成功。
curl -H "Host: qwen-chat-default.example.com" \ # 该地址从KServe自动创建的Ingress资源详情中获取。 -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|>"]}'
通过压测工具Hey发送大量的请求到已部署的LLM推理服务中,模拟业务流量高峰时触发云上资源扩容。
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利用率上升超过阈值50%时,将会触发之前定义的应用HPA规则,开始扩容Pod副本数,如下图中出现了3个Pod副本。
由于示例的测试环境中IDC只有1张GPU卡,扩容出的2个Pod找不到可用的资源,处于
pending
状态。此时,pending
状态的Pod自动触发了云上弹性节点池节点伸缩,cluster-autoscaler会自动弹出2个云上GPU节点来承载这2个Pod。
相关文档
更多推理任务部署,请参见AI服务部署。
更多ACK Edge集群云上弹性介绍,请参见云上弹性。
如需加速边缘节点访问OSS文件,请参见使用Fluid加速边缘节点访问OSS文件。