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

Container Compute Service:GPU-HPN ノードでの GPU 共有の使用

最終更新日:Dec 16, 2025

Alibaba Cloud Container Service for Kubernetes (ACK) は、GPU-HPN ノードでの GPU 共有をサポートしています。この機能により、単一の GPU デバイス上で複数の Pod を実行できます。排他的な GPU スケジューリングのシナリオでは、Pod は GPU 全体をリクエストする必要があります。Pod が GPU 全体のリソースを必要としない場合、リソースの無駄遣いになります。GPU 共有を使用すると、Pod に対してきめ細やかな異種計算能力をリクエストできます。GPU 共有は、Pod に対する柔軟な requestslimits の制約もサポートしています。この機能は、さまざまなアプリケーションシナリオにおけるリソースの隔離と共有の要件を満たします。

はじめに

重要
  • 本トピックは、ACS クラスターのみを対象としています。

  • GPU 共有は、よりきめ細かいリソース記述を提供します。これにより、単一の Pod が 1 つの GPU 全体よりも小さい単位 (例えば、GPU の計算能力の 0.5) でリソースをリクエストできます。複数の GPU にまたがる集約リクエスト (例えば、2 つの異なる GPU から同時に 0.5 の計算能力をリクエストすること) はサポートしていません

  • GPU 共有モジュールは、GPU 共有を使用する Pod のドライバーバージョンを維持します。個々の Pod に対してドライバーバージョンを指定することはできません。

  • この機能は、ウランチャブおよび上海金融クラウドリージョンでパブリックプレビュー中です。他のリージョンでこの機能を使用するには、してください

GPU 共有を使用する場合、Pod は特定の GPU デバイスに直接アクセスするのではなく、GPU 共有モジュールを介してデバイスと対話します。GPU 共有モジュールは、プロキシモジュールとリソース管理モジュールで構成されています。プロキシモジュールはデフォルトで Pod に統合されており、GPU デバイスに関連する API 呼び出しをインターセプトし、バックエンドのリソースモジュールに転送します。リソースモジュールは、実際の GPU デバイス上で GPU 命令を実行し、Pod のリソース記述に基づいて GPU リソースの使用量を制限します。

image

GPU 共有のリソースモジュールも、一部の CPU およびメモリリソースを消費します。これらは機能が有効化されると自動的に予約されます。詳細については、「ノード設定」をご参照ください。

リソース設定と QoS

共有 GPU リソースは、Kubernetes の requests/limits 制約を使用して記述されます。計算能力と GPU メモリをパーセンテージで設定できます。この機能は、limitsrequests よりも大きいリソース記述もサポートしています。これにより、複数の Pod が同時に GPU リソースを競合する可能性があります。ACK は、共有 GPU リソースに対してサービス品質 (QoS) を定義しています。ノード上の複数の Pod が同時に GPU リソースを使用する場合、Pod はキューに入れられ、プリエンプションがトリガーされることがあります。以下に例を示します:

...
resources:
  requests:  # ノードにスケジュールできる Pod の数を制御します。
    alibabacloud.com/gpu-core.percentage: 10         # Pod が必要とする計算能力のパーセンテージ。
    alibabacloud.com/gpu-memory.percentage: 10       # Pod が必要とする GPU メモリのパーセンテージ。
  limits:    # 実行時に使用できるリソースの上限を制御します。影響の詳細については、設定手順をご参照ください。
    alibabacloud.com/gpu-core.percentage: 100        # 計算能力使用量の上限。
    alibabacloud.com/gpu-memory.percentage: 100      # GPU メモリ使用量の上限。この上限を超えると、CUDA OOM エラーが発生します。
...

オペレーティングシステムのプロセス管理メカニズムと同様に、GPU 共有モジュールは Pod を休止状態、準備完了状態、実行中状態の 3 つの状態に分類します。状態遷移のプロセスを次の図に示します。

