DRA ワークロード用に GKE インフラストラクチャを準備する

このドキュメントでは、Google Kubernetes Engine(GKE)のインフラストラクチャで動的リソース割り当て(DRA)を使用できるようにするための設定方法について説明します。設定手順には、GPU や TPU を使用するノードプールを作成し、クラスタに DRA ドライバをインストールすることが含まれます。このドキュメントは、特殊なハードウェア デバイスを使用してインフラストラクチャを構築する際の複雑さやオーバーヘッドを軽減したいプラットフォーム管理者向けです。

制限事項

  • ノードの自動プロビジョニングはサポートされていません。
  • Autopilot クラスタは DRA をサポートしていません。
  • DRA では、GPU ドライバの自動インストールはサポートされていません。
  • 次の GPU 共有機能は使用できません。
    • 時間共有 GPU
    • マルチインスタンス GPU
    • マルチプロセス Service(MPS)
  • TPU を使用する場合は、DRA の API で v1beta1v1beta2 のバージョンを有効にする必要があります。この制限は GPU には適用されず、GPU は v1 API バージョンを使用できます。

要件

DRA を使用するには、GKE クラスタのバージョンが 1.34 以降である必要があります。

また、使用するハードウェアのタイプに応じて、次の要件と制限事項にも注意してください。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
  • GKE Standard クラスタを、バージョン 1.34 以降で用意します。リージョン クラスタを作成することもできます。

  • Cloud Shell を使用していない場合は、Helm CLI をインストールします。

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    
  • TPU で DRA を使用するには、DRA API の v1beta1v1beta2 のバージョンを有効にします。

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices,resource.k8s.io/v1beta2/deviceclasses,resource.k8s.io/v1beta2/resourceclaims,resource.k8s.io/v1beta2/resourceclaimtemplates,resource.k8s.io/v1beta2/resourceslices"
    

GPU または TPU を使用して GKE ノードプールを作成する

GKE では、GPU と TPU の両方で DRA を使用できます。マシンタイプ、アクセラレータのタイプ、ノード数、ノードのオペレーティング システム、ノードのロケーションなどのノードプールの設定は、要件に応じて決定してください。DRA をサポートするノードプールを作成するには、次のいずれかのオプションを選択します。

GPU

GPU に DRA を使用するには、ノードプールの作成時に次の操作を行う必要があります。

  • ノードプールの GPU を構成するときに、--accelerator フラグで gpu-driver-version=disabled オプションを指定して、GPU ドライバの自動インストールを無効にします。
  • gke-no-default-nvidia-gpu-device-plugin=true ノードラベルを追加して、GPU デバイス プラグインを無効にします。
  • nvidia.com/gpu.present=true ノードラベルを追加して、DRA ドライバ DaemonSet がそのノード上で実行できるようにします。

DRA 用の GPU ノードプールを作成する手順は次のとおりです。

  1. 必要なハードウェアを使用してノードプールを作成します。次の例では、2 つの L4 GPU を搭載する Container-Optimized OS に g2-standard-24 インスタンスが配置されたノードプールを作成します。

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type "g2-standard-24" \
        --accelerator "type=nvidia-l4,count=2,gpu-driver-version=disabled" \
        --num-nodes "1" \
        --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
    

    次のように置き換えます。

    • NODEPOOL_NAME: ノードプールの名前
    • CLUSTER_NAME: クラスタの名前。
    • CONTROL_PLANE_LOCATION: クラスタ コントロール プレーンのリージョンまたはゾーン(例: us-central1us-central1-a)。
  2. Container-Optimized OS ノードまたは Ubuntu ノードにドライバを手動でインストールします。詳細な手順については、NVIDIA GPU ドライバを手動でインストールするをご覧ください。

TPU

TPU で DRA を使用するには、gke-no-default-tpu-device-plugin=true ノードラベルを追加して TPU デバイス プラグインを無効にする必要があります。次の例では、DRA をサポートする TPU Trillium ノードプールを作成します。

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --location=CONTROL_PLANE_LOCATION \
    --node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
    --machine-type=ct6e-standard-8t

次のように置き換えます。

  • NODEPOOL_NAME: ノードプールの名前
  • CLUSTER_NAME: クラスタの名前。
  • CONTROL_PLANE_LOCATION: クラスタ コントロール プレーンのリージョンまたはゾーン(例: us-central1us-central1-a)。

DRA ドライバをインストールする

GPU

  1. NVIDIA DRA ドライバを含む Helm チャートを pull して更新します。

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. バージョン 25.3.2 の NVIDIA DRA ドライバをインストールします。

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --version="25.3.2" --create-namespace --namespace=nvidia-dra-driver-gpu \
        --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
        --set gpuResourcesEnabledOverride=true \
        --set resources.computeDomains.enabled=false \
        --set kubeletPlugin.priorityClassName="" \
        --set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \
        --set kubeletPlugin.tolerations[0].operator=Exists \
        --set kubeletPlugin.tolerations[0].effect=NoSchedule
    

    Ubuntu ノードの場合は、nvidiaDriverRoot="/opt/nvidia" ディレクトリ パスを使用します。

TPU

  1. ai-on-gke リポジトリのクローンを作成して、GPU と TPU 用の DRA ドライバを含む Helm チャートにアクセスします。

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. そのチャートを含むディレクトリに移動します。

    cd common-infra/common/charts
    
  3. TPU DRA ドライバをインストールします。

    ./tpu-dra-driver/install-tpu-dra-driver.sh
    

インフラストラクチャが DRA に対応していることを確認する

  1. DRA ドライバ Pod が実行されていることを確認するには、次のいずれかのオプションを選択します。

    GPU

    kubectl get pods -n nvidia-dra-driver-gpu
    

    出力は次のようになります。

    NAME                                         READY   STATUS    RESTARTS   AGE
    nvidia-dra-driver-gpu-kubelet-plugin-52cdm   1/1     Running   0          46s
    

    TPU

    kubectl get pods -n tpu-dra-driver
    
    

    出力は次のようになります。

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. 追加したハードウェア デバイスが ResourceSlice に一覧表示されていることを確認します。

    kubectl get resourceslices -o yaml
    

    前のセクションの例を使用した場合、GPU または TPU を構成したかどうかに応じて、出力は次のようになります。

    GPU

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1
      kind: ResourceSlice
      metadata:
      # Multiple lines are omitted here.
      spec:
        devices:
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 0
            minor:
              int: 0
            pcieBusID:
              string: "0000:00:03.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-ccc19e5e-e3cd-f911-65c8-89bcef084e3f
          capacity:
            memory:
              value: 23034Mi
          name: gpu-0
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 1
            minor:
              int: 1
            pcieBusID:
              string: "0000:00:04.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-f783198d-42f9-7cef-9ea1-bb10578df978
          capacity:
            memory:
              value: 23034Mi
          name: gpu-1
        driver: gpu.nvidia.com
        nodeName: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
        pool:
          generation: 1
          name: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

    TPU

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1beta1
      kind: ResourceSlice
      metadata:
        # lines omitted for clarity
      spec:
        devices:
        - basic:
            attributes:
              index:
                int: 0
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "0"
        - basic:
            attributes:
              index:
                int: 1
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "1"
        - basic:
            attributes:
              index:
                int: 2
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "2"
        - basic:
            attributes:
              index:
                int: 3
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "3"
        driver: tpu.google.com
        nodeName: gke-tpu-b4d4b61b-fwbg
        pool:
          generation: 1
          name: gke-tpu-b4d4b61b-fwbg
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

次のステップ