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

Container Service for Kubernetes:GPU 共有の操作

最終更新日:Sep 05, 2026

GPU 共有を使用すると、ACK Lingjun マネージドクラスター内の同じ GPU カード上で複数の Pod を実行できます。 ワークロードで厳密なメモリ境界が必要かどうかに応じて、2 つのモードから選択します。

モード

ノードラベル

仕組み

GPU メモリ分離

使用シナリオ

アイソレーションなしの共有

ack.node.gpu.schedule=share

Pod が GPU を共有します。メモリは Pod 間で分割されません。

いいえ

独自のメモリ制限を管理するワークロード (例: -Xmx を使用する Java アプリケーション)

アイソレーションありの共有 (eGPU)

GPU メモリのアイソレーションのみの場合は ack.node.gpu.schedule=egpu_mem、GPU メモリのアイソレーションとコンピューティング能力のアイソレーションの場合は ack.node.gpu.schedule=egpu_core_mem

Pod が GPU を共有します。各 Pod には、eGPU モジュールによって厳密なメモリ境界が適用されます。

はい

1 つの GPU 上で複数のコンテナーがあり、1 つのコンテナーが他のコンテナーのリソースを枯渇させてはならない場合

Lingjun ノードプールの GPU 共有は、これらのラベルのいずれかを持つノードでのみ有効になります。

前提条件

開始する前に、次の項目が準備できていることを確認してください。

  • 少なくとも 1 つの GPU アクセラレーション対応 Lingjun ノードを持つ ACK Lingjun マネージドクラスターがあること。 詳細については、「ACK をアクティブ化した Lingjun クラスターの作成」をご参照ください。

  • Lingjun ノードプールがあること。 詳細については、「Lingjun ノードプールの作成」をご参照ください。

  • Lingjun ベアメタルクラスターで KuberGPU (eGPU) 機能が有効になっていること。

  • ack-ai-installer アドオンは、クラウドネイティブ AI スイートをデプロイする際に スケジューリングポリシーの拡張 (一括タスクスケジューリング、GPU 共有、GPU トポロジ認識) を選択すると、お使いの ACK マネージドプロフェッショナル版クラスターにインストールされます。

  • GPU 共有アドオンは、ACK Lingjun マネージドクラスターにデフォルトでインストールされています。 ノードで GPU 共有を有効にするには、GPU 共有ラベルをノードに追加してください。

アイソレーションなしでの GPU 共有の有効化

このモードは、ワークロードが独自の GPU メモリ制限を提供する場合に使用します。 この場合、GPU アイソレーションモジュールを使用してアプリケーションメモリを分離すると、リソースの競合などの問題が発生するため、共有 GPU スケジューリングでは、これらのノードにアイソレーションモジュールをインストールしない構成もサポートされています。 アイソレーションなしの GPU 共有では、複数の Pod が同じ GPU カード上で実行されます。 GPU メモリの競合など、カード上の Pod 間の干渉は処理されないか、アプリケーションレイヤーに任されます。

ステップ 1:ノードへのラベル付け

  1. ノードに /etc/lingjun_metadata が存在するかどうかを確認して、ノードが Lingjun ノードであることを確かめます。 ファイルが存在する場合は、nvidia-smi を実行して GPU が利用可能であることを確認します。 出力が正常であれば、そのノードは GPU 共有をサポートする Lingjun ノードであり、次のステップに進むことができます。 ファイルが存在しない場合、そのノードは Lingjun ノードではないため、GPU 共有を有効にすることはできません。 まず Lingjun ノードを作成してください。 詳細については、「Lingjun ノードプールの概要」をご参照ください。

  2. GPU 共有ラベルをノードに追加します。

    kubectl label node <NODE_NAME> ack.node.gpu.schedule=share

    または、コンソールで ノードラベル機能を使用してラベルを設定することもできます。

