容器服务ACK支持AHPA(Advanced Horizontal Pod Autoscaler)的弹性预测能力,满足在应用具备周期性的情况下,通过弹性预测进行资源预热,解决您在服务使用中遇到的弹性滞后问题。AHPA支持多种指标预测,包括CPU、Memory、GPU和QPS等。本文介绍如何通过阿里云Prometheus监控观测GPU指标,实现基于GPU指标的AHPA弹性预测。

前提条件

  • 已创建托管GPU集群。具体操作,请参见创建托管GPU集群
  • 已安装AHPA组件,并配置相关指标源。具体操作,请参见AHPA概述
  • 已开启Prometheus监控,且Prometheus监控中至少已收集7天应用历史数据(GPU)。具体操作,请参见阿里云Prometheus监控

背景信息

在高性能计算领域,例如深度学习模型训练、推理等场景,通常需要使用GPU加速计算。为了节省成本,您可以根据GPU指标(利用率、显存)来进行弹性伸缩。通过Prometheus Adapter适配Prometheus采集到的GPU指标,然后使用AHPA,根据GPU利用率指标进行弹性预测。

步骤一:部署Metrics Adapter

  1. 获取HTTP API的内网地址。
    1. 登录ARMS控制台,在控制台左侧导航栏,选择Prometheus监控 > Prometheus实例列表
    2. Prometheus监控页面顶部选择容器服务K8s集群所在的地域,然后单击目标实例名称进入对应实例页面。
    3. 在左侧导航栏单击设置,获取HTTP API地址下的内网地址。
  2. 部署ack-alibaba-cloud-metrics-adapter。
    1. 登录容器服务管理控制台,在左侧导航栏中选择市场 > 应用市场
    2. 应用市场页面单击应用目录页签,搜索并单击ack-alibaba-cloud-metrics-adapter
    3. ack-alibaba-cloud-metrics-adapter页面,单击右上角的一键部署
    4. 基本信息配置向导中,选择集群命名空间,然后单击下一步
    5. 参数配置配置向导中,选择Chart版本,在参数区域将步骤1获取的HTTP API内网地址配置为prometheus.url的值,然后单击确定
      URL

步骤二:基于GPU指标实现AHPA弹性预测

