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

Container Service for Kubernetes:DRA を使用した GPU のスケジューリング

最終更新日:Oct 23, 2025

複数のアプリケーションが GPU リソースを共有する必要がある AI トレーニングおよび推論タスクでは、従来のデバイスプラグインにはスケジューリングの制限があります。Container Service for Kubernetes (ACK) クラスターに NVIDIA DRA ドライバーをデプロイすることで、Kubernetes Dynamic Resource Allocation (DRA) API を活用して、Pod 間の動的で詳細な GPU 割り当てを実現します。これにより、GPU の使用率が向上し、コストが削減されます。

仕組み

  • DRA は、PersistentVolume モデルを GPU などの汎用リソースに拡張する Kubernetes API であり、Pod がそれらをリクエストして共有できるようにします。従来のデバイスプラグインモデルと比較して、DRA はリソースをリクエストするためのより柔軟で詳細な方法を提供します。

  • NVIDIA DRA Driver for GPUs は、DRA API を実装して、Kubernetes ワークロードに GPU を割り当てる最新の方法を提供します。GPU の制御された共有と動的な再構成をサポートします。

前提条件

Kubernetes バージョン 1.34 以降を実行している ACK マネージドクラスター が必要です。

DRA GPU スケジューリング環境の構成

ステップ 1: GPU ノードプールの作成

DRA ベースの GPU スケジューリング用のノードプールを作成します。ノードラベルを使用してデフォルトの GPU デバイスプラグインを無効にし、GPU が二重にカウントされるのを防ぎます。

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

  2. [ノードプールを作成] をクリックし、ACK がサポートする GPU インスタンスタイプを選択します。他のパラメーターはデフォルト値のままにします。

    1. [インスタンスタイプの指定] をクリックし、ecs.gn7i-c8g1.2xlarge などのインスタンスタイプを入力します。[ノード数]1 に設定します。

    2. [詳細オプション (オプション)] を展開します。[ノードラベル] セクションで、キーと値のペア ack.node.gpu.schedule: disabled を入力します。このラベルは、デフォルトの排他的 GPU スケジューリング機能を無効にし、GPU デバイスプラグインがリソースを報告するのを防ぎます。

      デバイスプラグインと DRA の両方を有効にすると、GPU リソースが 2 回割り当てられます。DRA ノードでは、GPU デバイスプラグインのリソース報告を無効にしてください。

ステップ 2: NVIDIA DRA ドライバーのインストール

Helm を使用して NVIDIA DRA GPU ドライバーをインストールします。このドライバーは、クラスターに DRA API の実装を提供します。

  1. クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続する

  2. まだインストールしていない場合は、Helm CLI をインストールします。

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  3. NVIDIA Helm リポジトリを追加して更新します。

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
    && helm repo update
  4. NVIDIA DRA GPU ドライバーのバージョン 25.3.2 をインストールします。このコマンドは、前のステップでラベルを付けたノードでのみドライバーが実行されるように構成します。

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu --version="25.3.2" --create-namespace --namespace nvidia-dra-driver-gpu \
        --set gpuResourcesEnabledOverride=true \
        --set controller.affinity=null \
        --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key=ack.node.gpu.schedule" \
        --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator=In" \
        --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]=disabled"
    重要

    --set controller.affinity=null パラメーターは、controller ワークロードからノードアフィニティ宣言を削除します。これにより、controller ワークロードを任意のノードにスケジュールできますが、安定性の問題が発生する可能性があります。本番環境でこの操作を実行する前に、影響を評価してください。

    次の出力は、ドライバーがインストールされたことを示します。

    NAME: nvidia-dra-driver-gpu
    LAST DEPLOYED: Tue Oct 14 20:42:13 2025
    NAMESPACE: nvidia-dra-driver-gpu
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None

ステップ 3: 環境の確認

NVIDIA DRA ドライバーが期待どおりに実行され、GPU リソースが Kubernetes クラスターに報告されていることを確認します。

  1. DRA GPU ドライバーのすべての Pod が Running 状態であることを確認します。

    kubectl get pod -n nvidia-dra-driver-gpu
  2. DRA 関連のリソースが作成されていることを確認します。

    kubectl get deviceclass,resourceslice

    期待される出力:

    NAME                                                                    AGE
    deviceclass.resource.k8s.io/compute-domain-daemon.nvidia.com            60s
    deviceclass.resource.k8s.io/compute-domain-default-channel.nvidia.com   60s
    deviceclass.resource.k8s.io/gpu.nvidia.com                              60s
    deviceclass.resource.k8s.io/mig.nvidia.com                              60s
    
    NAME                                                                                   NODE                      DRIVER                      POOL                      AGE
    resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-compute-domain.nvidia.com-htjqn   cn-beijing.10.11.34.156   compute-domain.nvidia.com   cn-beijing.10.11.34.156   57s
    resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj              cn-beijing.10.11.34.156   gpu.nvidia.com              cn-beijing.10.11.34.156   57s
  3. 現在の環境での GPU リソース報告の詳細を表示します。

    cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhjresourceslice リソースオブジェクトの実際の名前で置き換えてください。
    kubectl get resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj -o yaml

DRA GPU を使用したワークロードのデプロイ

このセクションでは、DRA を使用して GPU リソースをリクエストするワークロードをデプロイする方法を示します。これは、ResourceClaimTemplate を作成して ResourceClaim を自動的に作成することによって行われます。
  1. 単一の GPU をリクエストする ResourceClaimTemplate を宣言します。次の内容を resource-claim-template.yaml として保存します。

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: single-gpu
    spec:
      spec:
        devices:
          requests:
          - exactly:
              allocationMode: ExactCount
              deviceClassName: gpu.nvidia.com
              count: 1
            name: gpu

    クラスターに ResourceClaimTemplate を作成します。

    kubectl apply -f resource-claim-template.yaml
  2. resource-claim-template-pod.yaml という名前のファイルを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod1
      labels:
        app: pod
    spec:
      containers:
      - name: ctr
        image: registry-cn-hangzhou.ack.aliyuncs.com/dev/ubuntu:22.04
        command: ["bash", "-c"]
        args: ["nvidia-smi -L; trap 'exit 0' TERM; sleep 9999 & wait"]
        resources:
          claims:
          - name: gpu
      resourceClaims:
      - name: gpu
        resourceClaimTemplateName: single-gpu

    ResourceClaimTemplate を参照するワークロードを作成します。

    kubectl apply -f resource-claim-template-pod.yaml
  3. 自動的に作成された ResourceClaim を表示します。

    1. 現在の名前空間で ResourceClaim を見つけます (例: pod1-gpu-wstqm)。

      kubectl get resourceclaim
    2. ResourceClaim の詳細を表示します。

      pod1-gpu-wstqmResourceClaim リソースオブジェクトの実際の名前で置き換えてください。
      kubectl describe resourceclaim pod1-gpu-wstqm
  4. Pod のログをチェックして、GPU にアクセスできることを確認します。期待される出力には、GPU 0: NVIDIA A10 のように割り当てられた GPU がリストされます。

    kubectl logs pod1

(オプション) 環境のクリーンアップ

終了したら、作成したリソースを削除して、不要なコストを回避します。

  • デプロイされたワークロードとクレームテンプレートを削除します。

    kubectl delete pod pod1
    kubectl delete resourceclaimtemplate single-gpu
  • Nvidia GPU DRA ドライバーをアンインストールします。

    helm uninstall nvidia-dra-driver-gpu -n nvidia-dra-driver-gpu
  • ノードリソースを削除または解放する