ステップ 2:GPU 共有 Job の送信

  1. 次の内容で tensorflow.yaml という名前のファイルを作成します。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tensorflow-mnist-share
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: tensorflow-mnist-share
        spec:
          containers:
          - name: tensorflow-mnist-share
            image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5
            command:
            - python
            - tensorflow-sample-code/tfjob/docker/mnist/main.py
            - --max_steps=100000
            - --data_dir=tensorflow-sample-code/data
            resources:
              limits:
                aliyun.com/gpu-mem: 4  # 4 GiB の GPU メモリを要求
            workingDir: /root
          restartPolicy: Never

    キーフィールドは resources.limits の下にある aliyun.com/gpu-mem: 4 であり、Pod に 4 GiB の GPU メモリを要求することを示します。

  2. Job を送信します。

    kubectl apply -f tensorflow.yaml

ステップ 3:アイソレーションなしの GPU 共有の検証

  1. Pod 名を取得します。

    kubectl get pod | grep tensorflow
  2. Pod 内で nvidia-smi を実行します。

    kubectl exec -ti tensorflow-mnist-share-xxxxx -- nvidia-smi

    想定される出力:

    Wed Jun 14 06:45:56 2023
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 515.105.01   Driver Version: 515.105.01   CUDA Version: 11.7     |
    |-------------------------------+----------------------+----------------------+
    | 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:09.0 Off |                    0 |
    | N/A   35C    P0    59W / 300W |    334MiB / 16384MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    確認すべき主なフィールド:

    • Memory-Usage は 334MiB / 16384MiB を表示します。これは、Pod が要求した 4 GiB だけでなく、16,384 MiB の GPU メモリ全体を認識しており、アイソレーションがアクティブでないことを示しています。 この例では V100 GPU カードを使用し、Pod は 4 GiB の GPU メモリを要求します。 実際の値はご使用の環境によって異なります。

    • GPU アイソレーションモジュールがインストールされている場合、メモリフィールドには要求された 4 GiB のみが表示されます。

このモードでは、GPU ドライバーレベルでメモリ制限は適用されません。アプリケーションは、使用可能な GPU メモリを、次の出力に示されている 2 つの環境変数から読み取ります。この割り当てをカードの合計メモリに対する割合として表すには、4 / 16 = 0.25 (合計 GPU メモリの 25%) のように 2 つの値を割ります。
ALIYUN_COM_GPU_MEM_CONTAINER=4   # この Pod に割り当てられた GPU メモリ (GiB)
ALIYUN_COM_GPU_MEM_DEV=16        # カードあたりの合計 GPU メモリ (GiB)

アイソレーションありでの GPU 共有の有効化 (eGPU)

このモードを使用して、同じ GPU カード上の Pod 間に厳密な GPU メモリ境界を適用します。 NVIDIA vGPU、MPS、vCUDA、eGPU などの業界ソリューションにより、より細かい粒度で GPU を使用することが可能になります。このセクションでは、eGPU アイソレーションモジュールを例として使用します。 アイソレーションありの GPU 共有では、複数の Pod が同じ GPU カード上で実行され、そのカード上の Pod 間の干渉も処理されます。

ステップ 1:ノードへのラベル付け

  1. ノードに /etc/lingjun_metadata が存在するかどうかを確認して、ノードが Lingjun ノードであることを確かめます。 ファイルが存在する場合は、nvidia-smi を実行して GPU がアクセス可能であることを確認します。 ファイルが存在しない場合、そのノードは Lingjun ノードではないため、GPU 共有を有効にすることはできません。 まず Lingjun ノードプールを作成してください。 詳細については、「Lingjun ノードプールの概要」をご参照ください。

  2. GPU 共有ラベルをノードに追加します。 必要なアイソレーションに基づいてラベルの値を選択します。

    ラベル値

    有効になる機能

    egpu_mem

    GPU メモリのアイソレーションのみ

    egpu_core_mem

    GPU メモリのアイソレーションとコンピューティング能力のアイソレーション

    メモリのアイソレーションを有効にするには:

    kubectl label node <NODE_NAME> ack.node.gpu.schedule=egpu_mem

    または、コンソールで ノードラベル機能を使用してラベルを設定することもできます。

    GPU メモリのみを要求することはできますが、GPU コンピューティング能力を要求する場合は、GPU メモリと GPU コンピューティング能力の両方を要求する必要があります。 コンピューティング能力のみの要求はサポートされていません。