image
  • Pod が開始されると、休止状態になります。

  • Pod が GPU リソースを使用しようとすると、準備完了状態になります。その後、GPU 共有モジュールは優先度ポリシーに基づいて Pod に GPU リソースを割り当てます。

  • Pod に GPU リソースが割り当てられると、実行中状態になります。

  • すべてのリソースが割り当てられた後も準備完了状態の Pod が存在する場合、Pod 間のリソースの公平性を確保するためにプリエンプションメカニズムがトリガーされます。

  • Pod がプリエンプションされると、GPU リソースを占有しているプロセスが強制終了され、Pod は休止状態に戻ります。

キューイングポリシー

準備完了状態の Pod は、先入れ先出し (FIFO) ポリシーに基づいてキューに入れられます。GPU 共有モジュールは、最初に準備完了状態になった Pod にリソースを割り当てます。現在のリソースが不十分な場合、プリエンプションポリシーがトリガーされます。

プリエンプションポリシー

リソースが準備完了状態の Pod の要求を満たせない場合、GPU 共有モジュールは他の Pod のプリエンプションを試みます。まず、特定の条件に基づいて実行中の Pod をフィルター処理します。次に、対象となる Pod をスコアリングしてソートし、キューに入れられた Pod のリソース要求が満たされるまで、1 つずつプリエンプションします。

現在実行中の Pod のいずれもフィルター条件を満たさない場合、準備完了状態の Pod はキューに残り、リソースを待ちます。詳細は次のとおりです。

ポリシータイプ

説明

フィルターポリシー

現在実行中の Pod が GPU リソースを 2 時間継続して占有していること。これはカスタマイズ可能です。詳細については、「QoS 設定」をご参照ください。

スコアリングポリシー

Pod が GPU リソースを継続して占有している期間。リソースをより長く占有している Pod が最初にプリエンプションされます。

リソース共有モデル

GPU 共有は共有モデルに基づいており、複数の Pod が単一の GPU カード上で同時に実行できます。ACK は現在、次の共有モデルをサポートしています:

モデル名

効果

GPU 共有リソース設定

キューイングポリシー

プリエンプションポリシー

シナリオ

share-pool

ノード上のすべての GPU を共有プールとして扱います。Pod は、アイドル状態のリソースを持つ任意の物理 GPU を使用できます。

requests <= limits

FIFO

カスタム設定を許可します。

Notebook 開発シナリオ。リソース QoS の request/limit 設定と組み合わせることで、このモデルは複数のユーザーによるオフピーク時の GPU リソース使用をサポートします。リソースが不足すると、キューイングやプリエンプションなどの QoS メカニズムがトリガーされます。詳細については、「例:Notebook シナリオで share-pool モデルを使用してオフピーク時のリソース使用を行う」をご参照ください。

static

GPU スライシングシナリオ。Pod に固定の GPU デバイスを割り当て、実行中に変更されません。スケジューラは、断片化を避けるために、同じ GPU 上に Pod を配置することを優先します。

requests == limits

警告

GPU の計算能力またはメモリの request が limit より小さい場合、Pod 間でリソースの競合が発生します。これにより、メモリ不足 (OOM) エラーで Pod が強制終了される可能性もあります。

サポートされていません

サポートされていません

複数の Pod が GPU デバイスを共有してリソース使用率を向上させる小規模な AI アプリケーション。`request`==`limit` の制約により、Pod は実行中にいつでもキューイングなしで GPU リソースを取得できます。

例:Notebook シナリオで share-pool モデルを使用してオフピーク時のリソース使用を行う

Notebook 開発では、アプリケーションは通常、リソースを長時間占有しません。share-pool モデルを使用すると、Pod はオフピーク時に異なる GPU カード上で実行できます。Pod はリソースを必要とするときにのみ、準備完了キューに入ってリソースを待ちます。

以下は、Notebook シナリオのユースケースです:

image

Pod A と Pod B は `requests=0.5` および `limits=0.5` で設定されています。Pod C と Pod D は `requests=0.5` および `limits=1` で設定されています。`requests` の値に基づき、これらの Pod は 2 つの GPU を持つ単一の GPU-HPN ノードにスケジュールできます。