本文通过在GPU上部署一个模型推理服务,然后对其进行持续请求访问,根据GPU利用率进行AHPA弹性预测。

  1. 部署推理服务。
    1. 执行以下命令,部署推理服务。
      cat <<EOF | kubectl create -f -
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: bert-intent-detection
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: bert-intent-detection
        template:
          metadata:
            labels:
              app: bert-intent-detection
          spec:
            containers:
            - name: bert-container
              image: registry.cn-hangzhou.aliyuncs.com/ai-samples/bert-intent-detection:1.0.1
              ports:
              - containerPort: 80
              resources:
                limits:
                  cpu: "1"
                  memory: 2G
                  nvidia.com/gpu: "1"
                requests:
                  cpu: 200m
                  memory: 500M
                  nvidia.com/gpu: "1"
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: bert-intent-detection-svc
        labels:
          app: bert-intent-detection
      spec:
        selector:
          app: bert-intent-detection
        ports:
        - protocol: TCP
          name: http
          port: 80
          targetPort: 80
        type: LoadBalancer
      EOF
    2. 执行以下命令,查看Pod状态。
      kubectl get pods -o wide
      预期输出:
      NAME                                    READY   STATUS    RESTARTS   AGE     IP           NODE                        NOMINATED NODE   READINESS GATES
      bert-intent-detection-7b486f6bf-f****   1/1     Running   0          3m24s   10.15.1.17   cn-beijing.192.168.94.107   <none>           <none>
    3. 执行以下命令,调用推理服务,验证部署是否成功。
      您可以通过kubectl get svc bert-intent-detection-svc命令获取GPU节点的IP地址,替换如下命令中的47.95.XX.XX
      curl -v  "http://47.95.XX.XX/predict?query=Music"
      预期输出:
      *   Trying 47.95.XX.XX...
      * TCP_NODELAY set
      * Connected to 47.95.XX.XX (47.95.XX.XX) port 80 (#0)
      > GET /predict?query=Music HTTP/1.1
      > Host: 47.95.XX.XX
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      * HTTP 1.0, assume close after body
      < HTTP/1.0 200 OK
      < Content-Type: text/html; charset=utf-8
      < Content-Length: 9
      < Server: Werkzeug/1.0.1 Python/3.6.9
      < Date: Wed, 16 Feb 2022 03:52:11 GMT
      <
      * Closing connection 0
      PlayMusic #意图识别结果。
      当HTTP请求返回状态码200和意图识别结果,说明推理服务部署成功。
  2. 配置AHPA。
    本文以GPU利用率为例,当Pod的GPU利用率大于20%时,触发扩容。
    1. 配置AHPA指标源。
      1. 使用以下内容,创建application-intelligence.yaml文件。

        armsUrl用于设置阿里云Prometheus的访问地址,值为步骤1获取的内网地址。

        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: application-intelligence
          namespace: kube-system
        data:
          armsUrl: "http://cn-shanghai-intranet.arms.aliyuncs.com:9090/api/v1/prometheus/da9d7dece901db4c9fc7f5b*******/1581204543170*****/c54417d182c6d430fb062ec364e****/cn-shanghai"
      2. 执行以下命令,部署application-intelligence。
        kubectl apply -f application-intelligence.yaml
    2. 部署AHPA。
      1. 使用以下内容,创建fib-gpu.yaml文件。

        此处设置为observer观察模式,关于参数的更多信息,请参见参数说明

        apiVersion: autoscaling.alibabacloud.com/v1beta1
        kind: AdvancedHorizontalPodAutoscaler
        metadata:
          name: fib-gpu
          namespace: default
        spec:
          metrics:
          - resource:
              name: gpu
              target:
                averageUtilization: 20
                type: Utilization
            type: Resource
          minReplicas: 0
          maxReplicas: 100
          prediction:
            quantile: 95
            scaleUpForward: 180
          scaleStrategy: observer
          scaleTargetRef:
            apiVersion: apps/v1
            kind: Deployment
            name: bert-intent-detection
          instanceBounds:
          - startTime: "2021-12-16 00:00:00"
            endTime: "2022-12-16 00:00:00"
            bounds:
            - cron: "* 0-8 ? * MON-FRI"
              maxReplicas: 50
              minReplicas: 4
            - cron: "* 9-15 ? * MON-FRI"
              maxReplicas: 50
              minReplicas: 10
            - cron: "* 16-23 ? * MON-FRI"
              maxReplicas: 50
              minReplicas: 12
      2. 执行以下命令,部署AHPA。
        kubectl apply -f fib-gpu.yaml
      3. 执行以下命令,查看AHPA状态。
        kubectl get ahpa
        预期输出:
        NAME             STRATEGY   REFERENCE               METRIC   TARGET(%)   CURRENT(%)   DESIREDPODS   REPLICAS   MINPODS   MAXPODS   AGE
        fib-gpu          observer   bert-intent-detection   gpu      20          0          0            1          10        50        6d19h

        由预期输出得到,CURRENT(%)0TARGET(%)20。说明当前GPU利用率是0%,当GPU利用率超过20%时触发弹性扩容。

  3. 测试推理服务弹性伸缩。
    1. 执行以下命令,对推理服务进行访问。
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: fib-loader
        namespace: default
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            app: fib-loader
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: fib-loader
          spec:
            containers:
            - args:
              - -c
              - |
                /ko-app/fib-loader --service-url="http://bert-intent-detection-svc.${NAMESPACE}/predict?query=Music" --save-path=/tmp/fib-loader-chart.html
              command:
              - sh
              env:
              - name: NAMESPACE
                valueFrom:
                  fieldRef:
                    apiVersion: v1
                    fieldPath: metadata.namespace
              image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-loader:20201126-110434
              imagePullPolicy: IfNotPresent
              name: loader
              ports:
              - containerPort: 8090
                name: chart
                protocol: TCP
              resources:
                limits:
                  cpu: "8"
                  memory: 16000Mi
                requests:
                  cpu: "2"
                  memory: 4000Mi
    2. 访问过程中,执行以下命令,查看AHPA的状态。
      kubectl get ahpa
      预期输出:
      NAME             STRATEGY   REFERENCE               METRIC   TARGET(%)   CURRENT(%)   DESIREDPODS   REPLICAS   MINPODS   MAXPODS   AGE
      fib-gpu          observer   bert-intent-detection   gpu      20          189          10            4          10        50        6d19h

      由预期输出得到,当前GPU利用率 CURRENT(%)已超过TARGET(%)的值,触发弹性伸缩,期望的Pod数DESIREDPODS10

    3. 执行以下命令,查看预测效果趋势。
      kubectl get --raw '/apis/metrics.alibabacloud.com/v1beta1/namespaces/default/predictionsobserver/fib-gpu'|jq -r '.content' |base64 -d > observer.html
      基于历史7天的GPU指标数据预测的GPU趋势示例结果如下:GPU预测趋势
      • Predict GPU Resource Observer:蓝色表示实际的GPU使用量,绿色表示AHPA预测出来的GPU使用量。绿色曲线大部分均大于蓝色,表明预测的GPU容量相对充足。
      • Predict POD Oberserver:蓝色表示使用实际的扩缩容Pod数,绿色表示AHPA预测出来的扩缩容Pod数,绿色曲线大部分均小于蓝色,表明预测的Pod数量更少。您可以将弹性伸缩模式设置为auto,以预测的Pod数进行设置,为您节省更多的Pod资源,避免资源的浪费。

      通过预测结果表明,弹性预测趋势符合预期。若经过观察后,符合预期,您可以将弹性伸缩模式设置为auto,由AHPA负责扩缩容。