ステップ 2:ノードリソースの準備状態の確認

ノードにラベルを付けた後、ノードが GPU リソースを報告するのを待ってから、確認します。

kubectl get node <NODE_NAME> -oyaml

allocatable セクションと capacity セクションで aliyun.com/gpu-mem と aliyun.com/gpu-count を探します:

allocatable:
  aliyun.com/gpu-count: "1"
  aliyun.com/gpu-mem: "80"
  ...
  nvidia.com/gpu: "0"
  ...
capacity:
  aliyun.com/gpu-count: "1"
  aliyun.com/gpu-mem: "80"
  ...
  nvidia.com/gpu: "0"
  ...

確認すべき主なフィールド:

  • aliyun.com/gpu-count: "1":ノードに GPU カードが 1 つあることを示します。

  • aliyun.com/gpu-mem: "80":ノードの合計 GPU メモリが 80 GiB であることを示します。

  • nvidia.com/gpu: "0":GPU 全体は独立したスケジューリング可能なリソースとして公開されず、メモリは aliyun.com/gpu-mem 経由で割り当てられます。

ポッドを GPU デバイス全体にスケジュールするには、ポッドにラベル ack.gpushare.placement=require-whole-device を追加します。デフォルトでは、ポッドはその量の GPU メモリを持つ 1 つの GPU カード全体にスケジュールされます。aliyun.com/gpu-mem を使用してメモリ量を指定します。

ステップ 3:ベンチマーク Job を実行してアイソレーションを検証

  1. 次の内容で benchmark.yaml という名前のファイルを作成します。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: benchmark-job
    spec:
      parallelism: 1
      template:
        spec:
          containers:
          - name: benchmark-job
            image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
            command:
            - bash
            - run.sh
            - --num_batches=500000000
            - --batch_size=8
            resources:
              limits:
                aliyun.com/gpu-mem: 10  # 10 GiB の GPU メモリを要求
            workingDir: /root
          restartPolicy: Never
          hostNetwork: true
          tolerations:
            - operator: Exists
  2. Job を送信します。

    kubectl apply -f benchmark.yaml
  3. Pod が開始したら、Pod 内でシェルを開きます。

    kubectl exec -ti benchmark-job-xxxx bash
  4. vgpu-smi を実行して、GPU の分離ステータスを確認します:

    • Memory-Usage は 8307MiB / 10782MiB を表示しています。Pod は約 10 GiB に制限されており、GPU メモリのアイソレーションがアクティブであることを示しています。

    • 非隔離モードの nvidia-smi とは異なり、vgpu-smi は合計 GPU メモリではなく、このポッドに割り当てられたメモリのみを表示します。

    vgpu-smi

    想定される出力:

    +------------------------------------------------------------------------------+
    |    VGPU_SMI 460.91.03     DRIVER_VERSION: 460.91.03     CUDA Version: 11.2   |
    +-------------------------------------------+----------------------------------+
    | GPU  Name                Bus-Id           |        Memory-Usage     GPU-Util |
    |===========================================+==================================|
    |   0  xxxxxxxx            00000000:00:07.0 |  8307MiB / 10782MiB   100% /  100% |
    +-------------------------------------------+----------------------------------+

    確認すべき主なフィールド:

FAQ

GPU 共有コンポーネントがインストールされているか確認する方法

次のコマンドを実行します。

kubectl get ds -nkube-system | grep gpushare

コンポーネントがインストールされている場合、出力には次の DaemonSet がリストされます。

NAME                                 DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                    AGE
gpushare-egpu-device-plugin-ds       0         0         0       0            0           <none>
gpushare-egpucore-device-plugin-ds   0         0         0       0            0           <none>

次のステップ