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

Container Service for Kubernetes:GPU リソースのモニタリングのベストプラクティス

最終更新日:Nov 19, 2025

GPU モニタリングは、NVIDIA Data Center GPU Manager (DCGM) を使用して、クラスター内の GPU ノードをモニターします。このドキュメントでは、3 つの異なる方法で GPU リソースをリクエストするアプリケーションのモニタリング結果を表示する方法について説明します。

前提条件

背景情報

GPU モニタリングは、クラスター内の GPU ノードを包括的にモニターし、クラスター、ノード、および Pod レベルでダッシュボードを提供します。詳細については、「ダッシュボードの説明」をご参照ください。

  • クラスターレベルの GPU モニタリングダッシュボードには、クラスター全体の利用率、GPU メモリ使用量、XID エラー検出など、クラスター全体または特定のノードプールの情報が表示されます。

  • ノードレベルの GPU モニタリングダッシュボードには、特定のノードの GPU の詳細、利用率、GPU メモリ使用量など、ノード固有の情報が表示されます。

  • Pod レベルの GPU モニタリングダッシュボードには、Pod によってリクエストされた GPU リソースとその利用率など、Pod 固有の情報が表示されます。

このドキュメントでは、次のワークフロー例を使用して、さまざまな GPU リクエストメソッドがモニタリング結果にどのように影響するかを示します。

重要事項

  • GPU モニタリングメトリックは 15 秒間隔で収集されるため、Grafana ダッシュボードでわずかなデータ遅延が発生する可能性があります。その結果、ダッシュボードではノードに利用可能な GPU メモリがないと表示されていても、Pod が正常にスケジュールされることがあります。これは、Pod がタスクを完了し、15 秒の収集間隔 (2 回のスクレイプの間) 内に GPU リソースを解放し、次のメトリック更新の前にスケジューラが保留中の Pod をそのノードに配置できる場合に発生する可能性があります。

  • モニタリングダッシュボードは、Pod の resources.limits を介してリクエストされた GPU リソースのみをモニターします。詳細については、「Pod とコンテナーのリソース管理」をご参照ください。

    次の方法で GPU リソースを使用すると、モニタリングダッシュボードのデータが不正確になる場合があります。

    • ノード上で直接 GPU アプリケーションを実行する。

    • docker run コマンドで直接起動されたコンテナーで GPU アプリケーションを実行する。

    • Pod の env セクションで NVIDIA_VISIBLE_DEVICES=all または NVIDIA_VISIBLE_DEVICES=<GPU ID> 環境変数を直接設定し、GPU プログラムを実行して Pod の GPU リソースをリクエストする。

    • Pod の securityContextprivileged: true を構成し、GPU プログラムを実行する。

    • NVIDIA_VISIBLE_DEVICES 環境変数が設定されていない Pod で GPU プログラムを実行するが、Pod が使用するコンテナイメージにはデフォルトで NVIDIA_VISIBLE_DEVICES=all が構成されている。

  • 割り当てられた GPU メモリと使用されている GPU メモリは必ずしも同じではありません。たとえば、GPU カードの合計 GPU メモリが 16 GiB であるとします。そのうち 5 GiB を、起動コマンドが sleep 1000 である Pod に割り当てます。この場合、Pod は Running 状態ですが、1000 秒間は GPU を使用しません。その結果、5 GiB の GPU メモリが割り当てられますが、使用される GPU メモリは 0 GiB になります。

手順 1: ノードプールを作成する

GPU モニタリングダッシュボードには、GPU リソースをカード全体として、または特定の量の GPU メモリ (オプションで計算能力も) でリクエストする Pod のメトリックが表示されます。

この例では、クラスターに 3 つのノードプールを作成して、さまざまな GPU リクエストモデルの Pod スケジューリングとリソース使用量を示します。ノードプールの作成に関する詳細な手順については、「ノードプールを作成する」をご参照ください。ノードプールの構成は次のとおりです。

構成項目

説明

値の例

ノードプール名

最初のノードプールの名前。

exclusive

2 番目のノードプールの名前。

share-mem

3 番目のノードプールの名前。

share-mem-core

インスタンスタイプ

ノードのインスタンスタイプ。この例では、10 GiB の GPU メモリを必要とする TensorFlow Benchmark プロジェクトを使用するため、ノードのインスタンスタイプは 10 GiB を超えるメモリを提供する必要があります。

ecs.gn7i-c16g1.4xlarge

ノードの期待数

ノードプールが維持すべきノードの総数。

1

ノードラベル

最初のノードプールに追加されたラベル。これは、GPU リソースがカード全体としてリクエストされることを示します。

なし

2 番目のノードプールに追加されたラベル。これは、GPU リソースが GPU メモリによってリクエストされることを示します。

ack.node.gpu.schedule=cgpu

