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


このページでは、Google Kubernetes Engine(GKE)のインフラストラクチャを、動的リソース割り当て(DRA)に対応させる方法について説明します。このページでは、GPU または TPU ワークロードをデプロイできるクラスタを作成し、DRA を有効にするために必要なドライバを手動でインストールします。

このページは、専用のハードウェア デバイスを使用してインフラストラクチャを設定する複雑さとオーバーヘッドを軽減したいプラットフォーム管理者の方を対象としています。

DRA について

DRA は Kubernetes の組み込み機能で、クラスタ内のハードウェアを Pod とコンテナ間で柔軟にリクエストして割り当て、共有できます。 詳細については、リソースの動的割り当てについてをご覧ください。

制限事項

  • ノードの自動プロビジョニングはサポートされていません。
  • Autopilot クラスタは DRA をサポートしていません。
  • 次の GPU 共有機能は使用できません。
    • 時間共有 GPU
    • マルチインスタンス GPU
    • マルチプロセス Service(MPS)

要件

DRA を使用するには、GKE バージョンが 1.32.1-gke.1489001 以降である必要があります。

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

始める前に

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

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。
  • 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
    

GKE Standard クラスタを作成する

DRA 用の Kubernetes ベータ版 API を有効にする Standard モードのクラスタを作成します。

gcloud container clusters create CLUSTER_NAME \
    --quiet \
    --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices" \
    --release-channel=rapid \
    --enable-autoupgrade \
    --location CONTROL_PLANE_LOCATION \
    --num-nodes "1" \
    --cluster-version GKE_VERSION \
    --workload-pool="PROJECT_ID.svc.id.goog"

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

  • CLUSTER_NAME: クラスタの名前。
  • CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。
  • GKE_VERSION: クラスタとノードに使用する GKE バージョン。1.32.1-gke.1489001 以降である必要があります。
  • PROJECT_ID: プロジェクト ID。

GKE 環境を DRA に対応できるように準備する

GKE では、GPU と TPU の両方で DRA を使用できます。ノードプールを作成するときは、プレビュー期間中に DRA で動作する次の設定を使用する必要があります。

  • GPU の場合は、GPU ドライバの自動インストールを無効にする。
  • ノードに必要なアクセス スコープを追加する。
  • DRA ワークロードのみを実行するように、ノードにラベルを追加する。
  • クラスタ自動スケーリングを有効にする。

マシンタイプ、アクセラレータの種類、ノード数、ノードのオペレーティング システム、ノードのロケーションなど、他のすべてのノードプールの設定は、要件に応じて決定してください。

GPU を使うために環境を準備する

  1. 必要なハードウェアを使用してノードプールを作成します。

    gcloud beta container node-pools create "gpu-pool" \
        --quiet \
        --project PROJECT_ID \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --node-version KUBERNETES_VERSION \
        --machine-type "n1-standard-8" \
        --accelerator "type=nvidia-tesla-t4,count=2,gpu-driver-version=disabled" \
        --image-type "UBUNTU_CONTAINERD" \
        --disk-type "pd-standard" \
        --disk-size "100" \
        --scopes "https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \
        --num-nodes "1" \
        --enable-autoscaling \
        --min-nodes "1" \
        --max-nodes "6" \
        --location-policy "ANY" \
        --max-surge-upgrade 1 \
        --max-unavailable-upgrade 0 \
        --node-locations ZONE \
        --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
    

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

    • CLUSTER_NAME: クラスタの名前。
    • CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。選択したロケーションが、指定した GPU を使用できるリージョンに属していることを確認します。
    • ZONE: 指定した GPU が使用可能なゾーン。
  2. Container-Optimized OS ノードまたは Ubuntu ノードにドライバを手動でインストールします。詳細な手順については、NVIDIA GPU ドライバを手動でインストールするをご覧ください。

    • COS を使用している場合は、次のコマンドを実行して、インストール用の DaemonSet をデプロイし、デフォルトの GPU ドライバのバージョンをインストールします。

      kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
      
    • Ubuntu を使用している場合、デプロイするインストール DaemonSet は、手順の Ubuntu セクションで説明されているように、GPU タイプと GKE ノード バージョンによって異なります。

  3. GPU オペレーターを含む Helm チャートを pull して更新します。

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  4. GPU オペレータの Namespace を作成します。

    kubectl create namespace gpu-operator
    
  5. gpu-operator Namespace に ResourceQuota を作成します。ResourceQuota を使用すると、GPU オペレータは Kubernetes システム Pod と同じ優先度の Pod をデプロイできます。

    kubectl apply -n gpu-operator -f - << EOF
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: gpu-operator-quota
    spec:
      hard:
        pods: 100
      scopeSelector:
        matchExpressions:
        - operator: In
          scopeName: PriorityClass
          values:
            - system-node-critical
            - system-cluster-critical
    EOF
    
  6. Helm スクリプトを使用して GPU オペレーターをインストールします。

    helm install --wait --generate-name -n gpu-operator nvidia/gpu-operator \
        --set driver.enabled=false \
        --set operator.repository=ghcr.io/nvidia \
        --set operator.version=6171a52d \
        --set validator.repository=ghcr.io/nvidia/gpu-operator \
        --set validator.version=6171a52d \
        --set toolkit.repository=ghcr.io/nvidia \
        --set toolkit.version=5d9b27f1-ubuntu20.04 \
        --set gfd.repository=ghcr.io/nvidia \
        --set gfd.version=f171c926-ubi9 \
        --set cdi.enabled=true \
        --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \
        --set toolkit.installDir=/home/kubernetes/bin/nvidia
    