時間 T1:

  1. Pod A と Pod C がリソースを占有しています。Pod B と Pod D は準備完了キューにあり、スケジューリングを待っています。

  2. GPU 共有モジュールは、キューの先頭にある Pod D にリソースを割り当てようとします。しかし、GPU 0 には 0.5 GPU のアイドルリソースしかありません。Pod D の `request` は 0.5 であり、利用可能な容量で満たすことができますが、その `limit` は 1 です。同じ GPU 上で Pod A と Pod D を実行するとリソースの競合が発生するため、GPU 共有モジュールは Pod D をキューに保持します。

時間 T2 - フェーズ 1:

  1. Pod C のタスクが完了し、休止キューに入ります。

  2. GPU 1 がアイドル状態になると、そのリソースが Pod D に割り当てられます。

時間 T2 - フェーズ 2:

Pod B にリソースが割り当てられます。Pod B の `limit` は 0.5 であるため、リソースの競合なしに GPU 0 上で Pod A と同時に実行できます。

例:GPU 共有の使用

この例では、GPU 共有機能の使用方法を示します。手順には、GPU-HPN ノードで GPU 共有機能 (share-pool) を有効にし、共有 GPU リソースを使用する Pod を送信し、その後ノードで機能を無効にする方法が含まれます。

image

手順 1:GPU-HPN ノードへのラベルの追加

  1. GPU-HPN ノードを表示します。

    重要

    この機能を有効にする前に、ノード上で排他的な GPU リソースをリクエストする Pod を削除する必要があります。CPU とメモリリソースのみをリクエストする Pod を削除する必要はありません。

    kubectl get node -l alibabacloud.com/node-type=reserved

    期待される出力:

    NAME                     STATUS   ROLES   AGE   VERSION
    cn-wulanchabu-c.cr-xxx   Ready    agent   59d   v1.28.3-aliyun
  2. GPU 共有機能を有効にするには、ノード cn-wulanchabu-c.cr-xxx にラベル alibabacloud.com/gpu-share-policy=share-pool を追加します。

    $ kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=share-pool

手順 2:ノードの有効化ステータスの確認

ノードで機能が有効になるのを待ってから、有効化ステータスを確認します。capacity フィールドに GPU 共有リソースが表示されます。conditions フィールドでは、GPUSharePolicyValidTrue になっています。これは、機能が有効になっていることを示します。

$ kubectl get node cn-wulanchabu-c.cr-xxx -o yaml

GPU 共有ポリシーが有効になると、ノードのステータスが更新されます。期待される出力:

# 実際の出力は異なる場合があります。
apiVersion: v1
kind: Node
spec: 
  # ...
status:
  allocatable:
    # GPU 共有リソースの説明
    alibabacloud.com/gpu-core.percentage: "1600"
    alibabacloud.com/gpu-memory.percentage: "1600"
    # 機能が有効になると、CPU、メモリ、ストレージリソースが GPU 共有モジュール用に予約されます。
    cpu: "144"
    memory: 1640Gi
    nvidia.com/gpu: "16"
    ephemeral-storage: 4608Gi
  capacity:
    # GPU 共有リソースの説明
    alibabacloud.com/gpu-core.percentage: "1600"
    alibabacloud.com/gpu-memory.percentage: "1600"
    cpu: "176"
    memory: 1800Gi
    nvidia.com/gpu: "16"
    ephemeral-storage: 6Ti
  conditions:
  # GPU 共有ポリシー設定が有効かどうかを示します。
  - lastHeartbeatTime: "2025-01-07T04:13:04Z"
    lastTransitionTime: "2025-01-07T04:13:04Z"
    message: gpu share policy is valid.
    reason: Valied
    status: "True"
    type: GPUSharePolicyValid
  # 現在のノードで有効な GPU 共有ポリシーを示します。
  - lastHeartbeatTime: "2025-01-07T04:13:04Z"
    lastTransitionTime: "2025-01-07T04:13:04Z"
    message: gpu share policy is share-pool.
    reason: share-pool
    status: "True"
    type: GPUSharePolicy

