在ACK Edge集群中部署混合云LLM弹性推理

为解决混合云场景下部署LLM推理业务时,流量的不均衡带来的数据中心GPU资源分配问题,ACK Edge集群提供了一套混合云LLM弹性推理解决方案,帮您统一管理云上和云下的GPU资源,低峰期优先使用云下数据中心资源,高峰期资源不足时快速启用云上资源。该方案帮您显著降低LLM推理服务运营成本,动态调整并灵活利用资源,保障服务稳定性,避免资源闲置。

方案介绍

整体架构

该方案采用ACK Edge集群的云边一体化管理能力,统一纳管云上云下计算资源,实现计算任务的动态分配。您可以在集群中通过KServe来配置弹性策略,快速部署一套LLM弹性推理服务。

  • 在业务低峰期时,您可以在集群中通过自定义资源优先级调度(ResourcePolicy)来自定义资源调度优先级,优先使用线下资源进行推理。

  • 在业务高峰期时,通过ACK Edge集群的监控能力,KServe实时监测GPU使用情况和工作负载,动态扩容推理服务的副本数。当线下GPU资源不足时,系统通过预先配置的弹性节点池迅速启用云上GPU资源,保障服务连续性和稳定性。

image
  1. 推理请求:大量用户请求触发推理服务扩容。

  2. 资源调度:优先调度到云下IDC资源池。

  3. 云上扩容:当云下IDC资源不足时,调度至云上预先配置的弹性节点池启用云上资源。

关键技术

该方案涉及到的关键技术有ACK Edge集群、KServe、弹性节点池(节点自动伸缩)、ResourcePolicy(自定义弹性资源优先级调度)。

展开查看关键技术介绍

ACK Edge集群

ACK Edge集群是一款提供标准Kubernetes集群云端托管,支持边缘计算资源及业务的快速接入和统一管理、帮您快速实现云边一体协同的云原生应用平台。

KServe

KServe是一个开源的云原生模型服务平台,旨在简化在Kubernetes上部署和运行机器学习模型的过程,支持多种机器学习框架、具备弹性扩容能力。KServe通过定义简单的YAML文件,提供声明式的API来部署模型,使得配置和管理模型服务变得更加容易。KServe同时提供了一系列自定义资源(CRD),用于管理和提供机器学习模型的服务。

弹性节点池(节点自动伸缩)

节点自动伸缩是一种自动调整集群资源的机制,由cluster-autoscaler组件负责,定期检查集群状态,自动扩缩容节点。当Pod因资源不足无法调度时,机制会模拟调度过程,判断是否需要扩容,并自动添加满足需求的节点池,确保资源高效管理和应用稳定运行。

ResourcePolicy(自定义弹性资源优先级调度)

ResourcePolicyACK Edge调度器的一项高级弹性调度策略,满足不同类型资源的精细化管理需求。通过ResourcePolicy可以自定义资源的使用规则和优先级,以精准控制Pod在不同类型节点资源上的调度顺序。

您可根据业务需求和资源特性预设Pod调度优先级,例如,高性能计算节点优先用于计算密集型应用,存储资源丰富的节点优先用于需要大量存储数据的应用。在缩容时,自定义策略按原调度顺序逆序执行,即最先调度到高性能节点的Pod最后释放,而后调度到存储节点的Pod最先释放。

使用示例

  1. 准备环境。

    1. 创建ACK Edge集群

    2. 创建弹性节点池

    3. ACK Edge集群中安装KServe

    4. 配置Arena客户端

    5. 部署监控组件并配置GPU监控指标

    准备工作完成后,将集群中的资源按照节点池划分为三类:

    类别

    节点池类型

    作用

    示例

    云上管控资源池

    云端

    用于部署ACK Edge集群,KServe等管控组件的云上节点池。

    default-nodepool

    IDC资源池

    边缘/专用型

    线下数据中心资源,用于承载LLM推理服务。

    GPU-V100-Edge

    云上弹性资源池

    云端

    根据集群GPU资源使用情况灵活扩容,用于在高峰期承载LLM推理服务。

    GPU-V100-Elastic

  2. 准备AI模型。

    您可以使用OSSNAS准备模型数据。具体操作,请参见准备模型数据并上传OSS Bucket

  3. 定义调度优先级。

    通过创建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 # 此处要与后续创建的应用Podlabel相关联。
      strategy: prefer
      units:
      - resource: ecs
        nodeSelector:
          alibabacloud.com/nodepool-id: npxxxxxx  # IDC资源池,替换为您的IDC资源池ID。
      - resource: elastic
        nodeSelector:
          alibabacloud.com/nodepool-id: npxxxxxy  # 云上弹性资源池。替换为您的云上弹性资源池ID。
  4. 部署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"

  5. 验证包含弹性伸缩的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|>"]}'
  6. 通过压测工具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副本数,如下图中出现了3Pod副本。11

    由于示例的测试环境中IDC只有1GPU卡,扩容出的2Pod找不到可用的资源,处于pending状态。此时,pending状态的Pod自动触发了云上弹性节点池节点伸缩,cluster-autoscaler会自动弹出2个云上GPU节点来承载这2Pod。123

相关文档