すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:AHPAを使用したGPUメトリックに基づく予測スケーリングの実行

最終更新日:Dec 13, 2024

Advanced Horizontal Pod Autoscaler (AHPA) コンポーネントは、Prometheus Adapterから取得したGPU使用率データ、過去の負荷傾向、および予測アルゴリズムに基づいて、GPUリソース要求を予測できます。 AHPAは、複製されたポッドの数またはGPUリソースの割り当てを自動的に調整して、GPUリソースが在庫切れになる前にスケールアウト操作が完了するようにすることができます。 また、アイドルリソースが存在するときにスケールイン操作を実行して、コストを削減し、クラスタリソースの使用率を向上させます。

前提条件

  • GPU高速化ノードを含むACK管理クラスターが作成されます。 詳細については、「GPUアクセラレーションノードでのACKクラスターの作成」をご参照ください。

  • AHPAがインストールされ、データソースがメトリックを収集するように設定されます。 詳細については、「AHPAの概要」をご参照ください。

  • PrometheusのManaged Serviceが有効になり、少なくとも7日以内のアプリケーション統計がPrometheusのManaged Serviceによって収集されます。 統計には、アプリケーションによって使用されるGPUリソースの詳細が含まれます。 詳細については、「Prometheusのマネージドサービス」をご参照ください。

仕組み

高性能コンピューティング分野、特に深層学習でのモデルトレーニングやモデル推論など、GPUリソースに強く依存するシナリオでは、GPUリソース割り当てのきめ細かい管理と動的調整により、リソース使用率を効率的に改善し、コストを削減できます。 Container Service for Kubernetes (ACK) は、GPUメトリックに基づく自動スケーリングをサポートしています。 Managed Service for Prometheusを使用して、リアルタイムのGPU使用率やメモリ使用量などの主要なメトリックを収集できます。 次に、Prometheus Adapterを使用して、これらのメトリックをKubernetesが認識できるメトリックに変換し、AHPAと統合できます。 AHPAは、Prometheus Adapterから取得したGPU使用率データ、過去の負荷傾向、および予測アルゴリズムに基づいて、GPUリソース要求を予測できます。 AHPAは、複製されたポッドの数またはGPUリソースの割り当てを自動的に調整して、GPUリソースが在庫切れになる前にスケールアウト操作が完了するようにすることができます。 また、アイドルリソースが存在するときにスケールイン操作を実行して、コストを削減し、クラスタ効率を向上させます。