TPU を使うために環境を準備する

TPU を使用するノードプールを作成します。次の例では、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 \
    --enable-autoupgrade

次のように置き換えます。 * NODEPOOL_NAME: ノードプールの名前。* CLUSTER_NAME: クラスタの名前。 * CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンが配置されている Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。

DRA ドライバにアクセスしてインストールする

以降のセクションでは、GPU と TPU の DRA ドライバをインストールする方法について説明します。DRA ドライバを使用すると、Kubernetes は接続されたデバイスをワークロードに動的に割り当てることができます。提供されている Helm チャートを使用して、GPU と TPU の DRA ドライバをインストールできます。Helm チャートにアクセスするには、次の操作を行います。

  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
    

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

DRA ドライバを含む Helm チャートにアクセスしたら、次の手順で GPU 用の DRA ドライバをインストールします。

COS

helm upgrade -i --create-namespace --namespace nvidia nvidia-dra-driver-gpu nvidia-dra-driver-gpu/ \
    --set image.repository=ghcr.io/nvidia/k8s-dra-driver-gpu \
    --set image.tag=d1fad7ed-ubi9 \
    --set image.pullPolicy=Always \
    --set controller.priorityClassName="" \
    --set kubeletPlugin.priorityClassName="" \
    --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
    --set nvidiaCtkPath=/home/kubernetes/bin/nvidia/toolkit/nvidia-ctk \
    --set deviceClasses="{gpu}" \
    --set gpuResourcesEnabledOverride=true \
    --set resources.computeDomains.enabled=false \
    --set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \
    --set kubeletPlugin.tolerations[0].operator=Exists \
    --set kubeletPlugin.tolerations[0].effect=NoSchedule \
    --set kubeletPlugin.tolerations[1].key=cloud.google.com/compute-class \
    --set kubeletPlugin.tolerations[1].operator=Exists \
    --set kubeletPlugin.tolerations[1].effect=NoSchedule

Ubuntu

helm upgrade -i --create-namespace --namespace nvidia nvidia-dra-driver-gpu nvidia-dra-driver-gpu/ \
    --set image.repository=ghcr.io/nvidia/k8s-dra-driver-gpu \
    --set image.tag=d1fad7ed-ubi9 \
    --set image.pullPolicy=Always \
    --set controller.priorityClassName="" \
    --set kubeletPlugin.priorityClassName="" \
    --set nvidiaDriverRoot="/opt/nvidia" \
    --set nvidiaCtkPath=/home/kubernetes/bin/nvidia/toolkit/nvidia-ctk \
    --set deviceClasses="{gpu}" \
    --set gpuResourcesEnabledOverride=true \
    --set resources.computeDomains.enabled=false \
    --set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \
    --set kubeletPlugin.tolerations[0].operator=Exists \
    --set kubeletPlugin.tolerations[0].effect=NoSchedule \
    --set kubeletPlugin.tolerations[1].key=cloud.google.com/compute-class \
    --set kubeletPlugin.tolerations[1].operator=Exists \
    --set kubeletPlugin.tolerations[1].effect=NoSchedule

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

ドライバを含む Helm チャートにアクセスしたら、次の手順で TPU ドライバをインストールします。

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

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

追加したハードウェア デバイスが ResourceSlice に一覧表示されていることを確認します。

kubectl get resourceslices -o yaml

前のセクションの例を使用した場合、使用したハードウェアのタイプに応じて、ResourceSlice は次のようになります。

GPU

apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
  kind: ResourceSlice
  metadata:
    # lines omitted for clarity
  spec:
    devices:
    - basic:
        attributes:
          architecture:
            string: Turing
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 7.5.0
          cudaDriverVersion:
            version: 12.2.0
          driverVersion:
            version: 535.230.2
          index:
            int: 0
          minor:
            int: 0
          productName:
            string: Tesla T4
          type:
            string: gpu
          uuid:
            string: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef
        capacity:
          memory:
            value: 15Gi
      name: gpu-0

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: ""

次のステップ