La asignación dinámica de recursos es una API de Kubernetes que te permite solicitar y compartir recursos, como GPU, entre Pods y contenedores en tus clústeres de Google Distributed Cloud en equipos físicos. Los controladores de terceros administran estos dispositivos, y Kubernetes los asigna de forma dinámica, de manera similar a los volúmenes de almacenamiento. Tus cargas de trabajo de IA no necesitan orientarse a nodos específicos ni solicitar la cantidad exacta de dispositivos conectados. En este documento, se muestra cómo configurar tus cargas de trabajo de GPU para usar la asignación dinámica de recursos.
Antes de comenzar
Antes de configurar tus cargas de trabajo de GPU para usar la asignación dinámica de recursos, verifica que se cumplan los siguientes requisitos previos:
- Tu clúster de Bare Metal debe tener la versión 1.33.0 o una posterior.
- Tu sistema operativo es Ubuntu 22.04 o Red Hat Enterprise Linux (RHEL) 9.4.
- Actualizaste el clúster para habilitar la asignación dinámica de recursos, como se describe en Habilita la asignación dinámica de recursos.
- Tienes al menos una máquina de nodo con una GPU conectada y el controlador de GPU de NVIDIA instalado. Para obtener más información, consulta Instala o desinstala el operador de GPU de NVIDIA incluido.
- Si usas el operador de GPU de NVIDIA incluido, la versión 1.33.0 o posterior habilita la interfaz de dispositivo de contenedor (CDI) de forma predeterminada.
Si usas un operador de GPU instalado de forma manual, asegúrate de que la CDI esté habilitada
en el
ClusterPolicy. - Seguiste las instrucciones de Controlador de DRA de NVIDIA para GPUs para instalar el controlador de DRA de NVIDIA en todos los nodos conectados a la GPU.
Crea cargas de trabajo de GPU que usen la asignación dinámica de recursos
Para que tus cargas de trabajo de GPU aprovechen la asignación dinámica de recursos para solicitar GPUs, deben
estar en un espacio de nombres compartido con un ResourceClaim que describa la solicitud de
asignación de dispositivos de GPU. Tus cargas de trabajo deben hacer referencia a la ResourceClaim para
que Kubernetes asigne recursos de GPU.
En los siguientes pasos, se configura un entorno en el que tus cargas de trabajo usan la asignación dinámica de recursos para solicitar recursos de GPU:
Para crear recursos relacionados con la asignación dinámica de recursos, crea un nuevo
Namespaceen tu clúster:cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Namespace metadata: name: NAMESPACE_NAME EOFReemplaza lo siguiente:
CLUSTER_KUBECONFIG: Es la ruta de acceso al archivo kubeconfig del clúster de usuario.NAMESPACE_NAMEpor el nombre del espacio de nombres de asignación dinámica de recursos.
Crea un
ResourceClaimpara describir la solicitud de acceso a la GPU:cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: resource.k8s.io/v1beta1 kind: ResourceClaim metadata: namespace: NAMESPACE_NAME name: RESOURCE_CLAIM_NAME spec: devices: requests: - name: gpu deviceClassName: gpu.nvidia.com EOFReemplaza
RESOURCE_CLAIM_NAMEpor el nombre de tu reclamación de recursos para las solicitudes de GPU.Crea cargas de trabajo que hagan referencia al
ResourceClaimcreado en el paso anterior.En los siguientes ejemplos de cargas de trabajo, se muestra cómo hacer referencia a un
ResourceClaimllamadogpu-claimen el espacio de nombresdra-test. Los contenedores del Podpod1son muestras de la arquitectura unificada de dispositivos de procesamiento (CUDA) de NVIDIA diseñadas para ejecutar cargas de trabajo de CUDA en las GPU. Cuando el Podpod1se completa correctamente, indica que la capacidad de asignación dinámica de recursos funciona de forma correcta y que la asignación dinámica de recursos está lista para administrar los recursos de GPU en tu clúster.Ubuntu
Usa el siguiente comando para aplicar el manifiesto a tu clúster:
cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Pod metadata: name: pod1 namespace: dra-test spec: restartPolicy: OnFailure resourceClaims: - name: gpu resourceClaimName: gpu-claim containers: - name: ctr0 image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0 resources: claims: - name: gpu - name: ctr1 image: nvcr.io/nvidia/k8s/cuda-sample:devicequery resources: claims: - name: gpu EOF
RHEL
Usa el siguiente comando para aplicar el manifiesto a tu clúster:
cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Pod metadata: name: pod1 namespace: dra-test spec: restartPolicy: OnFailure resourceClaims: - name: gpu resourceClaimName: gpu-claim containers: - name: ctr0 image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0 resources: claims: - name: gpu - name: ctr1 image: nvcr.io/nvidia/k8s/cuda-sample:devicequery resources: claims: - name: gpu EOF
Limitaciones
Ten en cuenta las siguientes limitaciones cuando uses la asignación dinámica de recursos:
Cuando usas el SO RHEL con una versión compatible del operador de GPU de NVIDIA, la interfaz de dispositivo de contenedor (CDI) controla la inserción de dispositivos y el etiquetado de SELinux automáticamente. No es necesario que uses la configuración manual de la política de SELinux ni que establezcas el
securityContextdel Pod.Esta función usa el grupo de APIs
resource.k8s.io/v1beta1, que difiere del grupo de APIs de Kubernetes de código abierto para esta función,resource.k8s.io/v1. El grupo de APIs de código abiertov1proporciona más funciones y una mejor estabilidad que el grupo de APIsv1beta1.
¿Qué sigue?
- Consulta la documentación de Kubernetes para obtener más información sobre la asignación dinámica de recursos.
- Obtén información para entregar LLM de terceros en equipos completos.