このドキュメントでは、Google Kubernetes Engine(GKE)のインフラストラクチャで動的リソース割り当て(DRA)を使用できるようにするための設定方法について説明します。設定手順には、GPU や TPU を使用するノードプールを作成し、クラスタに DRA ドライバをインストールすることが含まれます。このドキュメントは、特殊なハードウェア デバイスを使用してインフラストラクチャを構築する際の複雑さやオーバーヘッドを軽減したいプラットフォーム管理者向けです。
制限事項
- ノードの自動プロビジョニングはサポートされていません。
- Autopilot クラスタは DRA をサポートしていません。
- DRA では、GPU ドライバの自動インストールはサポートされていません。
- 次の GPU 共有機能は使用できません。
- 時間共有 GPU
- マルチインスタンス GPU
- マルチプロセス Service(MPS)
- TPU を使用する場合は、DRA の API で
v1beta1とv1beta2のバージョンを有効にする必要があります。この制限は GPU には適用されず、GPU はv1API バージョンを使用できます。
要件
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.shTPU で DRA を使用するには、DRA API の
v1beta1とv1beta2のバージョンを有効にします。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 ノードプールを作成する手順は次のとおりです。
必要なハードウェアを使用してノードプールを作成します。次の例では、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-central1、us-central1-a)。
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-central1、us-central1-a)。
DRA ドライバをインストールする
GPU
NVIDIA DRA ドライバを含む Helm チャートを pull して更新します。
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo updateバージョン
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=NoScheduleUbuntu ノードの場合は、
nvidiaDriverRoot="/opt/nvidia"ディレクトリ パスを使用します。
TPU
ai-on-gkeリポジトリのクローンを作成して、GPU と TPU 用の DRA ドライバを含む Helm チャートにアクセスします。git clone https://github.com/ai-on-gke/common-infra.gitそのチャートを含むディレクトリに移動します。
cd common-infra/common/chartsTPU DRA ドライバをインストールします。
./tpu-dra-driver/install-tpu-dra-driver.sh
インフラストラクチャが DRA に対応していることを確認する
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 46sTPU
kubectl get pods -n tpu-dra-driver出力は次のようになります。
NAME READY STATUS RESTARTS AGE tpu-dra-driver-kubeletplugin-h6m57 1/1 Running 0 30s追加したハードウェア デバイスが
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: ""