GPU 共有リソースの設定項目に関する詳細については、「ノード設定」をご参照ください。

手順 3:GPU 共有リソース仕様を持つ Pod のデプロイ

  1. gpu-share-demo.yaml という名前のファイルを作成します。ノードと同じ share-pool モデルを使用するように設定します。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        alibabacloud.com/compute-class: "gpu-hpn"
        # Pod の GPU 共有モデルを、ノード設定と同じ share-pool に設定します。
        alibabacloud.com/gpu-share-policy: "share-pool" # static
      name: gpu-share-demo
      namespace: default
    spec:
      containers:
      - name: demo
        image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
        args:
          - '1000h'
        command:
          - sleep
        # リソース記述で GPU 共有リソース gpu-core.percentage と gpu-memory.percentage を指定します。
        # request と limit の影響に関する詳細については、設定手順をご参照ください。
        resources:
          limits:
            cpu: '5'
            memory: 50Gi
            alibabacloud.com/gpu-core.percentage: 100
            alibabacloud.com/gpu-memory.percentage: 100
          requests:
            cpu: '5'
            memory: 50Gi
            alibabacloud.com/gpu-core.percentage: 10
            alibabacloud.com/gpu-memory.percentage: 10
  2. サンプル Pod をデプロイします。

    kubectl apply -f gpu-share-demo.yaml

手順 4:Pod の GPU 共有リソース使用量の確認

コンテナーにログインして、Pod の GPU 共有リソース使用量を確認します。

kubectl exec -it pod gpu-share-demo -- /bin/bash

`nvidia-smi` などのコマンドを使用して、コンテナーの GPU リソース割り当てと使用状況を表示します。実際の出力は異なる場合があります。

説明

share-pool タイプの Pod の場合、Pod が GPU リソースを使用していないとき、BusID フィールドには `Pending` と表示されます。

特定のコマンドは GPU カードの種類によって異なります。例えば、nvidia-smi は NVIDIA シリーズの GPU デバイスに対応します。他のカードタイプについては、してサポートを依頼してください。

(オプション) 手順 5:ノードでの GPU 共有ポリシーの無効化

重要

ポリシーを無効にする前に、ノード上で GPU 共有リソースをリクエストする Pod を削除する必要があります。CPU とメモリリソースのみをリクエストする Pod を削除する必要はありません。

  1. GPU 共有機能を使用する Pod を削除します。

    $ kubectl delete pod gpu-share-demo
  2. ノードで GPU 共有機能を無効にします。

    $ kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=none
  3. ノードのポリシー設定ステータスを再度確認します。

    $ kubectl get node cn-wulanchabu-c.cr-xxx -o yaml

    期待される出力:

    apiVersion: v1
    kind: Node
    spec: 
      # ...
    status:
      allocatable:
        # 機能が無効になると、予約されていた CPU とメモリリソースは初期値に戻ります。
        cpu: "176"
        memory: 1800Gi
        nvidia.com/gpu: "16"
        ephemeral-storage: 4608Gi
      capacity:
        cpu: "176"
        memory: 1800Gi
        nvidia.com/gpu: "16"
        ephemeral-storage: 6Ti
      conditions:
      # GPU 共有ポリシー設定が有効かどうかを示します。
      - lastHeartbeatTime: "2025-01-07T04:13:04Z"
        lastTransitionTime: "2025-01-07T04:13:04Z"
        message: gpu share policy config is valid.
        reason: Valid
        status: "True"
        type: GPUSharePolicyValid
      # 現在のノードで有効な GPU 共有ポリシーを示します。
      - lastHeartbeatTime: "2025-01-07T04:13:04Z"
        lastTransitionTime: "2025-01-07T04:13:04Z"
        message: gpu share policy is none.
        reason: none
        status: "False"
        type: GPUSharePolicy

