文档首页/ 云容器引擎 CCE/ 最佳实践/ 云原生AI/ 根据推理业务GPU使用率创建HPA策略
更新时间:2026-03-10 GMT+08:00
分享

根据推理业务GPU使用率创建HPA策略

在CCE Standard/Turbo集群中,用户可以通过GPU监控指标为使用GPU资源的工作负载配置弹性伸缩(HPA),使应用在业务高峰期自动扩容、低负载时缩容,从而优化资源利用率并降低成本。

前提条件

  • 目标集群已创建,且集群中包含GPU节点,并已运行GPU相关业务。
  • 在集群中安装CCE AI套件(NVIDIA GPU),且插件正常上报GPU的metrics指标。您可以登录GPU节点,执行以下命令进行检查:
    curl {Pod IP}:2112/metrics

    其中{Pod IP}是CCE AI套件(NVIDIA GPU)插件中nvidia-gpu-device-plugin组件的Pod IP,返回指标结果则为正常。

  • 在集群中安装3.9.5及以上版本的云原生监控插件,且部署模式需选择“本地数据存储”。您还需将Prometheus注册为Metrics API的服务,详见通过Metrics API提供基础资源指标。如果集群中已安装Kubernetes Metrics Server,该插件默认提供Metrics API,无需重复注册。

采集GPU指标

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“配置项与密钥”
  2. 切换至“monitoring”命名空间,在“配置项”页签找到user-adapter-config配置项,并单击“更新”

    图1 更新配置项

  3. “配置数据”中单击config.yaml对应的“编辑”按钮,在rules字段下添加自定义指标采集规则。修改完成后单击“确定”保存配置。

    如果您需要增加多个采集规则,可在rules字段下添加多个配置,关于采集规则配置详情请参见Metrics Discovery and Presentation Configuration

    针对cce_gpu_utilization指标的自定义采集规则示例如下,更多GPU指标请参见GPU监控指标说明
    rules:
      - seriesQuery: '{__name__=~"cce_gpu_utilization",container!="",namespace!="",pod!=""}'
        seriesFilters: []
        resources:
          overrides:
            namespace:
              resource: namespace
            pod:
              resource: pod
        metricsQuery: sum(last_over_time(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)
    图2 设置自定义采集规则

  4. 重新部署monitoring命名空间下的custom-metrics-apiserver工作负载。

    图3 重新部署custom-metrics-apiserver

  5. 重启后,可以通过以下指令查看对应的Pod的指标是否正常。

    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"

    回显结果如下:

    {"kind":"APIResourceList","apiVersion":"v1","groupVersion":"custom.metrics.k8s.io/v1beta1","resources":[{"name":"pods/cce_gpu_memory_utilization","singularName":"","namespaced":true,"kind":"MetricValueList","verbs":["get"]},{"name":"namespaces/cce_gpu_memory_utilization","singularName":"","namespaced":false,"kind":"MetricValueList","verbs":["get"]}]}

推理服务部署

  1. 执行以下命令部署一个推理服务。

    您可以把Qwen3-8B的checkPoint(https://huggingface.co/Qwen/Qwen3-8B)提前存储到指定路径,然后通过HostPath进行挂载。本例是存储到本地“/root/wx/checkpoints/qwen/”路径,镜像使用vllm/vllm-openai:v0.11.0。

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: qwen-8b
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: qwen-8b
          version: v1
      template:
        metadata:
          labels:
            app: qwen-8b
            version: v1
        spec:
          volumes:
            - name: vol-ckpt
              hostPath:
                path: /root/wx/checkpoints/qwen/ # 本地存储的Qwen3-8B的checkPoint路径
                type: ''
          containers:
            - name: container-1
              image: vllm/vllm-openai:v0.11.0
              command:
                - /bin/sh
                - '-c'
              args:
                - vllm serve Qwen3-8B --model='/vllm-workspace/Qwen3-8B' --port=8000 --host=0.0.0.0 --max-model-len=20480 
              env:
                - name: TRANSFORMERS_OFFLINE
                  value: '1'
                - name: HF_DATASET_OFFLINE
                  value: '1'
              resources:
                limits:
                  cpu: '16'
                  memory: 80Gi
                  nvidia.com/gpu: '1'
                requests:
                  cpu: '16'
                  memory: 80Gi
                  nvidia.com/gpu: '1'
              volumeMounts:
                - name: vol-ckpt
                  mountPath: /vllm-workspace/Qwen3-8B
              imagePullPolicy: IfNotPresent
          restartPolicy: Always
          terminationGracePeriodSeconds: 30
          dnsPolicy: ClusterFirst
          securityContext: {}
          imagePullSecrets:
            - name: default-secret
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxUnavailable: 25%
          maxSurge: 25%
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: qwen-8b-svc
      namespace: default
    spec:
      selector:
        app: qwen-8b
        version: v1
      type: ClusterIP   
      ports:
        - name: http
          port: 8000        
          targetPort: 8000  

  2. 执行以下命令查看Pod和Service部署状态。

    kubectl get pod
    kubectl get service

    预期如下:

  3. 执行以下命令验证推理服务,其中IP需要更换为Service IP。

    curl http://10.247.90.143:8000/v1/completions -H "Content-Type: application/json" -d '{"model": "Qwen3-8B","prompt": "San Francisco is a","max_tokens": 100,"temperature": 0}'

    正常返回如下:

创建弹性伸缩策略

  1. 单击左侧导航栏的“工作负载”,在目标工作负载的操作列中单击“弹性伸缩”
  2. 策略类型选择“HPA+CronHPA策略”,并启用HPA策略。

    您可在“自定义策略”中选择GPU监控参数创建弹性伸缩策略,示例如下。

    图4 选择自定义指标

    示例中以cce_gpu_utilization(GPU利用率)作为伸缩指标,其余HPA参数的设置请根据实际需求进行设置,详情请参见创建HPA策略

  3. 返回“策略”页签,查看HPA策略已创建成功。

    图5 HPA策略创建成功

测试推理服务弹性伸缩

验证HPA扩容

  1. 下载Apache自带的压力测试工具ApacheBench(简称ab)。

    #若OS为Ubuntu
    apt-get install apache2-utils
    #若OS为CentOS/HCE
    yum install httpd-tools

  2. 执行以下命令进行压测,其中ab压测工具命令,body.json为请求体。

    body.json内容如下:

    {
        "model": "Qwen3-8B",
        "prompt": "San Francisco is a",
        "max_tokens": 100,
        "temperature": 0
    }

    压测命令如下:

    ab -n 4000 -c 1 -p body.json -T application/json http://10.247.90.143:8000/v1/completions

  3. 观察GPU负载情况和HPA状态。

    • GPU利用率持续处于高位

    • HPA感知到GPU利用率超过20%,开始扩容

    • 查看Pod状态,Pod扩容成功

验证HPA缩容

压测结束后,查看GPU负载和HPA状态。

  • GPU利用率降低

  • 等待5分钟左右(默认缩容时间),HPA触发缩容

  • 查看Pod状态,Pod缩容成功

相关文档