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

Container Service for Kubernetes:GPU メトリックに基づくオートスケーリングの実装

最終更新日:Feb 10, 2026

Kubernetes は、Managed Service for Prometheus と統合して GPU メトリックを収集する Custom Metrics メカニズムを提供します。このトピックでは、Managed Service for Prometheus をデプロイする方法と、Managed Service for Prometheus を使用して GPU メトリックをモニターし、コンテナーのオートスケーリングを実装する方法の例について説明します。

前提条件

ご利用のクラスターに GPU ノードを追加したか、専用 GPU クラスターを作成している必要があります。

概要

ディープラーニングのモデルトレーニングや推論などのハイパフォーマンスコンピューティング (HPC) シナリオでは、計算を高速化するために GPU がよく使用されます。コストを節約するには、GPU 使用率や GPU メモリなどの GPU メトリックに基づいてオートスケーリングを使用します。

デフォルトでは、Kubernetes は CPU とメモリを Horizontal Pod Autoscaler (HPA) のオートスケーリングのメトリックとして使用します。GPU メトリックに基づくオートスケーリングなどのより複雑なシナリオでは、Prometheus Adapter を使用して Prometheus が収集した GPU メトリックを適応させます。次に、Custom Metrics API を使用して HPA メトリックを拡張します。このワークフローにより、GPU 使用率や GPU メモリなどのメトリックに基づいてオートスケーリングを実装できます。次の図は、GPU オートスケーリングの仕組みを示しています。

image

ステップ 1: Managed Service for Prometheus と Metrics Adapter のデプロイ

  1. Prometheus モニタリングを有効化します。

    説明

    クラスター作成時に Prometheus をインストールするように選択した場合、再度インストールする必要はありません。

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

    1. HTTP API アドレスの取得

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

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

    3. ページ上部で、ご利用の Container Service for Kubernetes (ACK) クラスターが配置されているリージョンを選択します。次に、対象インスタンスの名前をクリックします。

    4. [設定]ページで、[設定]タブをクリックします。[HTTP API URL(Grafana 読み取りアドレス)]セクションで、イントラネットアドレスをコピーします。

    2. Prometheus URL の構成

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

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

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

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

    5. パラメーター]ウィザードで、[チャートバージョン]を選択します。[パラメーター]セクションで、取得した HTTP API アドレスを Prometheus の url パラメーターの値として設定します。次に、[OK]をクリックします。

ステップ 2: GPU メトリックのアダプタールール構成

1. GPU メトリックのクエリ

GPU メトリックをクエリできます。詳細については、「モニタリングメトリックの説明」をご参照ください。