詳細な設定手順

ノード設定

有効化設定

GPU 共有を有効にするには、ノードにラベルを設定します。詳細は次のとおりです。

設定項目

説明

有効な値

alibabacloud.com/gpu-share-policy

GPU リソース共有ポリシー。

  • none:ノードで GPU 共有機能を無効にします。

  • share-pool:ノード上のすべての GPU を共有プールとして扱います。Pod は特定の GPU デバイスに固定されず、アイドル状態のリソースを持つ任意の物理 GPU を使用できます。

  • static:GPU スライシングシナリオ。Pod は固定の GPU デバイス上で実行されます。

apiVersion: v1
kind: Node
metadata:
  labels:
    # 機能を有効にし、share-pool ポリシーを使用します。値には他のポリシーを指定できます。
    alibabacloud.com/gpu-share-policy: share-pool
重要
  • ノード上に排他的な GPU を使用する Pod がすでに存在する場合、共有ポリシーを有効にする前にそれらを削除する必要があります。

  • ノード上に GPU 共有リソースを使用する Pod がすでに存在する場合、GPU 共有ポリシーを変更または無効にすることはできません。まずこれらの Pod を削除する必要があります。

  • CPU とメモリリソースのみをリクエストする Pod を削除する必要はありません。

QoS 設定

GPU-HPN ノードでは、ノードのアノテーションで GPU 共有のサービス品質 (QoS) パラメーターを設定できます。次の形式を使用します。

apiVersion: v1
kind: Node
...
metadata:
  annotations:
    alibabacloud.com/gpu-share-qos-config: '{"preemptEnabled": true, "podMaxDurationMinutes": 120, "reservedEphemeralStorage": "1.5Ti"}'
...

詳細は次のとおりです:

パラメーター

タイプ

有効な値

説明

preemptEnabled

ブール値

  • true

  • false

share-pool モデルにのみ適用されます。プリエンプションを有効にするかどうかを指定します。デフォルト値は true で、プリエンプションが有効になります。

podMaxDurationMinutes

Int

0 より大きい整数。単位:分。

share-pool モデルにのみ適用されます。Pod は、この時間よりも長く GPU を占有している場合にのみプリエンプションされる可能性があります。デフォルト値は 120 で、2 時間です。

reservedEphemeralStorage

resource.Quantity

0 以上。単位は Kubernetes の文字列形式で、500Gi などです。

ノードのローカル一時ストレージの予約容量。デフォルト値は 1.5 TiB です。

ノード上の共有リソースの表示

機能が有効になると、対応する GPU 共有リソース名がノードの `allocatable` および `capacity` フィールドに追加されます。基本的なリソースオーバーヘッドは `allocatable` フィールドから差し引かれます。リソース名は次のように記述されます。

設定項目

説明

計算方法

alibabacloud.com/gpu-core.percentage

GPU 共有リソースの計算能力 (パーセンテージ形式)。

このフィールドは機能が有効になると追加され、無効になると削除されます。

デバイス数 × 100。例えば、16 個の GPU を持つマシンの場合、値は 1600 です。

alibabacloud.com/gpu-memory.percentage

GPU 共有リソースの GPU メモリ (パーセンテージ形式)。

このフィールドは機能が有効になると追加され、無効になると削除されます。

デバイス数 × 100。例えば、16 個の GPU を持つマシンの場合、値は 1600 です。

cpu

機能が有効になると、基本的なオーバーヘッドが GPU 共有モジュールのために .status.allocatable から差し引かれます。予約は機能が無効になると自動的にキャンセルされます。

デバイス数 × 2。例えば、16 個の GPU を持つマシンの場合、32 コアが予約されます。

memory

デバイス数 × 10 GB。例えば、16 個の GPU を持つマシンの場合、160 GB が予約されます。

ephemeral-storage

ノードあたり 1.5 TB のディスク領域。

正確性に関するヒント

フィールド

説明

type

GPUSharePolicyValid

現在の GPU 共有設定が有効かどうかを示します。

