ベアメタル上の Google Distributed Cloud(ソフトウェアのみ)が持つ Bring Your Own Node(自社所有ノードの使用)の性質により、既存の高度なハードウェア(GPU を搭載したマシンなど)を活用してクラスタのパフォーマンスと柔軟性を最大限に高めることができます。
このドキュメントでは、NVIDIA GPU Operator をインストールして使用し、Google Distributed Cloud で作成されたベアメタル クラスタを NVIDIA GPU で使用するように設定する方法について説明します。
NVIDIA GPU Operator は、Operator Framework により、GPU デバイスのプロビジョニングと管理に必要な NVIDIA ソフトウェア コンポーネントを管理します。次のような柔軟性と利点に基づき、NVIDIA GPU Operator の使用をおすすめします。
GPU タイプの選択: Google Distributed Cloud(ソフトウェアのみ)は、最新の NVIDIA GPU Operator でサポートされている幅広い GPU タイプに対応しています。
サポートされているオペレーティング システムの選択: クラスタ ワーカーノードでは、サポートされている任意のオペレーティング システム(OS)から NVIDIA GPU を使用できます。また、プリインストールされた GPU ドライバを使用するか、NVIDIA GPU Operator で動的にドライバをインストールするかを選択できます。
デプロイモデルの選択: ワーカーノードを使用する任意のクラスタタイプ(ユーザー クラスタ、スタンドアロン クラスタ、ハイブリッド クラスタ)で NVIDIA GPU を使用できます。
このページは、基盤となる技術インフラストラクチャのライフサイクルを管理する IT 管理者と運用担当者を対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
始める前に
以降のセクションの手順を実施する前に、確実に次の要件を満たしてください。
動作するクラスタ: Google Distributed Cloud で作成された、機能するベアメタル クラスタを確保します。
NVIDIA GPU: NVIDIA GPU がクラスタ ワーカーノードにインストールされていることを確認します。NVIDIA GPU Operator のインストールに関する次のセクションで、GPU が正しくインストールされており、オペレーティング システムで認識されることを確認します。
適合性のある NVIDIA ドライバ バージョン: 使用する NVIDIA ドライバ バージョンが、GPU、オペレーティング システム、アプリケーションで使用する CUDA バージョンと適合している必要があります。NVIDIA ドライバは次の方法でインストールできます。
次のセクションで説明するように、NVIDIA GPU Operator を使用して、適切なバージョンの NVIDIA GPU ドライバをインストールします。
オペレーティング システム イメージにプリインストールされている NVIDIA ドライバを使用します。
NVIDIA Driver Installation Quickstart Guide の手順に沿って、NVIDIA ドライバを手動でインストールします。
Helm バージョン 3.0.0 以降: パッケージ管理用の Helm コマンドライン インターフェースを管理ワークステーションにインストールします。Helm は NVIDIA GPU Operator のインストールに使用します。次のコマンドによって Helm コマンドライン ツールをダウンロードしてインストールできます。
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
NVIDIA GPU Operator をインストールして確認する
次の手順に沿って、ベアメタル クラスタに NVIDIA GPU Operator をインストールし、NVIDIA GPU Operator が GPU を操作していることを確認します。
Peripheral Component Interconnect express(PCIe)によって接続されている GPU デバイスの場合は、次のコマンドを実行して、名前に「NVIDIA」を含むシステム PCI バスのリストを取得します。
sudo lspci | grep NVIDIA
出力は次のようになります。
25:00.0 3D controller: NVIDIA Corporation Device 20b5 (rev a1)
特定のノードで NVIDIA System Management Interface(
nvidia-smi
)コマンドライン ツールを使用して、GPU デバイスの詳細情報を取得できます。nvidia-smi
出力は次のようになります。
+---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.183.01 Driver Version: 535.183.1 CUDA Veersion 12.2 | |-----------------------------------------+----------------------+----------------------| | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA A100 80GB PCIe Off | 00000000:25:00.0 Off | 0 | | N/A 30C P0 44W / 300W | 0MiB / 81920MiB | 0% Default | | | | Disabled | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | No running processes found | +---------------------------------------------------------------------------------------+
管理ワークステーションに NVIDIA Helm リポジトリを追加します。
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
NVIDIA GPU Operator をインストールします。
NVIDIA GPU Operator をインストールする際は、基本的に次の 3 種類のコマンドを使用します。
デフォルト構成で NVIDIA GPU Operator をインストールします。
helm install --wait --generate-name \ -n gpu-operator --create-namespace \ nvidia/gpu-operator
構成オプションを指定する場合は、
--set
フラグを使用して Key-Value ペアのカンマ区切りリストを渡します。helm install --wait --generate-name \ -n gpu-operator --create-namespace \ nvidia/gpu-operator \ --set OPTION_1_NAME=OPTION_1_VALUE,OPTION_2_NAME=OPTION_2_VALUE
構成オプションの一覧については、NVIDIA のドキュメントで Common Chart Customization Options をご覧ください。
--set
フラグの使用方法については、Helm のドキュメントで The Format and Limitations of--set
をご覧ください。ノードに NVIDIA GPU ドライバがすでにインストールされている場合は、ドライバのインストールを無効にします。
NVIDIA GPU Operator のデフォルトでは、クラスタ内のすべての GPU ワーカーノードに最新の GPU ドライバまたは指定された GPU ドライバがデプロイされます。その際、GPU を搭載したすべてのワーカーノードで、NVIDIA GPU ドライバ コンテナを使用するために同じオペレーティング システム バージョンを実行することが必要になります。この問題を回避するには、ノードに GPU ドライバを手動でインストールした後、
--set driver.enabled=false
を指定してhelm install
コマンドを実行し、NVIDIA GPU Operator がドライバをデプロイしないようにします。helm install --wait --generate-name \ -n gpu-operator --create-namespace \ nvidia/gpu-operator \ --set driver.enabled=false
一般的なデプロイ シナリオとサンプル コマンドについては、NVIDIA のドキュメントで Common Deployment Scenarios をご覧ください。
GPU リソースのエクスポート情報を確認します。
NVIDIA GPU Operator がインストールされ、GPU ドライバとデバイス プラグインが正常に実行されていれば、ノードリソースの
Allocatable
フィールドで GPU 数が正しく構成されているはずです。kubectl describe node GPU_NODE_NAME | grep Allocatable -A7
GPU_NODE_NAME
は、GPU を搭載したテスト対象のノードマシンの名前に置き換えます。出力は次のようになります。
Allocatable: cpu: 127130m ephemeral-storage: 858356868519 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 509648288Ki nvidia.com/gpu: 1 pods: 250
GPU が機能していることを確認するため、次のサンプル GPU ジョブを実行します。このジョブによって
nvidia-smi
コマンドが実行されます。export NODE_NAME=GPU_NODE_NAME cat <<EOF | kubectl create --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: batch/v1 kind: Job metadata: name: test-job-gpu spec: template: spec: runtimeClassName: nvidia containers: - name: nvidia-test image: nvidia/cuda:12.0.0-base-ubuntu22.04 command: ["nvidia-smi"] resources: limits: nvidia.com/gpu: 1 nodeSelector: kubernetes.io/hostname: ${NODE_NAME} restartPolicy: Never EOF
CLUSTER_KUBECONFIG
は、管理クラスタの kubeconfig ファイルのパスに置き換えます。ログでサンプルジョブの出力を確認します。
kubectl logs job/test-job-gpu --kubeconfig=CLUSTER_KUBECONFIG
出力は次のようになります。
+---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.183.01 Driver Version: 535.183.1 CUDA Veersion 12.2 | |-----------------------------------------+----------------------+----------------------| | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA A100 80GB PCIe Off | 00000000:25:00.0 Off | 0 | | N/A 30C P0 44W / 300W | 0MiB / 81920MiB | 0% Default | | | | Disabled | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | No running processes found | +---------------------------------------------------------------------------------------+
制限事項
Google Distributed Cloud で作成されたクラスタで NVIDIA GPU Operator を使用する場合は、次の制限が適用されます。
最近のバージョンの NVIDIA GPU Operator をインストールした場合、NVIDIA GPU Operator によって適用された containerd の構成は、クラスタやノードプールの更新またはアップグレード中に上書きされる可能性があります。
サポートされているバージョンの Google Distributed Cloud では、containerd LTS リリース 1.6 がインストールされます。このリリースでは Container Device Interface(CDI)が有効になりません。NVIDIA ドキュメントの Support for Container Device Interface の手順に沿って操作すると、
nvidia-cdi
ランタイムが機能しない可能性があります。クラスタは引き続き想定どおりに動作しますが、一部の CDI 機能が使用できない場合があります。ロードバランサのノードプールで、7 日ごとに更新ジョブが自動的に実行されます。このジョブにより、containerd の構成(NVIDIA GPU Operator によって追加されたものを含む)が上書きされます。
ベスト プラクティス
NVIDIA 構成の競合と問題を最小限に抑えるため、次の対策をおすすめします。
クラスタやノードプールをアップグレードまたは更新する前に、containerd の構成ファイル
/etc/containerd/config.toml
をバックアップします。このファイルには、nvidia
ランタイム構成が含まれています。アップグレードまたは更新が正常に完了したらconfig.toml
ファイルを復元し、containerd を再起動して構成の変更を有効にします。containerd の構成の競合や問題を防ぐため、GPU ノードをロードバランサ ノード(
loadBalancer.nodePoolSpec
)としては使用しないでください。
サポートを利用する
Google Distributed Cloud での GPU の使用についてさらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。
オペレーティング システムでの GPU ハードウェアの設定や使用に関する問題については、ハードウェア ベンダーにお問い合わせいただくか、該当する場合は NVIDIA サポートに直接お問い合わせください。
皆様のフィードバックをお待ちしております。