全部產品
Search
文件中心

Container Service for Kubernetes:基於GPU指標實現AHPA彈性預測

更新時間:Jun 19, 2024

AHPA可以根據從Prometheus Adapter擷取到的GPU利用率資料,結合歷史負載趨勢和預測演算法,提前預估未來的GPU資源需求,並自動調整Pod副本數量或者GPU資源分派,確保在GPU資源緊張前完成擴容操作,而在資源閑置時及時縮容,從而達到節省成本和提高叢集效率的目標。

前提條件

  • 已建立託管GPU叢集。具體操作,請參見建立GPU叢集

  • 已安裝AHPA組件,並配置相關指標源。具體操作,請參見AHPA概述

  • 已開啟Prometheus監控,且Prometheus監控中至少已收集7天應用歷史資料(GPU)。具體操作,請參見阿里雲Prometheus監控

原理介紹

在高效能運算領域,尤其是深度學習模型訓練、推理等對GPU資源高度依賴的情境中,通過精細化管理和動態調整GPU資源能夠有效提升資源使用率並降低成本。Container Service for Kubernetes支援基於GPU指標進行Auto Scaling。您可以利用Prometheus採集GPU的即時利用率和顯存使用方式等關鍵計量。然後通過Prometheus Adapter將這些指標轉換為Kubernetes可識別的metrics格式,並與AHPA整合。AHPA可以根據從Prometheus Adapter擷取到的GPU利用率資料,結合歷史負載趨勢和預測演算法,提前預估未來的GPU資源需求,並自動調整Pod副本數量或者GPU資源分派,確保在GPU資源緊張前完成擴容操作,而在資源閑置時及時縮容,從而達到節省成本和提高叢集效率的目標。

步驟一:部署Metrics Adapter

  1. 擷取HTTP API的內網地址。

    1. 登入ARMS控制台

    2. 在左側導覽列選擇Prometheus監控 > 執行個體列表,進入可觀測監控 Prometheus 版的執行個體列表頁面。

    3. 執行個體列表頁面頂部,選擇Container ServiceK8s叢集所在的地區。

    4. 單擊目標Prometheus執行個體名稱,然後在左側導覽列單擊設定,擷取HTTP API地址下的內網地址。

  2. 部署ack-alibaba-cloud-metrics-adapter。

    1. 登入Container Service管理主控台,在左側導覽列選擇市場 > 應用市場

    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檔案。

        prometheusUrl用於設定阿里雲Prometheus的訪問地址,值為步驟1擷取的內網地址。

        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: application-intelligence
          namespace: kube-system
        data:
          prometheusUrl: "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. 測試推理服務Auto Scaling。

    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(%)的值,觸發Auto Scaling,期望的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 Scaling模式設定為auto,以預測的Pod數進行設定,為您節省更多的Pod資源,避免資源的浪費。

      通過預測結果表明,彈性預測趨勢符合預期。若經過觀察後,符合預期,您可以將Auto Scaling模式設定為auto,由AHPA負責擴縮容。

相關文檔

  • Knative Serverless支援AHPA(Advanced Horizontal Pod Autoscaler)的彈效能力,當應用所需資源具備周期性時,可通過彈性預測,預熱資源,解決您在使用Knative中遇到的冷啟動問題。詳細資料,請參見在Knative中使用AHPA彈性預測

  • 很多情境中需要根據自訂指標(例如HTTP請求的QPS、訊息佇列的長度等)對應用進行擴縮容。AHPA(Autoscaling Horizontal Pod Autoscaler)提供了External Metrics機制,結合alibaba-cloud-metrics-adapter組件,可以為應用提供更加豐富的擴縮機制。詳細資料,請參見通過AHPA配置自訂指標以實現應用擴縮