status

"True", "False"

  • True:現在の GPU 共有設定は有効です。

  • False:現在の GPU 共有設定は無効です。理由は condition.reason で確認できます。

reason

Valid, InvalidParameters, InvalidExistingPods, ResourceNotEnough

  • Valid:現在の共有ポリシー設定は有効です。

  • InvalidParameters:現在の共有ポリシー設定に構文エラーがあります。

  • InvalidExistingPods:現在のノードに他のタイプの GPU Pod が存在します。機能を有効または無効にできません。

  • ResourceNotEnough:現在のノードには、GPU 共有機能の基本的なオーバーヘッドを満たすためのリソースが不足しています。機能を有効にする前に、いくつかの Pod を削除する必要があります。予約済みリソースの詳細については、「ノード設定」をご参照ください。

message

-

ユーザーフレンドリーなメッセージ。

  • lastTransitionTime

  • lastHeartbeatTime

UTC

condition が最後に更新された時刻。

現在有効な GPU 共有ポリシー

フィールド

説明

type

GPUSharePolicy

現在の GPU 共有設定が有効かどうかを示します。

status

"True", "False"

  • True:現在のノードで GPU 共有機能が有効になっています。

  • False:現在のノードで GPU 共有機能が有効になっていません。

reason

none, share-pool, static

  • none:現在のノードで GPU 共有機能が有効になっていません。

  • share-pool:現在のノードで share-pool 共有ポリシーが有効です。

  • static:現在のノードで static 共有ポリシーが有効です。

message

-

ユーザーフレンドリーなメッセージ。

  • lastTransitionTime

  • lastHeartbeatTime

UTC

condition が最後に更新された時刻。

重要

機能を有効または無効にした後、ノードリソースが上記のように変更されない場合、設定の変更は失敗しています。conditions フィールドの有効性条件メッセージで確認できます。

Pod 設定

機能が有効になった後、Pod の GPU 共有リソースラベルを設定することで使用できます。

apiVersion: v1
kind: Pod
metadata:
  labels:
    # gpu-hpn コンピュートクラスのみがサポートされています。
    alibabacloud.com/compute-class: "gpu-hpn"
    # Pod の GPU 共有モデルを、ノード設定と同じ share-pool に設定します。
    alibabacloud.com/gpu-share-policy: "share-pool"
  name: gpu-share-demo
  namespace: default
spec:
  containers:
  - name: demo
    image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
    args:
      - '1000h'
    command:
      - sleep
    resources:
      limits:
        cpu: '5'
        memory: 50Gi
        alibabacloud.com/gpu-core.percentage: 100
        alibabacloud.com/gpu-memory.percentage: 100
      requests:
        cpu: '5'
        memory: 50Gi
        alibabacloud.com/gpu-core.percentage: 10
        alibabacloud.com/gpu-memory.percentage: 10

設定項目は次のように記述されます:

コンピュートクラス

設定項目

説明

metadata.labels.alibabacloud.com/compute-class

gpu-hpn

gpu-hpn コンピュートクラスのみがサポートされています。

GPU 共有ポリシー

設定項目

タイプ

有効な値

説明

metadata.labels.alibabacloud.com/gpu-share-policy

文字列

  • none

  • share-pool

  • static

Pod の GPU 共有モデルを指定します。このモデルに一致するノードのみがスケジューリングの対象となります。

リソース要件

コンテナーのリソースリクエストで GPU 共有リソースを設定し、計算能力と GPU メモリの要件と制限を記述します。これらの設定は、ノードにスケジュールできる Pod の数を制御します。ノード上の Pod の数は、CPU、メモリ、Pod の最大数など、他のリソースディメンションによっても制限されます。

要件カテゴリ

設定項目

タイプ

有効な値

説明

requests

alibabacloud.com/gpu-core.percentage

Int

share-pool ポリシー:[10, 100]

static ポリシー:[10, 100)

計算能力のパーセンテージ。単一 GPU の計算能力の要求割合を示します。最小値は 10% です。