ステップ1: Metricsアダプタのデプロイ

  1. クラスターで使用されているPrometheusインスタンスの内部HTTP APIエンドポイントを取得します。

    1. ARMSコンソールにログインします。 左側のナビゲーションウィンドウで、[Prometheus Monitoring] > [Prometheus Instances] を選択します。

    2. [Prometheusモニタリング] ページの上部で、クラスターがデプロイされているリージョンを選択し、クラスターで使用されているPrometheusインスタンスをクリックします。 インスタンスの詳細ページにリダイレクトされます。

    3. インスタンスの詳細ページの左側のナビゲーションウィンドウで、設定HTTP API Addressセクションに内部エンドポイントを記録します。

  2. ack-alibaba-cloud-metrics-adapterをデプロイします。

    1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[Marketplace] > [Marketplace] を選択します。

    2. [マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。 ack-alibaba-cloud-metrics-adapterを見つけてクリックします。

    3. 右上隅にack-alibaba-cloud-metrics-adapterページでデプロイをクリックします。

    4. 基本情報ウィザードページ,クラスター名前空間をクリックし、次へ.

    5. [パラメーター] ウィザードページで、[チャートバージョン] パラメーターを設定し、手順1で取得した内部HTTP APIエンドポイントを、[パラメーター] セクションのprometheus.urlパラメーターの値として指定します。 次に、[OK] をクリックします。

      URL

ステップ2: AHPAを使用してGPUメトリックに基づいて予測スケーリングを実行する

この例では、推論サービスがデプロイされています。 次に、AHPAがGPUメトリックに基づいて予測スケーリングを実行できるかどうかを確認するためのリクエストが推論サービスに送信されます。

  1. 推論サービスをデプロイします。

    1. 次のコマンドを実行して、推論サービスをデプロイします。

      YAMLコンテンツの表示

      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. 次のコマンドを実行して、ポッドのステータスを照会します。

      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を、取得したIPアドレスに置き換えます。

      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 # The query result.

      HTTPステータスコードが200され、クエリ結果が返されると、推論サービスがデプロイされます。

  2. AHPAを設定します。

    この例では、ポッドのGPU使用率が20% を超えると、AHPAはポッドをスケーリングするように構成されています。

    1. AHPAのメトリクスを収集するようにデータソースを設定します。

      1. application-intelligence.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。

        prometheusUrlパラメーターを、手順1で取得したPrometheusインスタンスの内部エンドポイントに設定します。

        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. 次のコマンドを実行して、アプリケーションインテリジェンスをデプロイします。

        kubectl apply -f application-intelligence.yaml
    2. AHPAのデプロイ

      1. fib-gpu.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。

        この例では、観察者モードが使用される。 AHPAに関連するパラメーターの詳細については、「パラメーター」をご参照ください。

        YAMLコンテンツの表示

        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

        出力では、0CURRENT(%) 列で返され、20TARGET(%) 列で返されます。 これは、現在のGPU使用率が0% であり、GPU使用率が20% を超えるとポッドのスケーリングがトリガーされることを示します。

  3. 推論サービスで自動スケーリングをテストします。

    1. 次のコマンドを実行して、推論サービスにアクセスします。

      YAMLコンテンツの表示

      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(%)) より高いことを示しています。 したがって、ポッドのスケーリングがトリガーされ、予想されるポッド数が10されます。これは、[DESIREDPODS] 列で返される値です。

    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リソースオブザーバーの予測: 実際のGPU使用率は青い線で表されます。 AHPAによって予測されるGPU利用は、緑色の線によって表される。 予測されたGPU使用率が実際のGPU使用率よりも高いことがわかります。

      • PODオブザーバーの予測: スケーリングイベントで追加または削除されるポッドの実際の数は、青い線で表されます。 AHPAがスケーリングイベントで追加または削除されると予測するポッドの数は、緑色の線で表されます。 予測されるポッドの数が実際のポッドの数よりも少ないことがわかります。 スケーリングモードを自動に設定し、予測されるポッド数に基づいて他の設定を行うことができます。 これにより、AHPAはポッドリソースを節約できます。

      結果は、AHPAが予測スケーリングを使用して、変動するワークロードを予想どおりに処理できることを示しています。 予測結果を確認したら、スケーリングモードをautoに設定できます。これにより、AHPAはポッドを自動的にスケーリングできます。

関連ドキュメント

  • Knativeを使用すると、サーバーレスKubernetes (ASK) クラスターでAHPAを使用できます。 アプリケーションが定期的なパターンでリソースを要求する場合、AHPAを使用してリソース要求の変更を予測し、スケーリング活動のためにリソースをプリフェッチできます。 これにより、アプリケーションのスケーリング時のコールドスタートの影響が軽減されます。 詳細については、「KnativeでAHPAを使用した予測スケーリングの有効化」をご参照ください。

  • 一部のシナリオでは、HTTPリクエストのQPSやメッセージキューの長さなど、カスタムメトリックに基づいてアプリケーションをスケーリングする必要がある場合があります。 AHPAは、alibaba-cloud-Metrics-adapterコンポーネントと連携して、カスタムメトリクスに基づいてアプリケーションをスケーリングできる外部メトリクスメカニズムを提供します。 詳細については、「AHPAを使用したアプリケーションスケーリングのカスタムメトリックの設定」をご参照ください。