Google Kubernetes Engine(GKE)で NVIDIA GPU Operator を使用して GPU スタックを管理する


このページでは、NVIDIA GPU Operator を使用するタイミングと、GKE で NVIDIA GPU Operator を有効にする方法について説明します。

概要

Operator は、アプリケーションとそのコンポーネントを管理するカスタム リソースを作成できる Kubernetes ソフトウェア拡張機能です。Operator を使用すると、Kubernetes 自体が提供する機能を超えた複雑なタスク(アプリケーションのデプロイやアップグレードなど)を自動化できます。

NVIDIA GPU Operator は、Kubernetes クラスタに NVIDIA GPU をプロビジョニングするためのソフトウェア コンポーネントをデプロイ、構成、管理する共通のインフラストラクチャと API を提供する Kubernetes Operator です。NVIDIA GPU Operator は一貫したエクスペリエンスを提供し、GPU リソースの管理を簡素化します。また、GPU アクセラレーテッド ワークロードを Kubernetes に統合するプロセスを効率化します。

NVIDIA GPU Operator を使用する理由

GKE は GPU ノードのライフサイクルを完全に管理するため、GPU ノードには GKE GPU 管理を使用することをおすすめします。GKE を使用して GPU ノードを管理するには、次のいずれかのオプションを選択します。

複数のクラウド サービス プロバイダ間で一貫したエクスペリエンスを実現したい場合、すでに NVIDIA GPU Operator を使用している場合、または NVIDIA GPU Operator に依存するソフトウェアを使用している場合は、NVIDIA GPU Operator が適切なオプションです。

これらのオプションの選択時に考慮すべき点については、GKE または GKE の NVIDIA GPU Operator で GPU スタックを管理するをご覧ください。

制限事項

NVIDIA GPU Operator は、Container-Optimized OS(COS)と Ubuntu の両方のノードイメージでサポートされていますが、次の制限があります。

  • NVIDIA GPU Operator は、GPU Operator バージョン 24.6.0 以降が GKE でサポートされています。
  • NVIDIA GPU Operator は Autopilot クラスタではサポートされていません。
  • NVIDIA GPU Operator は Windows ノードイメージではサポートされていません。
  • NVIDIA GPU Operator は GKE によって管理されません。NVIDIA GPU Operator をアップグレードするには、NVIDIA のドキュメントをご覧ください。

始める前に

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

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。
  • Standard ノードプールで GPU を実行するの要件を満たしていることを確認する。
  • 開発環境に Helm がインストールされていることを確認する。Helm は Cloud Shell に事前にインストールされています。

    特定の Helm バージョンの要件はありません。次のコマンドを使用すると、Helm がインストールされていることを確認できます。

    helm version
    

    出力が Command helm not found のようになる場合は、次のコマンドを実行して Helm CLI をインストールできます。

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 \
      && chmod 700 get_helm.sh \
      && ./get_helm.sh
    

GPU ノードプールを作成して設定する

GPU ノードプールを作成して設定する手順は次のとおりです。

  1. GPU ノードプールを作成するの手順に沿って、次の変更を行い、GPU ノードプールを作成します。

    • GPU ドライバの自動インストールをスキップするように gpu-driver-version=disabled を設定します。NVIDIA GPU Operator を使用する場合は、この機能はサポートされていません。
    • --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" を設定して、GKE 管理の GPU デバイス プラグインの DaemonSet を無効にします。

    次のコマンドを実行し、必要に応じて GPU ノードプールを作成するための他のフラグを追加します。

    gcloud container node-pools create POOL_NAME \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=disabled \
      --node-labels="gke-no-default-nvidia-gpu-device-plugin=true"
    

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

    • POOL_NAME: ノードプールに付ける名前。
    • GPU_TYPE: 使用する GPU アクセラレータのタイプ。例: nvidia-h100-80gb
    • AMOUNT: ノードプール内のノードに接続する GPU の数。

    たとえば、次のコマンドは、ゾーンクラスタ a3-cluster に H100 GPU を使用する GKE ノードプール a3nodepool を作成します。この例では、GKE GPU デバイス プラグイン DaemonSet とドライバの自動インストールが無効になっています。

    gcloud container node-pools create a3nodepool \
      --region=us-central1 --cluster=a3-cluster \
      --node-locations=us-central1-a \
      --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=disabled \
      --machine-type=a3-highgpu-8g \
      --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" \
      --num-nodes=1
    
  2. 次のコマンドを実行して、クラスタの認証情報を取得します。

    USE_GKE_GCLOUD_AUTH_PLUGIN=True \
    gcloud container clusters get-credentials CLUSTER_NAME [--zone COMPUTE_ZONE] [--region COMPUTE_REGION]
    

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

    • CLUSTER_NAME: ノードプールを含むクラスタの名前。
    • COMPUTE_REGION または COMPUTE_ZONE: クラスタがリージョン クラスタかゾーンクラスタかに基づいて、クラスタのリージョンまたはゾーンを指定します。

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

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    
  3. (省略可)クラスタに接続できることを確認します。

    kubectl get nodes -o wide
    

    このクラスタで実行されているすべてのノードのリストが表示されます。

  4. 次のコマンドを実行して、NVIDIA GPU Operator の gpu-operator Namespace を作成します。

    kubectl create ns gpu-operator
    

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

    namespace/gpu-operator created
    
  5. 次のコマンドを実行して、gpu-operator Namespace にリソース割り当てを作成します。

    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
    

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

    resourcequota/gpu-operator-quota created
    
  6. gpu-operator Namespace のリソース割り当てを表示します。

    kubectl get -n gpu-operator resourcequota gpu-operator-quota
    

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

    NAME                 AGE     REQUEST       LIMIT
    gpu-operator-quota   2m27s   pods: 0/100
    
  7. 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 ノード バージョンによって異なります。

  8. 次のコマンドを実行して、GPU ドライバのバージョンを確認します。

    kubectl logs -l k8s-app=nvidia-driver-installer  \
      -c "nvidia-driver-installer" --tail=-1 -n kube-system
    

    GPU ドライバのインストールが成功すると、出力は次のようになります。

    I0716 03:17:38.863927    6293 cache.go:66] DRIVER_VERSION=535.183.01
    …
    I0716 03:17:38.863955    6293 installer.go:58] Verifying GPU driver installation
    I0716 03:17:41.534387    6293 install.go:543] Finished installing the drivers.
    