3 番目のノードプールに追加されたラベル。これは、GPU リソースが GPU メモリによってリクエストされ、計算能力のリクエストをサポートすることを示します。

ack.node.gpu.schedule=core_mem

手順 2: GPU アプリケーションをデプロイする

ノードプールを作成した後、ノードで GPU テストジョブを実行して、GPU メトリックが正しく収集されていることを確認します。各ジョブに必要なラベルとスケジューリングの関係については、「GPU ノードタイプとスケジューリングラベル」をご参照ください。3 つのジョブの構成は次のとおりです。

ジョブ名

タスクのノードプール

GPU リソースリクエスト

tensorflow-benchmark-exclusive

exclusive

nvidia.com/gpu: 1

GPU カード 1 枚をリクエストします。

tensorflow-benchmark-share-mem

share-mem

aliyun.com/gpu-mem: 10

10 GiB の GPU メモリをリクエストします。

tensorflow-benchmark-share-mem-core

share-mem-core

  • aliyun.com/gpu-mem: 10

  • aliyun.com/gpu-core.percentage: 30

10 GiB の GPU メモリと 1 枚の GPU カードの計算能力の 30% をリクエストします。

  1. ジョブのマニフェストファイルを作成します。

    • tensorflow-benchmark-exclusive.yaml という名前のファイルを次の YAML コンテンツで作成します。

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: tensorflow-benchmark-exclusive
      spec:
        parallelism: 1
        template:
          metadata:
            labels:
              app: tensorflow-benchmark-exclusive
          spec:
            containers:
            - name: tensorflow-benchmark
              image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
              command:
              - bash
              - run.sh
              - --num_batches=5000000
              - --batch_size=8
              resources:
                limits:
                  nvidia.com/gpu: 1 # GPU を申請します。
              workingDir: /root
            restartPolicy: Never
    • tensorflow-benchmark-share-mem.yaml という名前のファイルを次の YAML コンテンツで作成します。

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: tensorflow-benchmark-share-mem
      spec:
        parallelism: 1
        template:
          metadata:
            labels:
              app: tensorflow-benchmark-share-mem
          spec:
            containers:
            - name: tensorflow-benchmark
              image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
              command:
              - bash
              - run.sh
              - --num_batches=5000000
              - --batch_size=8
              resources:
                limits:
                  aliyun.com/gpu-mem: 10 # 10 GiB の GPU メモリを申請します。
              workingDir: /root
            restartPolicy: Never
    • tensorflow-benchmark-share-mem-core.yaml という名前のファイルを次の YAML コンテンツで作成します。

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: tensorflow-benchmark-share-mem-core
      spec:
        parallelism: 1
        template:
          metadata:
            labels:
              app: tensorflow-benchmark-share-mem-core
          spec:
            containers:
            - name: tensorflow-benchmark
              image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
              command:
              - bash
              - run.sh
              - --num_batches=5000000
              - --batch_size=8
              resources:
                limits:
                  aliyun.com/gpu-mem: 10 # 10 GiB の GPU メモリを申請します。
                  aliyun.com/gpu-core.percentage: 30  # GPU の計算能力の 30% を申請します。
              workingDir: /root
            restartPolicy: Never
  2. 次のコマンドを実行してジョブをデプロイします。

    kubectl apply -f tensorflow-benchmark-exclusive.yaml
    kubectl apply -f tensorflow-benchmark-share-mem.yaml
    kubectl apply -f tensorflow-benchmark-share-mem-core.yaml
  3. 次のコマンドを実行して Pod のステータスを確認します。

    kubectl get pod

    期待される出力:

    NAME                                        READY   STATUS    RESTARTS   AGE
    tensorflow-benchmark-exclusive-7dff2        1/1     Running   0          3m13s
    tensorflow-benchmark-share-mem-core-k24gz   1/1     Running   0          4m22s
    tensorflow-benchmark-share-mem-shmpj        1/1     Running   0          3m46s

    出力は、すべての Pod が Running 状態であることを示しており、ジョブが正常にデプロイされたことを意味します。

手順 3: GPU モニタリングダッシュボードを表示する

