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

:GPUメトリックに基づく自動スケーリングの有効化

最終更新日:Nov 20, 2024

Kubernetesは、カスタムメトリクスに基づく自動スケーリングをサポートしています。 Kubernetesは、Managed Service for Prometheusと連携して、GPUメトリックに基づく自動スケーリングを実装できます。 このトピックでは、Managed Service for Prometheusをデプロイしてアプリケーションを監視する方法について説明します。 このトピックでは、Managed Service for Prometheusによって収集されたGPUメトリックを表示し、GPUメトリックに基づいてポッドの自動スケーリングを有効にする方法の例も示します。

前提条件

GPUアクセラレーションノードを持つACKクラスターまたはGPUアクセラレーションノードを持つACK専用クラスターが作成されます。

概要

GPUアクセラレーテッドコンピューティングは、深層学習モデルのトレーニングや推論など、高性能コンピューティングシナリオで広く使用されています。 リソースコストを削減するために、GPU使用率やGPUメモリ使用量などのGPUメトリックに基づいてクラスター自動スケーリングを有効にできます。

デフォルトでは、KubernetesはCPUとメモリメトリクスに基づく水平ポッド自動スケーリングを有効にします。 より高い要件がある場合は、Prometheusアダプタを使用してPrometheusによって収集されたGPUメトリックをサポートし、カスタムメトリックAPIを使用してカスタムメトリックを定義できます。 これにより、GPU使用率とGPUメモリ使用量に基づいて水平ポッドの自動スケーリングを有効にできます。 次の図は、GPUメトリックに基づく自動スケーリングの仕組みを示しています。

hpa

手順1: Prometheusおよびack-alibaba-cloud-metrics-adapterにマネージドサービスをデプロイする

  1. 手順1: Prometheusのマネージドサービスの有効化.

    説明

    クラスターを作成するときに、[Enable Managed Service for Prometheus] を選択できます。 これにより、クラスターの作成後にPrometheusのManaged Serviceをインストールする必要がなくなります。

  2. ack-alibaba-cloud-metrics-adapterをインストールして設定します。

    A。 HTTP APIエンドポイントの取得

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

    2. 左側のナビゲーションウィンドウで、Prometheusのマネージドサービス > インスタンスを選択します。

    3. 上部のナビゲーションバーで、ACKクラスターがデプロイされているリージョンを選択します。 次に、クラスターで使用されているPrometheusインスタンスの名前をクリックして、インスタンスの詳細ページに移動します。

    4. 設定ページで、設定タブをクリックし、HTTP API URLセクションにある内部エンドポイントをコピーします。

    B。 Prometheus URLの設定

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

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

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

    4. 基本情報ウィザードページで、クラスターと名前空間を選択し、次へをクリックします。

    5. パラメータウィザードページで、Chartバージョンドロップダウンリストからチャートのバージョンを選択します。「パラメータ」セクションで、PrometheusのURLを取得したHTTP APIエンドポイントに設定します。OKをクリックします。

手順2: ack-alibaba-cloud-metrics-adapterのルールの設定

a. GPUメトリックのクエリQuery GPU metrics

GPUメトリックを照会します。 詳細については、「メトリクスの概要」をご参照ください。

