En este documento se explica cómo configurar tu infraestructura de Google Kubernetes Engine (GKE) para admitir la asignación dinámica de recursos (DRA). Entre los pasos de configuración se incluye la creación de grupos de nodos que usen GPUs o TPUs, así como la instalación de controladores de DRA en el clúster. Este documento está dirigido a administradores de plataformas que quieran reducir la complejidad y los costes de configuración de la infraestructura con dispositivos de hardware especializados.
Limitaciones
- No se admite el aprovisionamiento automático de nodos.
- Los clústeres de Autopilot no admiten DRA.
- La instalación automática de controladores de GPU no es compatible con DRA.
- No puedes usar las siguientes funciones para compartir la GPU:
- GPUs de tiempo compartido
- GPUs con varias instancias
- Servicio multiproceso (MPS)
- En el caso de las TPUs, debes habilitar las versiones
v1beta1yv1beta2de los tipos de la API DRA. Esta limitación no se aplica a las GPUs, que pueden usar versiones de la APIv1.
Requisitos
Para usar DRA, tu clúster de GKE debe ejecutar la versión 1.34 o una posterior.
También debes conocer los siguientes requisitos y limitaciones, en función del tipo de hardware que quieras usar:
Antes de empezar
Antes de empezar, asegúrate de que has realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando
gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
Tener un clúster estándar de GKE que ejecute la versión 1.34 o una posterior. También puedes crear un clúster regional.
Si no usas Cloud Shell, instala la CLI de Helm:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.shPara usar la DRA en las TPUs, habilita las versiones
v1beta1yv1beta2de los tipos de API de DRA: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"
Crear un grupo de nodos de GKE con GPUs o TPUs
En GKE, puedes usar DRA con GPUs y TPUs. Los ajustes de configuración del grupo de nodos, como el tipo de máquina, el tipo de acelerador, el recuento, el sistema operativo del nodo y las ubicaciones de los nodos, dependen de tus requisitos. Para crear un grupo de nodos que admita DRA, selecciona una de las siguientes opciones:
GPU
Para usar DRA en GPUs, debes hacer lo siguiente al crear el grupo de nodos:
- Para inhabilitar la instalación automática de controladores de GPU, especifica la opción
gpu-driver-version=disableden la marca--acceleratoral configurar las GPUs de un grupo de nodos. - Inhabilita el complemento de dispositivo de GPU añadiendo la etiqueta de nodo
gke-no-default-nvidia-gpu-device-plugin=true. - Permite que el DaemonSet del controlador de DRA se ejecute en los nodos añadiendo la etiqueta de nodo
nvidia.com/gpu.present=true.
Para crear un grupo de nodos de GPU para DRA, sigue estos pasos:
Crea un grupo de nodos con el hardware necesario. En el siguiente ejemplo se crea un grupo de nodos que tiene una instancia
g2-standard-24en Container-Optimized OS con dos GPUs L4.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=trueHaz los cambios siguientes:
NODEPOOL_NAME: el nombre del grupo de nodos.CLUSTER_NAME: el nombre de tu clúster.CONTROL_PLANE_LOCATION: la región o zona del plano de control del clúster, comous-central1ous-central1-a.
Instala los controladores manualmente en tus nodos de Container-Optimized OS o Ubuntu. Para obtener instrucciones detalladas, consulta el artículo Instalar manualmente los controladores de las GPU NVIDIA.
TPU
Para usar la asignación dinámica de recursos en las TPUs, debes inhabilitar el complemento del dispositivo TPU añadiendo la etiqueta de nodo gke-no-default-tpu-device-plugin=true. En el siguiente ejemplo se crea un grupo de nodos de TPU Trillium con compatibilidad con DRA:
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
Haz los cambios siguientes:
NODEPOOL_NAME: el nombre del grupo de nodos.CLUSTER_NAME: el nombre de tu clúster.CONTROL_PLANE_LOCATION: la región o zona del plano de control del clúster, comous-central1ous-central1-a.
Instalar controladores de DRA
GPU
Extrae y actualiza el gráfico de Helm que contiene el controlador de NVIDIA DRA:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo updateInstala el controlador NVIDIA DRA con la versión
25.3.2: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'En los nodos de Ubuntu, usa la ruta de directorio
nvidiaDriverRoot="/opt/nvidia".
TPU
Clona el repositorio
ai-on-gkepara acceder a los gráficos de Helm que contienen los controladores de DRA para GPUs y TPUs:git clone https://github.com/ai-on-gke/common-infra.gitVe al directorio que contiene los gráficos:
cd common-infra/common/chartsInstala el controlador DRA de TPU:
./tpu-dra-driver/install-tpu-dra-driver.sh
Verificar que tu infraestructura está preparada para la DRA
Para verificar que los pods de tu controlador de réplica de datos se están ejecutando, selecciona una de las siguientes opciones:
GPU
kubectl get pods -n nvidia-dra-driver-gpuEl resultado debería ser similar al siguiente:
NAME READY STATUS RESTARTS AGE nvidia-dra-driver-gpu-kubelet-plugin-52cdm 1/1 Running 0 46sTPU
kubectl get pods -n tpu-dra-driverEl resultado debería ser similar al siguiente:
NAME READY STATUS RESTARTS AGE tpu-dra-driver-kubeletplugin-h6m57 1/1 Running 0 30sConfirma que en
ResourceSlicese muestran los dispositivos de hardware que has añadido:kubectl get resourceslices -o yamlSi has usado el ejemplo de la sección anterior, el resultado será similar al siguiente, en función de si has configurado GPUs o TPUs:
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: ""