Configuración de particiones de GPU en Amazon SageMaker HyperPod - Amazon SageMaker AI

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Configuración de particiones de GPU en Amazon SageMaker HyperPod

Requisitos previos

  • HyperPod Clúster de Amazon EKS con instancias de GPU compatibles

  • NVIDIA GPU Operator instalado

  • Permisos de IAM adecuados para la administración de clústeres

Creación de un clúster con configuración MIG

Usando AWS CLI

aws sagemaker create-cluster \ --cluster-name my-mig-cluster \ --orchestrator 'Eks={ClusterArn=arn:aws:eks:region:account:cluster/cluster-name}' \ --instance-groups '{ "InstanceGroupName": "gpu-group", "InstanceType": "ml.p4d.24xlarge", "InstanceCount": 1, "LifeCycleConfig": { "SourceS3Uri": "s3://my-bucket", "OnCreate": "on_create_script.sh" }, "KubernetesConfig": { "Labels": { "nvidia.com/mig.config": "all-1g.5gb" } }, "ExecutionRole": "arn:aws:iam::account:role/execution-role", "ThreadsPerCore": 1 }' \ --vpc-config '{ "SecurityGroupIds": ["sg-12345"], "Subnets": ["subnet-12345"] }' \ --node-provisioning-mode Continuous

Usando CloudFormation

{ "ClusterName": "my-mig-cluster", "InstanceGroups": [ { "InstanceGroupName": "gpu-group", "InstanceType": "ml.p4d.24xlarge", "InstanceCount": 1, "KubernetesConfig": { "Labels": { "nvidia.com/mig.config": "all-2g.10gb" } }, "ExecutionRole": "arn:aws:iam::account:role/execution-role" } ], "Orchestrator": { "Eks": { "ClusterArn": "arn:aws:eks:region:account:cluster/cluster-name" } }, "NodeProvisioningMode": "Continuous" }

Añadir un operador de GPU a un clúster existente

Instale GPU Operator

{$AWS_REGION}Sustitúyala por la región de tu clúster (p. ej., us-east-1, us-west-2).

helm install gpuo helm_chart/HyperPodHelmChart/charts/gpu-operator \ -f helm_chart/HyperPodHelmChart/charts/gpu-operator/regional-values/values-{$AWS_REGION}.yaml \ -n kube-system

Verifica la instalación (espera de 2 a 3 minutos)

Compruebe que todos los módulos de operador de GPU estén funcionando:

kubectl get pods -n kube-system | grep -E "(gpu-operator|nvidia-)"

Cápsulas esperadas:

  • gpu-operator-*: 1 instancia (controlador de clúster)

  • nvidia-device-plugin-daemonset-* - 1 por nodo de GPU (todas las instancias de GPU)

  • nvidia-mig-manager-* - 1 por nodo compatible con MiG (A100/H100)

Eliminar el complemento de dispositivo antiguo

Deshabilita el existente nvidia-device-plugin:

helm upgrade dependencies helm_chart/HyperPodHelmChart \ --set nvidia-device-plugin.devicePlugin.enabled=false \ -n kube-system

Verifica los recursos de la GPU

Confirme que los nodos muestren la capacidad de la GPU. Debería mostrar: nvidia.com/gpu: 8 (o el número real de GPU).

kubectl describe nodes | grep "nvidia.com/gpu"

Actualización de la configuración de MIG

Preparación de los nodos antes de las actualizaciones de MIG

Antes de actualizar las configuraciones de MIG en tu grupo de instancias, debes preparar los nodos para evitar la interrupción de la carga de trabajo. Sigue estos pasos para drenar de forma segura las cargas de trabajo de los nodos que se van a reconfigurar.

Paso 1: Identifique los nodos del grupo de instancias

Primero, identifica todos los nodos que pertenecen al grupo de instancias que deseas actualizar:

# List all nodes in the instance group kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=INSTANCE_GROUP_NAME # Example: kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=p4d-group

Este comando devuelve una lista de todos los nodos del grupo de instancias especificado. Anota el nombre de cada nodo para los siguientes pasos.

Paso 2: acordonar y drenar cada nodo

Para cada nodo identificado en el paso 1, lleve a cabo las siguientes acciones:

Acordona el nodo

El acordonamiento evita que se programen nuevos módulos en el nodo:

# Cordon a single node kubectl cordon NODE_NAME # Example: kubectl cordon hyperpod-i-014a41a7001adca60

Vacíe los módulos de carga de trabajo del nodo

Vacíe el nodo para expulsar todos los módulos de carga de trabajo y, al mismo tiempo, preservar los módulos del sistema:

# Drain the node (ignore DaemonSets and evict pods) kubectl drain NODE_NAME \ --ignore-daemonsets \ --delete-emptydir-data \ --force \ --grace-period=300 # Example: kubectl drain hyperpod-i-014a41a7001adca60 \ --ignore-daemonsets \ --delete-emptydir-data \ --force \ --grace-period=300

Explicación de las opciones de comando:

  • --ignore-daemonsets- Permite continuar con la operación de drenaje incluso si hay DaemonSet cápsulas

  • --delete-emptydir-data- Elimina los pods utilizando volúmenes EmptyDir (necesarios para que el drenaje se realice correctamente)

  • --force- Obliga a eliminar los pods no gestionados por un controlador (utilízalos con precaución)

  • --grace-period=300- Da a las cápsulas 5 minutos para que terminen sin problemas