GPU - クラスターディメンションダッシュボードの表示

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

  2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、[運用] > [Prometheus モニタリング] を選択します。

  3. Prometheus モニタリングページで、[GPU モニタリング] タブをクリックし、次に [GPU - クラスターディメンション] タブをクリックします。クラスターレベルのモニタリングダッシュボードの情報は以下のとおりです。詳細については、「クラスターディメンションモニタリングダッシュボード」をご参照ください。

    image

    番号

    パネル名

    説明

    1

    合計 GPU ノード数

    クラスターには 3 つの GPU ノードがあります。

    2

    割り当て済み GPU

    合計 3 つの GPU のうち 1.9 が割り当てられています。

    説明

    Pod が GPU をカード全体としてリクエストする場合、1 枚のカードの割り当ては 1 です。共有 GPU スケジューリングの場合、割り当ては、割り当てられた GPU メモリとそのカードの合計 GPU メモリの比率です。

    3

    割り当て済み GPU メモリ

    合計 GPU メモリの 63.0% が割り当てられています。

    4

    使用済み GPU メモリ

    合計 GPU メモリの 35.5% が使用されています。

    5

    平均 GPU 使用率

    すべてのカードの平均使用率は 74% です。

    6

    GPU メモリコピー使用率

    すべてのカードの平均メモリコピー使用率は 43.7% です。

    7

    GPU ノード詳細

    ノード名、GPU カードインデックス、GPU 使用率、メモリコントローラー使用率など、クラスター内の GPU ノードに関する情報。

GPU - ノードダッシュボードの表示

Prometheus モニタリングページで、[GPU モニタリング] タブをクリックし、次に [GPU - ノード] タブをクリックします。[GPUNode] ドロップダウンリストからターゲットノードを選択します。この例では cn-hangzhou.10.166.154.xxx を使用します。ノードレベルのモニタリングダッシュボードの情報は以下のとおりです。

image

image

image

image

パネルグループ

番号

パネル名

説明

概要

1

GPU モード

GPU モードは共有モードで、Pod は GPU メモリと計算能力によって GPU リソースをリクエストします。

2

NVIDIA ドライバーバージョン

インストールされている GPU ドライバーのバージョンは 535.161.07 です。

3

割り当て済み GPU

GPU の総数は 1 で、割り当てられた GPU の数は 0.45 です。

4

GPU 使用率

平均 GPU 使用率は 26% です。

5

割り当て済み GPU メモリ

割り当てられた GPU メモリは、合計 GPU メモリの 45.5% です。

6

使用済み GPU メモリ

現在使用されている GPU メモリは、合計 GPU メモリの 36.4% です。

7

割り当て済み計算能力

GPU カード 0 の計算能力の 30% が割り当てられています。

説明

[割り当て済み計算能力] パネルは、ノードで計算能力の割り当てを有効にした場合にのみデータを表示します。したがって、この例の 3 つのノードのうち、ack.node.gpu.schedule=core_mem ラベルを持つノードのみがこのメトリックのデータを表示します。

使用率

8

GPU 使用率

GPU カード 0 の場合、最小使用率は 0%、最大は 33%、平均は 12% です。

9

メモリコピー使用率

GPU カード 0 の場合、最小メモリコピー使用率は 0%、最大は 22%、平均は 8% です。

メモリ & BAR1

10

GPU メモリ詳細

GPU カードの UUID、インデックス番号、モデルなど、GPU メモリに関する詳細。

11

使用済み BAR1

使用されている BAR1 メモリは 4 MB です。

12

使用済みメモリ

カード上で使用されている GPU メモリは 8.17 GB です。

13

合計 BAR1

合計 BAR1 メモリ: 32.8 GB。

GPU プロセス

14

GPU プロセス詳細

Pod の名前空間と名前を含む、各 GPU プロセスの詳細。

ページの下部で、より高度なメトリックを表示することもできます。詳細については、「ノードレベルのモニタリングダッシュボード」をご参照ください。

image

GPU - アプリケーション Pod ディメンションダッシュボードの表示

Prometheus モニタリングページで、[GPU モニタリング] タブをクリックし、次に [GPU - アプリケーション Pod ディメンション] タブをクリックします。Pod レベルのモニタリングダッシュボードの情報は以下のとおりです。image

番号

パネル名

説明

1

GPU Pod 詳細

Pod の名前空間、名前、ノード名、使用済み GPU メモリなど、クラスター内で GPU リソースをリクエストした Pod に関する情報。

説明
  • [割り当て済み GPU メモリ] は、Pod に割り当てられた GPU メモリを表します。共有 GPU スケジューリングでは、ノードは API Server に合計 GPU メモリの整数値のみを報告できます。これは、ノードが報告された値を実際の値から切り捨てることを意味します。

    • たとえば、カードに 31.7 GiB の GPU メモリがある場合、ノードは API Server に 31 GiB を報告します。Pod が 10 GiB をリクエストした場合、Pod に割り当てられる実際の GPU メモリは 31.7 * (10 / 31) = 10.2 GiB です。

  • [割り当て済み計算能力] は、Pod に割り当てられた計算能力を表します。Pod が計算能力をリクエストしない場合、この値は「-」になります。図は、tensorflow-benchmark-share-mem-core-k24gz という名前の Pod が計算能力の 30% をリクエストしたことを示しています。

ページの下部で、より高度なメトリックを表示することもできます。詳細については、「GPU - アプリケーション Pod ディメンション」をご参照ください。

image