b. ack-alibaba-cloud-metrics-adapterのルールを設定する

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[アプリケーション] > [ヘルム] を選択します。

  3. Helmページで、ack-alibaba-cloud-metrics-adapterの [操作] 列の [更新] をクリックします。 カスタムの下に次のルールを追加します。

    サンプルコードを表示する

    - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NodeName:
            resource: node
      seriesQuery: DCGM_FI_DEV_GPU_UTIL{} # This metric indicates the GPU utilization.
    - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          NodeName:
            resource: node
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_SM_UTIL{} # This metric indicates the GPU utilization of pods. 
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NodeName:
            resource: node
      seriesQuery: DCGM_FI_DEV_FB_USED{} # This metric indicates the amount of GPU memory that is used. 
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          NodeName:
            resource: node
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{} # This metric indicates the GPU memory usage of pods. 
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) / sum(DCGM_CUSTOM_CONTAINER_MEM_ALLOCATED{}) by (<<.GroupBy>>)
      name:
        as: ${1}_GPU_MEM_USED_RATIO
        matches: ^(.*)_MEM_USED
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{NamespaceName!="",PodName!=""}  # This metric indicates the GPU memory utilization.

    次の図に例を示します。

    1690252651140-f693f03a-0f9e-4a6a-8772-b7abe9b2912a.png

    次のコマンドを実行します。 出力にDCGM_FI_DEV_GPU_UTILDCGM_CUSTOM_PROCESS_SM_UTILDCGM_FI_DEV_FB_USED、およびDCGM_CUSTOM_PROCESS_MEM_USEDが含まれる場合、ルールは設定されます。 次の例では、DCGM_CUSTOM_PROCESS_SM_UTILが出力で返されます。

    サンプルコードを表示する

    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
    {
    	[
        ...
    		{
          "name": "nodes/DCGM_CUSTOM_PROCESS_SM_UTIL",
          "singularName": "",
          "namespaced": false,
          "kind": "MetricValueList",
          "verbs": [
            "get"
          ]
        },
        ...
        {
          "name": "pods/DCGM_CUSTOM_PROCESS_SM_UTIL",
          "singularName": "",
          "namespaced": true,
          "kind": "MetricValueList",
          "verbs": [
            "get"
          ]
        },
        ...
        {
          "name": "namespaces/DCGM_CUSTOM_PROCESS_SM_UTIL",
          "singularName": "",
          "namespaced": false,
          "kind": "MetricValueList",
          "verbs": [
            "get"
          ]
        }
        ...
        {
          "name": "DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO",
          "singularName": "",
          "namespaced": false,
          "kind": "MetricValueList",
          "verbs": [
            "get"
          ]
        }
        ...
    	]
    }

ステップ3: GPUメトリックに基づいて自動スケーリングを有効にする

次の例は、GPU高速化ノードにモデル推論サービスをデプロイし、そのノードでストレステストを実行して、GPUメトリックに基づいて自動スケーリングを実行できるかどうかを確認する方法を示しています。

a. 推論サービスのデプロイ

  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:
                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>

      出力は、GPUアクセラレーションノード192.168.94.107に1つのポッドのみがデプロイされていることを示します。

    • 次のコマンドを実行して、サービスのステータスを照会します。

      kubectl get svc bert-intent-detection-svc

      期待される出力:

      NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
      bert-intent-detection-svc   LoadBalancer   172.16.186.159   47.95.XX.XX   80:30118/TCP   5m1s

      出力にサービスの名前が表示されている場合、サービスがデプロイされます。

  3. SSHを使用してノード192.168.94.107にログインし、次のコマンドを実行してGPU使用率を照会します。

    nvidia-smi

    期待される出力:

    Wed Feb 16 11:48:07 2022
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 450.102.04   Driver Version: 450.102.04   CUDA Version: 11.0     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  Tesla V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
    | N/A   32C    P0    55W / 300W |  15345MiB / 16160MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |    0   N/A  N/A   2305118      C   python                          15343MiB |
    +-----------------------------------------------------------------------------+

    出力は、推論サービスがGPUアクセラレーションノードで実行されていることを示します。 サービスにリクエストが送信されないため、GPU使用率は0です。

  4. 次のコマンドを実行して、推論サービスにリクエストを送信し、サービスがデプロイされているかどうかを確認します。

    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され、クエリ結果が返されると、推論サービスがデプロイされます。

b. HPAの設定

次の例では、ポッドのGPU使用率が20% を超えたときに自動スケーリングをトリガーする方法について説明します。 次の表に、Horizontal Pod Autoscaler (HPA) でサポートされているメトリックを示します。

メトリクス

説明

単位

DCGM_FI_DEV_GPU_UTIL

  • GPU使用率。

  • このメトリックは、排他モードでスケジュールされているGPUでのみ使用できます。

    重要

    GPUが複数のポッド間で共有されている場合、いずれかのポッドでnvidia-smiコマンドを実行すると、GPUの使用率のみが返されます。 これは、NVIDIAがポッドのGPU使用率に関する情報を提供しないためです。

%

DCGM_FI_DEV_FB_USED

  • 使用されているGPUメモリの量。

  • このメトリックは、排他モードでスケジュールされているGPUでのみ使用できます。

MiB

DCGM_CUSTOM_PROCESS_SM_UTIL

ポッドのGPU使用率。

%

DCGM_CUSTOM_PROCESS_MEM_USED

ポッドによって使用されるGPUメモリの量。

MiB

DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO

ポッドのGPUメモリ使用率。

ポッドのGPUメモリ使用率=ポッドで使用されている現在のGPUメモリ (使用済み) /ポッドに割り当てられている現在のGPUメモリ (割り当て済み)

