このページでは、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 ノードプールを作成して設定する手順は次のとおりです。
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
- GPU ドライバの自動インストールをスキップするように
次のコマンドを実行して、クラスタの認証情報を取得します。
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.
(省略可)クラスタに接続できることを確認します。
kubectl get nodes -o wide
このクラスタで実行されているすべてのノードのリストが表示されます。
次のコマンドを実行して、NVIDIA GPU Operator の
gpu-operator
Namespace を作成します。kubectl create ns gpu-operator
出力は次のようになります。
namespace/gpu-operator created
次のコマンドを実行して、
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
gpu-operator
Namespace のリソース割り当てを表示します。kubectl get -n gpu-operator resourcequota gpu-operator-quota
出力は次のようになります。
NAME AGE REQUEST LIMIT gpu-operator-quota 2m27s pods: 0/100
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 ノード バージョンによって異なります。
次のコマンドを実行して、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 のインストールに関する説明をご覧ください。
NVIDIA Helm リポジトリを追加します。
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
次の構成オプションを使用して、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=true
とcdi.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 のドキュメントで一般的なチャートのカスタマイズ オプションと一般的なデプロイ シナリオをご覧ください。
NVIDIA GPU Operator が正常にインストールされていることを確認します。
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
ノードの 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
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
次のステップ
- Standard ノードプールで GPU を実行する方法を確認する。
- GKE の GPU 共有戦略の詳細を確認する。
- GKE で GPU を使用する LLM 推論ワークロードを自動スケーリングするためのベスト プラクティスを確認する。
- NVIDIA GPU Operator のドキュメントを確認する。