GPU 共有を使用すると、ACK Lingjun マネージドクラスター内の同じ GPU カード上で複数の Pod を実行できます。 ワークロードで厳密なメモリ境界が必要かどうかに応じて、2 つのモードから選択します。
モード | ノードラベル | 仕組み | GPU メモリ分離 | 使用シナリオ |
アイソレーションなしの共有 |
| Pod が GPU を共有します。メモリは Pod 間で分割されません。 | いいえ | 独自のメモリ制限を管理するワークロード (例: |
アイソレーションありの共有 (eGPU) | GPU メモリのアイソレーションのみの場合は | 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:ノードへのラベル付け
ノードに
/etc/lingjun_metadataが存在するかどうかを確認して、ノードが Lingjun ノードであることを確かめます。 ファイルが存在する場合は、nvidia-smiを実行して GPU が利用可能であることを確認します。 出力が正常であれば、そのノードは GPU 共有をサポートする Lingjun ノードであり、次のステップに進むことができます。 ファイルが存在しない場合、そのノードは Lingjun ノードではないため、GPU 共有を有効にすることはできません。 まず Lingjun ノードを作成してください。 詳細については、「Lingjun ノードプールの概要」をご参照ください。GPU 共有ラベルをノードに追加します。
kubectl label node <NODE_NAME> ack.node.gpu.schedule=shareまたは、コンソールで ノードラベル機能を使用してラベルを設定することもできます。
ステップ 2:GPU 共有 Job の送信
次の内容で
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 メモリを要求することを示します。Job を送信します。
kubectl apply -f tensorflow.yaml
ステップ 3:アイソレーションなしの GPU 共有の検証
Pod 名を取得します。
kubectl get pod | grep tensorflowPod 内で
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:ノードへのラベル付け
ノードに
/etc/lingjun_metadataが存在するかどうかを確認して、ノードが Lingjun ノードであることを確かめます。 ファイルが存在する場合は、nvidia-smiを実行して GPU がアクセス可能であることを確認します。 ファイルが存在しない場合、そのノードは Lingjun ノードではないため、GPU 共有を有効にすることはできません。 まず Lingjun ノードプールを作成してください。 詳細については、「Lingjun ノードプールの概要」をご参照ください。GPU 共有ラベルをノードに追加します。 必要なアイソレーションに基づいてラベルの値を選択します。
ラベル値
有効になる機能
egpu_memGPU メモリのアイソレーションのみ
egpu_core_memGPU メモリのアイソレーションとコンピューティング能力のアイソレーション
メモリのアイソレーションを有効にするには:
kubectl label node <NODE_NAME> ack.node.gpu.schedule=egpu_memまたは、コンソールで ノードラベル機能を使用してラベルを設定することもできます。
GPU メモリのみを要求することはできますが、GPU コンピューティング能力を要求する場合は、GPU メモリと GPU コンピューティング能力の両方を要求する必要があります。 コンピューティング能力のみの要求はサポートされていません。
ステップ 2:ノードリソースの準備状態の確認
ノードにラベルを付けた後、ノードが GPU リソースを報告するのを待ってから、確認します。
kubectl get node <NODE_NAME> -oyamlallocatable セクションと 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 を実行してアイソレーションを検証
次の内容で
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: ExistsJob を送信します。
kubectl apply -f benchmark.yamlPod が開始したら、Pod 内でシェルを開きます。
kubectl exec -ti benchmark-job-xxxx bashvgpu-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>次のステップ
GPU スケジューリングポリシーを有効にするためのラベル:GPU スケジューリングで利用可能なすべてのノードラベルについて学びます。
Lingjun ノードプールの概要:クラスターに Lingjun ノードを追加する方法を学びます。