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

Container Service for Kubernetes:Use AHPA to perform predictive scaling based on GPU metrics

最終更新日:Jun 17, 2025

変更を保存します。

前提条件

  • GPU アクセラレーテッドノードを含む ACK マネージドクラスターが作成されていること。詳細については、「GPU アクセラレーテッドノードを含む ACK クラスタを作成する」をご参照ください。

  • AHPA がインストールされ、メトリックを収集するためのデータソースが構成されていること。詳細については、「AHPA の概要」をご参照ください。

  • Managed Service for Prometheus が有効になっており、Managed Service for Prometheus によって少なくとも 7 日間のアプリケーション統計情報が収集されていること。統計情報には、アプリケーションで使用される GPU リソースの詳細が含まれます。詳細については、「Managed Service for Prometheus」をご参照ください。

仕組み

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

手順 1:Metrics Adapter をデプロイする

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

    1. ARMS コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、[Managed Service For Prometheus] > [インスタンス] を選択します。

    3. [インスタンス] ページの上部で、ACK クラスタが配置されているリージョンを選択します。

    4. Managed Service for Prometheus インスタンスの名前をクリックします。インスタンスの詳細ページの左側のナビゲーションウィンドウで、[設定] をクリックし、[HTTP API URL] セクションの内部エンドポイントを記録します。

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

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

    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. 次のコマンドを実行して、application-intelligence をデプロイします。

        kubectl apply -f application-intelligence.yaml
    2. AHPA をデプロイする

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

        この例では、observer モードが使用されています。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

        出力では、CURRENT(%) 列に 0 が返され、TARGET(%) 列に 20 が返されます。これは、現在の 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(%)) よりも高いことを示しています。したがって、ポッドのスケーリングがトリガーされ、予想されるポッドの数は DESIREDPODS 列に返される値である 10 になります。

    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 がスケーリングイベントで追加または削除されると予測するポッドの数は緑色の線で表されます。予測されたポッドの数は、実際のポッドの数よりも少ないことがわかります。スケーリングモードを auto に設定し、予測されたポッドの数に基づいて他の設定を構成できます。このようにして、AHPA はポッドリソースを節約できます。

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

関連情報

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

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