NVIDIA GPU Operator をインストールする

このセクションでは、Helm を使用して NVIDIA GPU Operator をインストールする方法について説明します。詳細については、NVIDIA のドキュメントで NVIDIA GPU Operator のインストールに関する説明をご覧ください。

  1. NVIDIA Helm リポジトリを追加します。

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
      && helm repo update
    
  2. 次の構成オプションを使用して、Helm を使用して NVIDIA GPU Operator をインストールします。

    • GPU Operator のバージョンが 24.6.0 以降であることを確認します。
    • hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia を使用して、GPU Operator でドライバのインストール パスを構成します。
    • COS と Ubuntu の両方でツールキットのインストール パス toolkit.installDir=/home/kubernetes/bin/nvidia を設定します。COS では、/home ディレクトリは書き込み可能であり、NVIDIA ランタイム バイナリを保存するためのステートフルなロケーションとして機能します。詳細については、COS のディスクとファイル システムの概要をご覧ください。
    • 以前のモードはサポートされていないため、cdi.enabled=truecdi.default=true を使用して GPU Operator で Container Device Interface(CDI)を有効にします。CDI は、GKE の COS と Ubuntu の両方で必要です。
    helm install --wait --generate-name \
      -n gpu-operator \
      nvidia/gpu-operator \
      --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \
      --set toolkit.installDir=/home/kubernetes/bin/nvidia \
      --set cdi.enabled=true \
      --set cdi.default=true \
      --set driver.enabled=false
    

    これらの設定の詳細については、NVIDIA のドキュメントで一般的なチャートのカスタマイズ オプション一般的なデプロイ シナリオをご覧ください。

  3. NVIDIA GPU Operator が正常にインストールされていることを確認します。

    1. GPU Operator のオペランドが正しく実行されていることを確認するには、次のコマンドを実行します。

      kubectl get pods -n gpu-operator
      

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

      NAME                                                          READY    STATUS
      RESTARTS   AGE
      gpu-operator-5c7cf8b4f6-bx4rg                                 1/1      Running   0          11m
      gpu-operator-node-feature-discovery-gc-79d6d968bb-g7gv9       1/1      Running   0          11m
      gpu-operator-node-feature-discovery-master-6d9f8d497c-thhlz   1/1      Running   0          11m
      gpu-operator-node-feature-discovery-worker-wn79l              1/1      Running   0          11m
      gpu-feature-discovery-fs9gw                                   1/1      Running   0          8m14s
      gpu-operator-node-feature-discovery-worker-bdqnv              1/1      Running   0          9m5s
      nvidia-container-toolkit-daemonset-vr8fv                      1/1      Running   0          8m15s
      nvidia-cuda-validator-4nljj                                   0/1      Completed 0          2m24s
      nvidia-dcgm-exporter-4mjvh                                    1/1      Running   0          8m15s
      nvidia-device-plugin-daemonset-jfbcj                          1/1      Running   0          8m15s
      nvidia-mig-manager-kzncr                                      1/1      Running   0          2m5s
      nvidia-operator-validator-fcrr6                               1/1      Running   0          8m15s
      
    2. ノードの Allocable フィールドで GPU 数が正しく構成されていることを確認するには、次のコマンドを実行します。

      kubectl describe node GPU_NODE_NAME | grep Allocatable -A7
      

      GPU_NODE_NAME は、GPU を持つノードの名前に置き換えます。

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

      Allocatable:
      cpu:                11900m
      ephemeral-storage:  47060071478
      hugepages-1Gi:      0
      hugepages-2Mi:      0
      memory:             80403000Ki
      nvidia.com/gpu:     1           # showing correct count of GPU associated with the nods
      pods:               110
      
    3. GPU ワークロードが正しく実行されていることを確認するには、cuda-vectoradd ツールを使用します。

      cat << EOF | kubectl create -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: cuda-vectoradd
      spec:
        restartPolicy: OnFailure
        containers:
        - name: vectoradd
          image: nvidia/samples:vectoradd-cuda11.2.1
          resources:
            limits:
              nvidia.com/gpu: 1
      EOF
      

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

      kubectl logs cuda-vectoradd
      

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

      [Vector addition of 50000 elements]
      Copy input data from the host memory to the CUDA device
      CUDA kernel launch with 196 blocks of 256 threads
      Copy output data from the CUDA device to the host memory
      Test PASSED
      Done
      

次のステップ