%

  1. 次のコマンドを実行してHPAをデプロイします。

    Kubernetes 1.23以降を実行するクラスター

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2  # Use the HPA configuration for API version autoscaling/v2. 
    kind: HorizontalPodAutoscaler
    metadata:
      name: gpu-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: bert-intent-detection
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metric:
            name: DCGM_CUSTOM_PROCESS_SM_UTIL
          target:
            type: Utilization
            averageValue: 20 # If the GPU utilization exceeds 20%, pods are scaled out. 
    EOF

    1.23より前のバージョンのKubernetesを実行するクラスター

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2beta1  # Use the HPA configuration for API version autoscaling/v2beta1. 
    kind: HorizontalPodAutoscaler
    metadata:
      name: gpu-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: bert-intent-detection
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metricName: DCGM_CUSTOM_PROCESS_SM_UTIL # The GPU utilization of pods. 
          targetAverageValue: 20 # If the GPU utilization exceeds 20%, pods are scaled out. 
    EOF
  2. 次のコマンドを実行して、HPAのステータスを照会します。

    kubectl get hpa

    期待される出力:

    NAME      REFERENCE                          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    gpu-hpa   Deployment/bert-intent-detection   0/20      1         10        1          74s

    期待される出力は、TARGETS0/20を表示することを示します。 現在のGPU使用率は0です。 GPU使用率が20% を超えると、ポッドはスケールアウトされます。

c. 推論サービスでの自動スケーリングのテスト

スケールアウト活動のテスト

  1. 次のコマンドを実行してストレステストを実行します。

    hey -n 10000 -c 200 "http://47.95.XX.XX/predict?query=music"
    説明

    次の式を使用して、オートスケーリング後の予想ポッド数を計算します。予想ポッド数=ceil [現在のポッド数 × (現在のGPU使用率 /予想されるGPU使用率)] 。 たとえば、現在のポッド数が1の場合、現在のGPU使用率は23、予想されるGPU使用率は20、オートスケーリング後の予想されるポッド数は2です。

  2. ストレステスト中に、次のコマンドを実行してHPAとポッドのステータスを照会します。

    1. 次のコマンドを実行して、HPAのステータスを照会します。

      kubectl get hpa

      期待される出力:

      NAME      REFERENCE                          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
      gpu-hpa   Deployment/bert-intent-detection   23/20     1         10        2          7m56s

      出力は、TARGETS列の値が23/20であることを示します。 現在のGPU使用率がしきい値20% を超えています。 この場合、自動スケーリングがトリガーされ、ACKクラスターがポッドのスケールアウトを開始します。

    2. 次のコマンドを実行して、ポッドのステータスを照会します。

      kubectl get pods

      期待される出力:

      NAME                                    READY   STATUS    RESTARTS   AGE
      bert-intent-detection-7b486f6bf-f****   1/1     Running   0          44m
      bert-intent-detection-7b486f6bf-m****   1/1     Running   0          14s

      出力は、2つのポッドが実行されていることを示します。 この値は、前の式に基づいて計算された予想ポッド数と同じです。

    HPAとポッドによって返される出力は、ポッドがスケールアウトされたことを示します。

スケールイン活動のテスト

ストレステストが停止し、GPU使用率が20% を下回ると、ACKクラスターはポッド内でスケーリングを開始します。

  1. 次のコマンドを実行して、HPAのステータスを照会します。

    kubectl get hpa

    期待される出力:

    NAME      REFERENCE                          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    gpu-hpa   Deployment/bert-intent-detection   0/20      1         10        1          15m

    出力は、TARGETS列の値が0/20であることを示します。 現在のGPU使用率が0に低下します。 ACKクラスターは、約5分後にポッド内でスケーリングを開始します。

  2. 次のコマンドを実行して、ポッドのステータスを照会します。

    kubectl get pods

    期待される出力:

    NAME                                    READY   STATUS    RESTARTS   AGE
    bert-intent-detection-7b486f6bf-f****   1/1     Running   0          52m

    出力は、ポッドの数が1であることを示します。 これは、ポッドがスケールインされることを意味します。

よくある質問

GPUが使用されているかどうかを確認するには?

[GPUモニタリング] タブで、GPU使用率に変更があるかどうかを確認できます。 GPU使用率が増加すると、GPUが使用されます。 GPU使用率に変更がない場合、GPUは使用されません。 これを行うには、次の手順を実行します。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [Prometheusモニタリング] を選択します。

  3. [Prometheusモニタリング] ページで、[GPUモニタリング] タブをクリックし、GPU使用率の変更を表示します。