alibabacloud.com/gpu-memory.percentage

GPU メモリのパーセンテージ。単一 GPU のメモリの要求割合を示します。最小値は 10% です。

limits

alibabacloud.com/gpu-core.percentage

計算能力のパーセンテージ。単一 GPU の計算能力の要求上限割合を示します。最小値は 10% です。

alibabacloud.com/gpu-memory.percentage

GPU メモリのパーセンテージ。単一 GPU のメモリの要求上限割合を示します。最小値は 10% です。

設定の制約

個々の設定項目に対する制約に加えて、Pod がリソースをリクエストする際には次の制約が適用されます。

  • requestslimits の両方で、GPU メモリと計算能力 (alibabacloud.com/gpu-core.percentagealibabacloud.com/gpu-memory.percentage) の両方を指定する必要があります。

  • 1 つの Pod には、GPU 共有リソースを使用するコンテナーを最大 1 つしか含めることができません。これは通常、メインコンテナーです。サイドカーコンテナーなどの他のコンテナーは、CPU やメモリなどの非 GPU リソースのみをリクエストできます。

  • コンテナーは、排他的な GPU リソース (例:nvidia.com/gpu) と GPU 共有リソース (alibabacloud.com/gpu-core.percentage, alibabacloud.com/gpu-memory.percentage) の両方をリクエストすることはできません。

よくある質問

GPU リソースが利用できない場合、準備完了キューの Pod はどうなりますか?

GPU 共有 Pod がリソースを待っている間、定期的にメッセージを出力します。以下はサンプルメッセージです。

You have been waiting for ${1} seconds. Approximate position: ${2}

${1} パラメーターは待機時間を示し、${2} パラメーターは準備完了キューでの現在の位置を示します。

GPU 共有モードに固有の Pod モニタリングメトリックは何ですか?

GPU 共有リソースを使用する Pod については、次のメトリックを使用してリソース使用量を確認できます。

メトリック

説明

DCGM_FI_POOLING_STATUS

share-pool モードでのみ提供されます。GPU 共有モードでの Pod のステータス (休止、準備完了、実行中) を示します。詳細は次のとおりです:

  • 0 "Hibernation":Pod には GPU リソースの需要がありません。

  • 1 "Ready":Pod は GPU リソースを待機しています。

  • 2 "Normal":Pod は GPU リソースを使用しており、連続占有時間が `podMaxDurationMinutes` を超えていません。

  • 3 "Preemptible":Pod は GPU リソースを使用しており、連続占有時間が `podMaxDurationMinutes` を超えています。しかし、キューに他の Pod がないため、リソースを占有し続けることができます。

DCGM_FI_POOLING_STATUS{NodeName="cn-wulanchabu-c.cr-xxx",pod="gpu-share-demo",namespace="default"} 1

DCGM_FI_POOLING_POSITION

share-pool モードでのみ提供されます。Pod が準備完了キューでリソースを待機していることを示します。値は、準備完了キューでの Pod の位置を示し、1 から始まります。

このメトリックは POOLING_STATUS=1 の場合にのみ表示されます。

DCGM_FI_POOLING_POSITION{NodeName="cn-wulanchabu-c.cr-xxx",pod="gpu-share-demo",namespace="default"} 1

Pod が GPU 共有を使用する場合、GPU 使用率メトリックはどのように異なりますか?

Pod の GPU 使用率メトリックは以前と同じです。ただし、GPU 共有を使用する Pod の場合、メトリックのラベルと意味が異なります。

  • ACK が提供する Pod モニタリングデータでは、GPU 計算能力使用率や GPU メモリ使用量などのメトリックは、排他的な GPU シナリオと同様に、GPU カード全体に基づいた絶対値です。

  • `nvidia-smi` などのコマンドを使用して Pod 内で確認できる GPU メモリ使用量は、排他的な GPU シナリオと同様に絶対値です。ただし、計算能力使用率は相対値であり、分母は Pod の limit です。

  • Pod の GPU 使用率メトリックの ID 番号などのデバイス情報は、ノード上の実際の ID に対応します。番号付けは必ずしも 0 から始まるとは限りません。

  • share-pool 共有モデルの場合、Pod がプールから異なる GPU デバイスを弾力的に使用するため、メトリックのデバイス番号が変更されることがあります。