2. アダプタールールの構成

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

  2. クラスター ページで、目的のクラスターを探してその名前をクリックします。 左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。

  3. Helm リリースの [操作] 列で、ack-alibaba-cloud-metrics-adapter の [更新] をクリックします。次の rulescustom フィールドに追加します。

    詳細ルール

    - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NodeName:
            resource: node
      seriesQuery: DCGM_FI_DEV_GPU_UTIL{} # GPU 使用率
    - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          NodeName:
            resource: node
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_SM_UTIL{} # コンテナーの GPU 使用率
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NodeName:
            resource: node
      seriesQuery: DCGM_FI_DEV_FB_USED{} # GPU メモリ使用量
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          NodeName:
            resource: node
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{} # コンテナーの GPU メモリ使用量
    - 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!=""}  # コンテナーの GPU メモリ使用率

    ルールを追加すると、構成は次の図のように表示されます。

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

    次のコマンドを実行します。出力に DCGM_FI_DEV_GPU_UTILDCGM_CUSTOM_PROCESS_SM_UTILDCGM_FI_DEV_FB_USEDDCGM_CUSTOM_PROCESS_MEM_USED など、HPA が認識できるメトリックが含まれている場合、構成は完了です。この例では DCGM_CUSTOM_PROCESS_SM_UTIL を使用します。実際の出力は異なる場合があります。

    出力例

    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"

    期待される出力 (resources セクションには DCGM_CUSTOM_PROCESS_SM_UTIL に関連するメトリックが含まれます):

    {
      "kind": "APIResourceList",
      "apiVersion": "v1",
      "groupVersion": "custom.metrics.k8s.io/v1beta1",
      "resources": [
        {
          "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 使用率に基づくオートスケーリングをテストします。

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:
                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 とサービスのステータスを確認します。

    • 次のコマンドを実行して、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>

      期待される出力は、GPU ノード 192.168.94.107 に 1 つの Pod のみがデプロイされていることを示しています。

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

      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. Secure Shell (SSH) を使用して GPU ノード 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 # 意図認識結果

    HTTP リクエストはステータスコード 200 と意図認識結果を返します。これは、推論サービスがデプロイされていることを示しています。

2. HPA の構成

この例では GPU 使用率を使用します。Pod の GPU 使用率が 20% を超えると、スケールアウトがトリガーされます。HPA は次のメトリックをサポートしています。

メトリック

説明

単位

DCGM_FI_DEV_GPU_UTIL

  • GPU カード使用率。

  • このメトリックは、専用GPUスケジューリングにのみ有効です。

    重要

    共有 GPU の場合、同じ GPU カードが複数の Pod に割り当てられます。NVIDIA は、アプリケーションレベルの使用率ではなく、カードレベルの使用率のみを提供します。したがって、Pod 内で nvidia-smi を実行したときに表示される使用率は、カード全体の使用率になります。

%

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 メモリ使用率 = 現在の Pod コンテナーの実際の GPU メモリ使用量 (Used) / 現在の Pod コンテナーに割り当てられた GPU メモリ (Allocated)

%

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

    v1.23 以降

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2  # HPA 構成には 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 # コンテナーの GPU 使用率が 20% を超えると、スケールアウトがトリガーされます。
    EOF

    v1.23 より前

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2beta1  # HPA 構成には 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 # Pod の GPU 使用率。
          targetAverageValue: 20 # コンテナーの GPU 使用率が 20% を超えると、スケールアウトがトリガーされます。
    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% を超えると、スケールアウトがトリガーされます。

3. 推論サービスのオートスケーリングのテスト

スケールアウト

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

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

    HPA スケールアウトの必要なレプリカ数を計算する式は次のとおりです。必要なレプリカ数 = ceil[現在のレプリカ数 × (現在のメトリック / 必要なメトリック)]。たとえば、現在のレプリカ数が 1、現在のメトリックが 23、必要なメトリックが 20 の場合、式は必要なレプリカ数を 2 と計算します。

  2. ストレステスト中に、HPA と Pod のステータスをモニターします。

    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% を超えており、オートスケーリングをトリガーし、クラスターをスケールアウトさせることを示しています。

    2. 次のコマンドを実行して Pod ステータスを確認します。

      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 つの Pod があることを示しています。式は Pod の総数が 2 であると計算します。これは実際の出力と一致します。

    HPA と Pod の期待される出力は、Pod が正常にスケールアウトされたことを示しています。

スケールイン

ストレステストが停止すると、GPU 使用率が 20% を下回ります。その後、システムはスケールインを開始します。

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

    kubectl get hpa

    期待される出力:

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

    期待される出力は、TARGETS0/20 であることを示しています。これは、現在の GPU 使用率が 0 であることを示しています。約 5 分後、システムはスケールインを開始します。

  2. 次のコマンドを実行して Pod ステータスを確認します。

    kubectl get pods

    期待される出力:

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

    期待される出力は、Pod 数が 1 であることを示しています。これは、スケールインが成功したことを示しています。

よくある質問

GPU カードが使用されているかどうかを確認するにはどうすればよいですか?

GPU カードが使用中かどうかは、[GPU モニタリング] タブで GPU カード使用率の変動を観察することで判断できます。使用率が上昇した場合、GPU カードは使用中です。使用率に変化がない場合、カードは使用されていません。これを行うには、次の手順を実行します:

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

  2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[オペレーション] > [Prometheus モニタリング] を選択します。

  3. [Prometheus モニタリング] ページで、[GPU モニタリング] タブをクリックします。GPU カード使用率の変動を観察します。