이 문서에서는 동적 리소스 할당 (DRA)을 지원하도록 Google Kubernetes Engine (GKE) 인프라를 설정하는 방법을 설명합니다. 설정 단계에는 GPU 또는 TPU를 사용하는 노드 풀을 만들고 클러스터에 DRA 드라이버를 설치하는 작업이 포함됩니다. 이 문서는 전문 하드웨어 기기를 사용하는 인프라 설정의 복잡성과 오버헤드를 줄이고자 하는 플랫폼 관리자를 대상으로 합니다.
제한사항
- 노드 자동 프로비저닝은 지원되지 않습니다.
- Autopilot 클러스터에서는 DRA를 지원하지 않습니다.
- DRA를 사용하는 경우 GPU 드라이버 자동 설치는 지원되지 않습니다.
- 다음 GPU 공유 기능은 사용할 수 없습니다.
- 시간 공유 GPU
- 멀티 인스턴스 GPU
- 멀티 프로세스 서비스(MPS)
- TPU의 경우 DRA API 종류의
v1beta1및v1beta2버전을 사용 설정해야 합니다. 이 제한은v1API 버전을 사용할 수 있는 GPU에는 적용되지 않습니다.
요구사항
DRA를 사용하려면 GKE 클러스터가 1.34 이상을 실행해야 합니다.
또한 사용하려는 하드웨어 유형에 따라 다음 요구사항과 제한사항을 숙지해야 합니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
버전 1.34 이상을 실행하는 GKE Standard 클러스터가 있어야 합니다. 리전 클러스터를 만들 수도 있습니다.
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에서는 DRA를 GPU와 TPU 모두에서 사용할 수 있습니다. 머신 유형, 가속기 유형, 개수, 노드 운영체제, 노드 위치와 같은 노드 풀 구성 설정은 사용자의 요구사항에 따라 달라집니다. 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 노드 풀을 만들려면 다음 단계를 따르세요.
필요한 하드웨어를 갖춘 노드 풀을 만듭니다. 다음 예시는 L4 GPU 2개가 탑재된 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 차트를 가져와 업데이트합니다.
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=NoSchedule'Ubuntu 노드에서는
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 드라이버 포드가 실행 중인지 확인하려면 다음 옵션 중 하나를 선택하세요.
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: ""