クラスター内の一部のノードでのみ GPU 共有が有効になっている場合、排他的な GPU Pod とのスケジューリング競合を回避するにはどうすればよいですか?

ACK クラスターのデフォルトスケジューラは、Pod とノードのタイプを自動的に照合して、スケジューリングの競合を回避します。

カスタムスケジューラを使用する場合、ノードの容量に GPU デバイスリソースと GPU 共有リソースの両方が含まれるため、排他的な GPU Pod が GPU 共有ノードにスケジュールされる可能性があります。次のいずれかのソリューションを選択できます:

  • ソリューション 1:ACK ノードの設定ラベルと condition プロトコルを自動的に検出し、不一致のタイプのノードを除外するスケジューラプラグインを作成します。詳細については、「Scheduling Framework」をご参照ください。

  • ソリューション 2:Kubernetes のラベルまたは Taint を使用します。GPU 共有が有効になっているノードにラベルまたは Taint を追加します。次に、排他的な GPU Pod と共有 GPU Pod に異なるアフィニティポリシーを設定します。

GPU 共有 Pod がプリエンプションされた場合、どのような情報が得られますか?

share-pool 共有モデルの場合、プリエンプションがトリガーされると、Pod には Event と Condition があります。Event は非構造化データ形式です。構造化データを読み取るには、対応する Condition の `reason` および `status` フィールドから取得できます。詳細は次のとおりです。

# 現在の Pod の GPU リソースがプリエンプションされたことを示します。プリエンプションした Pod の名前は <new-pod-name> です。
Warning  GPUSharePreempted  5m15s  gpushare   GPU is preempted by <new-pod-name>.
# 現在の Pod が別の Pod の GPU リソースをプリエンプションしたことを示します。プリエンプションされた Pod の名前は <old-pod-name> です。
Warning  GPUSharePreempt    3m47s  gpushare   GPU is preempted from <old-pod-name>.
- type: Interruption.GPUShareReclaim # GPU 共有 Pod プリエンプションのイベントタイプ。
  status: "True" # True は、プリエンプションまたはプリエンプションされたアクションが発生したことを示します。
  reason: GPUSharePreempt # GPUSharePreempt は、この Pod が別の Pod をプリエンプションしたことを示します。GPUSharePreempted は、この Pod が別の Pod によってプリエンプションされたことを示します。
  message: GPU is preempted from <old-pod-name>. # イベントと同様のユーザーフレンドリーなメッセージ。
  lastTransitionTime: "2025-04-22T08:12:09Z" # プリエンプションが発生した時刻。
  lastProbeTime: "2025-04-22T08:12:09Z"

Notebook シナリオでノード上により多くの Pod を実行するにはどうすればよいですか?

GPU 共有が有効になっている Pod について、ACK では `request` が `limit` より小さい CPU およびメモリ仕様を設定することもできます。これにより、ノードリソースを最大限に活用できます。ノードに送信された Pod のリソースの `limit` の合計がノードの割り当て可能なリソースを超えると、Pod は CPU およびメモリリソースを競合することに注意してください。ノードのリソース使用率データを確認することで、CPU とメモリのリソース競合を分析できます。詳細については、「ACK GPU-HPN ノードレベルのモニタリングメトリック」をご参照ください。Pod の場合、CPU リソースの競合は Pod の CPU Steal Time に反映されます。メモリリソースの競合は、マシン全体のアウトオブメモリ (OOM) エラーをトリガーし、一部の Pod が強制終了される原因となります。リソース競合による Pod のサービス品質への影響を避けるために、アプリケーションの特性に基づいて Pod の優先順位とリソース仕様を計画してください。