importante
  • La operación de drenaje puede tardar varios minutos en función del número de cápsulas y de sus períodos de gracia de cierre

  • Los pods del sistema de los siguientes espacios de nombres seguirán ejecutándose: kube-systemcert-manager,kubeflow,hyperpod-inference-system,kube-public,mpi-operator,,gpu-operator,aws-hyperpod, jupyter-k8s-systemhyperpod-observability, y kueue-system keda

  • DaemonSet los pods permanecerán en el nodo (se ignoran por diseño)

Paso 3: Compruebe que no se esté ejecutando ningún pod de carga de trabajo

Tras el vaciado, compruebe que no quede ningún módulo de carga de trabajo en los nodos (excepto los espacios de nombres del sistema):

# Check for any remaining pods outside system namespaces kubectl get pods --all-namespaces --field-selector spec.nodeName=NODE_NAME \ | grep -v "kube-system" \ | grep -v "cert-manager" \ | grep -v "kubeflow" \ | grep -v "hyperpod-inference-system" \ | grep -v "kube-public" \ | grep -v "mpi-operator" \ | grep -v "gpu-operator" \ | grep -v "aws-hyperpod" \ | grep -v "jupyter-k8s-system" \ | grep -v "hyperpod-observability" \ | grep -v "kueue-system" \ | grep -v "keda" # Example: kubectl get pods --all-namespaces --field-selector spec.nodeName=hyperpod-i-014a41a7001adca60 \ | grep -v "kube-system" \ | grep -v "cert-manager" \ | grep -v "kubeflow" \ | grep -v "hyperpod-inference-system" \ | grep -v "kube-public" \ | grep -v "mpi-operator" \ | grep -v "gpu-operator" \ | grep -v "aws-hyperpod" \ | grep -v "jupyter-k8s-system" \ | grep -v "hyperpod-observability" \ | grep -v "kueue-system" \ | grep -v "keda"

Resultado esperado: si el nodo está drenado correctamente, este comando no debería arrojar ningún resultado (o solo mostrar la fila del encabezado). Si algún pod sigue ejecutándose, investiga por qué no se ha desalojado y elimínalo manualmente si es necesario.

Paso 4: Verificar el estado de preparación del nodo

Antes de continuar con la actualización del MIG, confirme que todos los nodos estén acordonados:

# Check node status - should show "SchedulingDisabled" kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=INSTANCE_GROUP_NAME

Los nodos deberían aparecer SchedulingDisabled en la columna STATUS, lo que indica que están acordonados y listos para la actualización del MIG.

Actualice el perfil MIG en el clúster existente

Puede cambiar los perfiles MIG en los clústeres existentes:

aws sagemaker update-cluster \ --cluster-name my-mig-cluster \ --instance-groups '{ "InstanceGroupName": "gpu-group", "InstanceType": "ml.p4d.24xlarge", "InstanceCount": 1, "KubernetesConfig": { "Labels": { "nvidia.com/mig.config": "all-3g.20gb" } }, "ExecutionRole": "arn:aws:iam::account:role/execution-role" }'
nota

Si los trabajos ya se están ejecutando en un nodo, la partición MIG fallará. El usuario recibirá un mensaje de error para drenar los nodos antes de volver a intentar la partición MIG.

Verificación de la configuración MIG

Tras la creación o actualización del clúster, compruebe la configuración MIG:

# Update kubeconfig aws eks update-kubeconfig --name your-eks-cluster --region us-east-2 # Check MIG labels kubectl get node NODE_NAME -o=jsonpath='{.metadata.labels}' | grep mig # Check available MIG resources kubectl describe node NODE_NAME | grep -A 10 "Allocatable:"

Comandos comunes para depurar la configuración MIG

Use los siguientes comandos para solucionar problemas y validar la configuración de MIG en su clúster:

# Check GPU Operator status kubectl get pods -n gpu-operator-resources # View MIG configuration kubectl exec -n gpu-operator-resources nvidia-driver-XXXXX -- nvidia-smi mig -lgi # Check device plugin configuration kubectl logs -n gpu-operator-resources nvidia-device-plugin-XXXXX # Monitor node events kubectl get events --field-selector involvedObject.name=NODE_NAME
nota

Sustituya nvidia-driver-XXXXX y nvidia-device-plugin-XXXXX por los nombres reales de los pods del clúster y NODE_NAME por el nombre del nodo.

Uso de SageMaker AI Console

Creación de un nuevo clúster con MIG

  1. Vaya a Amazon SageMaker AI > HyperPod Clústeres > Administración de clústeres > Crear HyperPod clúster

  2. Seleccione Orchestrated by EKS

  3. Elija la configuración personalizada y compruebe que GPU Operator esté activado de forma predeterminada

  4. En la sección Grupos de instancias, haz clic en Añadir grupo

  5. Configura el grupo de instancias y ve a Configuración avanzada para activar la opción Usar partición de GPU y elige la configuración MIG que desees en el menú desplegable

  6. Haz clic en Añadir grupo de instancias y completa el resto de la configuración del clúster

  7. Haga clic en Enviar para crear el clúster

Actualización de la configuración MIG en el clúster existente

  1. Vaya a Amazon SageMaker AI > HyperPod Clústeres > Administración de clústeres

  2. Selecciona tu clúster existente y haz clic en Editar en el grupo de instancias que deseas modificar

  3. En Configuración avanzada, activa la opción Usar partición de GPU si aún no está habilitada y selecciona una configuración MIG diferente en el menú desplegable

  4. Haz clic en Guardar cambios