容器服务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
- 获取HTTP API的内网地址。
- 登录ARMS控制台,在控制台左侧导航栏,选择Prometheus监控 > Prometheus实例列表 。
- 在Prometheus监控页面顶部选择容器服务K8s集群所在的地域,然后单击目标实例名称进入对应实例页面。
- 在左侧导航栏单击设置,获取HTTP API地址下的内网地址。
- 部署ack-alibaba-cloud-metrics-adapter。
步骤二:基于GPU指标实现AHPA弹性预测
本文通过在GPU上部署一个模型推理服务,然后对其进行持续请求访问,根据GPU利用率进行AHPA弹性预测。
- 部署推理服务。
- 执行以下命令,部署推理服务。
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
- 执行以下命令,查看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>
- 执行以下命令,调用推理服务,验证部署是否成功。您可以通过
kubectl get svc bert-intent-detection-svc
命令获取GPU节点的IP地址,替换如下命令中的47.95.XX.XX
。curl -v "http://47.95.XX.XX/predict?query=Music"
预期输出:
当HTTP请求返回状态码* 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 #意图识别结果。
200
和意图识别结果,说明推理服务部署成功。
- 执行以下命令,部署推理服务。
- 配置AHPA。本文以GPU利用率为例,当Pod的GPU利用率大于20%时,触发扩容。
- 配置AHPA指标源。
- 使用以下内容,创建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"
- 执行以下命令,部署application-intelligence。
kubectl apply -f application-intelligence.yaml
- 使用以下内容,创建application-intelligence.yaml文件。
- 部署AHPA。
- 使用以下内容,创建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
- 执行以下命令,部署AHPA。
kubectl apply -f fib-gpu.yaml
- 执行以下命令,查看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(%)
为0
,TARGET(%)
为20
。说明当前GPU利用率是0%,当GPU利用率超过20%时触发弹性扩容。
- 使用以下内容,创建fib-gpu.yaml文件。
- 配置AHPA指标源。
- 测试推理服务弹性伸缩。
- 执行以下命令,对推理服务进行访问。
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
- 访问过程中,执行以下命令,查看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数DESIREDPODS
为10
。 - 执行以下命令,查看预测效果趋势。
kubectl get --raw '/apis/metrics.alibabacloud.com/v1beta1/namespaces/default/predictionsobserver/fib-gpu'|jq -r '.content' |base64 -d > observer.html
基于历史7天的GPU指标数据预测的GPU趋势示例结果如下:- Predict GPU Resource Observer:蓝色表示实际的GPU使用量,绿色表示AHPA预测出来的GPU使用量。绿色曲线大部分均大于蓝色,表明预测的GPU容量相对充足。
- Predict POD Oberserver:蓝色表示使用实际的扩缩容Pod数,绿色表示AHPA预测出来的扩缩容Pod数,绿色曲线大部分均小于蓝色,表明预测的Pod数量更少。您可以将弹性伸缩模式设置为
auto
,以预测的Pod数进行设置,为您节省更多的Pod资源,避免资源的浪费。
通过预测结果表明,弹性预测趋势符合预期。若经过观察后,符合预期,您可以将弹性伸缩模式设置为
auto
,由AHPA负责扩缩容。
- 执行以下命令,对推理服务进行访问。