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

Container Service for Kubernetes:GPU メトリクスによるオートスケーリングの設定

最終更新日:Jun 24, 2026

Kubernetes カスタムメトリクスと Managed Service for Prometheus を使用して GPU メトリクスを収集し、HPA でコンテナを自動スケーリングします。Managed Service for PrometheusHPA を使用してコンテナを自動スケーリングします。

前提条件

GPU ノードがクラスターに追加されているか、専用 GPU クラスターが作成されている必要があります。

仕組み

GPU は、ディープラーニングモデルのトレーニングや推論などのシナリオで計算を高速化します。使用率やメモリなどの GPU メトリクスに基づくオートスケーリングは、コストの最適化に役立ちます。

Kubernetes の Horizontal Pod Autoscaler (HPA) は、デフォルトで CPU とメモリのメトリクスを使用します。GPU メトリクスの場合、Prometheus アダプターが Managed Service for Prometheus からデータを取得し、カスタムメトリクス API を通じて公開します。その後、HPA は GPU の使用率、メモリ使用量、その他の指標に基づいてワークロードをスケーリングします。次の図は、そのプロセスを示しています。

image

ステップ 1:Prometheus とメトリクス アダプターのデプロイ

  1. クラスターで Prometheus モニタリングを有効化します。

    説明

    クラスター作成時に Prometheus をインストールした場合、この手順はスキップしてください。

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

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

  4. 左側のナビゲーションウィンドウで、Prometheusのマネージドサービス > インスタンス.

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

    1. HTTP API URL の取得

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

    2. Container Service for Kubernetes (ACK) クラスターのリージョンを選択します。対象のインスタンスをクリックします。

    3. 設定 ページの 設定 タブで、HTTP API アドレス (Grafana 読み取りアドレス) から内部ネットワークアドレスをコピーします。

    2. Prometheus URL の設定

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

    2. Marketplace ページで アプリカタログ タブをクリックし、[ack-alibaba-cloud-metrics-adapter] を検索してクリックします。

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

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

    5. パラメーター ウィザードで、Chart バージョン を選択します。 セクションで、url パラメーターにコピーした HTTP API URL を設定します。OK をクリックします。

ステップ 2:アダプタールールの設定

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

利用可能な GPU メトリクスについては、「モニタリングメトリクスの説明」をご参照ください。

2. アダプタールールの設定

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

  2. 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メモリ使用率。

    ルールを追加した後の完全な設定:

    Chart Url  https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/ack-alibaba-cloud-metrics-adapter-1.3.2.tgz
      adapter:
        rules:
          custom:
          - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
            name:
              as: ${1}_bytes_per_second
              matches: ^(.*)_bytes
            resources:
              overrides:
                namespace:
                  resource: namespace
                pod:
                  resource: pod
            seriesQuery: container_memory_working_set_bytes{namespace!="",pod!=""}
          - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)
            name:
              as: ${1}_core_per_second
              matches: ^(.*)_seconds_total
            resources:
              overrides:
                namespace:
                  resource: namespace
                pod:
                  resource: pod
            seriesQuery: container_cpu_usage_seconds_total{namespace!="",pod!=""}
          - 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メモリ使用率。
          default: false
        enabled: true
        logLevel: 5

    設定を検証します。出力には、DCGM_FI_DEV_GPU_UTILDCGM_CUSTOM_PROCESS_SM_UTILDCGM_FI_DEV_FB_USEDDCGM_CUSTOM_PROCESS_MEM_USED などのメトリクスが含まれている必要があります。次の例では 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 ベースのスケーリング動作を観察することで、オートスケーリングをテストします。

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

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

      1 つの Pod が GPU ノード 192.168.94.107 にデプロイされています。

    • Service のステータスを確認します。

      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

      出力にはサービス名が表示され、Service が正常にデプロイされたことを確認できます。

  3. 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 # 意図認識の結果。

    意図認識の結果とともに 200 ステータスコードが返され、デプロイが成功したことを確認できます。

2. HPA の設定

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

メトリクス

説明

単位

DCGM_FI_DEV_GPU_UTIL

  • GPU カードの使用率。

  • このメトリクスは、専用 GPU スケジューリングにのみ適用されます。

    重要

    共有 GPU シナリオでは、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 メモリ使用率 = コンテナが実際に使用した GPU メモリ / コンテナに割り当てられた GPU メモリ

%

  1. HPA をデプロイします。

    クラスターバージョン ≥ 1.23

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

    クラスターバージョン < 1.23

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2beta1  # autoscaling/v2beta1 HPA設定を使用します。
    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 であることを意味します。使用率が 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

      TARGETS23/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 が実行されており、ターゲットの 2 と一致しています。

    スケールアウトが確認されました。

スケールインのテスト

負荷テストが停止すると、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

    1 つの Pod が残っており、スケールインが確認されました。

よくある質問

GPU 使用状況の確認方法

GPU 監視 タブで、GPU 使用率の傾向を監視します。使用率の増加はカードがアクティブであることを示し、横ばいの傾向はアイドル状態であることを意味します。傾向を表示するには、次の手順を実行します:

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

  2. Prometheus 監視 ページで、GPU 監視 タブをクリックします。