Realiza el mantenimiento del host para los nodos que ejecutan cargas de trabajo de entrenamiento y de inferencia

En este documento, se explica cómo realizar el mantenimiento del host de las instancias subyacentes de Compute Engine para los nodos en los clústeres de Google Kubernetes Engine (GKE). Solo debes administrar activamente este mantenimiento para ciertos tipos de instancias de Compute Engine que no se migran en vivo, incluidas las instancias con GPUs y TPUs. Las estrategias que se describen en este documento funcionan bien para las cargas de trabajo de entrenamiento y de inferencia. Si solo necesitas realizar el mantenimiento del host de forma manual para un nodo individual o si tus cargas de trabajo pueden tolerar el mantenimiento automático del host, consulta Información sobre cómo realizar el mantenimiento del host en GKE.

Estas estrategias realizan el mantenimiento del host para grupos de nodos y, de manera opcional, inician las actualizaciones del clúster de GKE.

Usa la estrategia paralela para los nodos de cargas de trabajo en los que puedes tener un solo período de inactividad, como los nodos de cargas de trabajo de entrenamiento. Usa la estrategia de actualización continua para los nodos de cargas de trabajo en los que puedes tener lotes de tiempo de inactividad y, al mismo tiempo, mantener la disponibilidad de la mayoría de los recursos, como los nodos de cargas de trabajo de inferencia.

Usa una estrategia paralela para actualizar los nodos de las cargas de trabajo de entrenamiento

Esta estrategia realiza cambios de forma simultánea para un grupo de nodos que usan aceleradores. Puedes usar esta estrategia para cargas de trabajo de entrenamiento. También puedes usarlo para otros tipos de cargas de trabajo en las que el método menos disruptivo para realizar cambios es tener un solo período de inactividad completo para todos los nodos del grupo y las cargas de trabajo que se ejecutan en ellos.

La estrategia sigue estos pasos de alto nivel:

  1. Detén las cargas de trabajo: Selecciona los grupos de nodos y detén las cargas de trabajo que se ejecutan en ellos o muévelas a otros nodos que sigan disponibles.
  2. Activa el mantenimiento del host: Aplica la etiqueta de mantenimiento a todos los nodos seleccionados al mismo tiempo y espera a que se complete el proceso en todos los nodos.
  3. Actualiza la versión de GKE: Cambia la versión de GKE de los nodos.
  4. Reinicia las cargas de trabajo: Después de que finalicen todas las actualizaciones y el mantenimiento del host, reinicia tus cargas de trabajo.

Las instrucciones proporcionadas realizan cambios en un solo grupo de nodos. Sin embargo, puedes adaptar los pasos para realizar cambios en varios grupos de nodos al mismo tiempo. Antes de comenzar con estos pasos, asegúrate de tener al menos algunas horas en las que esta carga de trabajo no necesite ejecutarse en estos nodos.

Para minimizar las interrupciones mientras se reciben cambios críticos tanto para las instancias subyacentes de Compute Engine como para los nodos de GKE, usa este período de inactividad para realizar el mantenimiento del host y las actualizaciones de la versión de GKE. Sin embargo, puedes realizar solo el mantenimiento del host si no deseas actualizar la versión de tus nodos de GKE.

Consideraciones antes de comenzar

Antes de comenzar, revisa las siguientes consideraciones:

  • Evita volver a implementar cargas de trabajo: Para evitar demoras innecesarias debido a los PodDisruptionBudgets, no vuelvas a implementar ninguna carga de trabajo hasta que hayas completado todos los pasos.
  • Planifica las interrupciones: Asegúrate de que tus cargas de trabajo se puedan interrumpir durante un período. Estos pasos tardan varias horas en completarse, principalmente debido al tiempo que requiere el mantenimiento del host.

Realiza actualizaciones para todos los nodos de forma simultánea

Para realizar el mantenimiento del host y, de manera opcional, actualizar la versión de GKE, completa los siguientes pasos:

  1. Prepara tus cargas de trabajo: Detén tus cargas de trabajo o asegúrate de que hayan tomado una instantánea o un punto de control recientes.
  2. Iniciar mantenimiento del host: Aplica la etiqueta de mantenimiento a todos los nodos del grupo de nodos seleccionado:

    kubectl label nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME cloud.google.com/perform-maintenance=true --overwrite
    

    Compute Engine comienza a agotar y actualizar las instancias subyacentes de forma simultánea. Este proceso puede tardar algunas horas. Para obtener más información, consulta Proceso de finalización correcta.

  3. Supervisa el estado del mantenimiento del host: GKE quita la etiqueta de mantenimiento cuando se completa el mantenimiento. Cuando finalice el mantenimiento, podrás encontrar un registro con el siguiente mensaje en Cloud Logging:

    Maintenance window has completed for this instance. All maintenance
    notifications on the instance have been removed.
    
  4. Opcional: Actualiza la versión de los nodos de GKE: Sigue las instrucciones para actualizar la versión de GKE de los nodos.

Usa una estrategia progresiva para actualizar los nodos de las cargas de trabajo de inferencia

En esta estrategia, se describe un enfoque manual para realizar el mantenimiento en los nodos de GKE que ejecutan cargas de trabajo de inferencia. Implica actualizar nodos en lotes para mantener la disponibilidad del servicio. Este método es más adecuado para las cargas de trabajo que pueden tolerar un cierto porcentaje de réplicas sin conexión temporalmente.

La estrategia sigue estos pasos de alto nivel:

  1. Identifica y agrupa nodos: Elige los grupos de nodos que deseas actualizar. Agrupa los nodos en lotes cuyo tamaño se ajuste a la tolerancia a fallas de tu carga de trabajo.
  2. Itera por lotes: Para cada lote, aplica la etiqueta de mantenimiento y supervisa el lote de nodos hasta que se quite la etiqueta.
  3. Actualiza la versión de GKE: Después de que todos los lotes completen el mantenimiento del host, cambia la versión de los nodos de GKE.

Consideraciones antes de comenzar

Antes de comenzar, revisa las siguientes consideraciones:

  • Comprende tu implementación: El éxito requiere un conocimiento detallado de la distribución de tu carga de trabajo, la ubicación de las réplicas y los dominios de falla. Asegúrate de mantener la capacidad de procesamiento suficiente durante todo el proceso.
  • Planifica los tamaños de los lotes: Actualiza los nodos en lotes. El tamaño de cada lote se determina según la tolerancia a fallas de tu carga de trabajo. Entre los factores que se deben tener en cuenta, se incluyen los siguientes:
    • Es la cantidad de réplicas por modelo de servicio.
    • Es la distribución de réplicas en nodos y dominios con fallas.
    • PodDisruptionBudgets puede ayudar a aplicar la cantidad máxima de Pods que se encuentran inactivos de forma simultánea.
    • Recomendación: Para simplificar la administración, considera dedicar diferentes grupos de nodos a diferentes conjuntos de réplicas, lo que te permite aislar los dominios de fallas a nivel del grupo de nodos.
  • Calcula las restricciones de tiempo: Ten en cuenta los siguientes factores de tiempo:
    • Cada lote puede tardar varias horas en completar el paso de mantenimiento del host.
    • Calcula el tamaño mínimo del lote para asegurarte de que todo el mantenimiento finalice dentro de los plazos requeridos:
      1. MAINTENANCE_BLOCKS = floor(HOURS_TO_MAINTENANCE / 4) (donde HOURS_TO_MAINTENANCE es el tiempo total disponible).
      2. MIN_PER_BATCH = TOTAL_NODE_COUNT / MAINTENANCE_BLOCKS
    • El tamaño del lote que elijas debe ser igual o mayor que MIN_PER_BATCH.
  • Revisa tipos de cargas de trabajo específicos: Ten en cuenta lo siguiente para los tipos de configuración respectivos:
    • Mezcla de expertos (MoE): asegúrate de que tu estrategia de procesamiento por lotes mantenga la cantidad mínima requerida de réplicas para cada modelo.
    • Publicación desagregada: Asegúrate de hacer un seguimiento de todas las réplicas involucradas en la configuración desagregada cuando planifiques lotes.
    • Grupos de nodos de varios hosts (TPU, MNNVL): Para estas configuraciones, es probable que desactives un grupo de nodos completo a la vez. Planifica tus dominios de falla en varios grupos de nodos según corresponda.

Realiza actualizaciones progresivas en lotes

Para realizar actualizaciones continuas, completa los siguientes pasos:

  1. Identifica los nodos para el mantenimiento: Identifica todos los nodos en los que deseas realizar el mantenimiento y guarda esta lista. Para identificar los nodos, usa cualquiera de los siguientes métodos o selecciónalos de forma manual:

    • Obtén todos los nodos del clúster que usan aceleradores (TPU o GPU):

      kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints[]? | select(.key=="nvidia.com/gpu" or .key=="google.com/tpu")) | .metadata.name'
      
    • Obtén todos los nodos de un grupo de nodos específico:

      kubectl get nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME --no-headers -o custom-columns=":metadata.name"
      

      Reemplaza NODE_POOL_NAME por el nombre del grupo de nodos.

    • Obtén todos los nodos con una etiqueta específica:

      kubectl get nodes -l LABEL -o jsonpath='{.items[*].metadata.name}'
      

      Reemplaza LABEL por la etiqueta del nodo.

  2. Divide nodes into batches: Divide los nodos identificados en lotes iguales. Determina el tamaño del lote con la fórmula que se describe en el elemento de lista Calcula las restricciones de tiempo de la sección anterior Consideraciones antes de comenzar.

  3. Realiza el mantenimiento del host: Para cada lote, completa los siguientes pasos:

    1. Selecciona un lote de nodos y aplica la etiqueta de mantenimiento:

      kubectl label nodes LIST_OF_NODES_IN_BATCH cloud.google.com/perform-maintenance=true --overwrite
      

      Reemplaza LIST_OF_NODES_IN_BATCH por una lista de nodos del lote separados por espacios. Por ejemplo, node-1 node-2 node-3.

    2. Supervisa el estado del mantenimiento del host. GKE quita la etiqueta de mantenimiento cuando finaliza el mantenimiento. Cuando finalice el mantenimiento, podrás encontrar un registro con el siguiente mensaje en Logging:

      Maintenance window has completed for this instance. All maintenance
      notifications on the instance have been removed.
      
    3. Repite los dos pasos anteriores para cada lote restante hasta que hayas completado el mantenimiento del host para todos los lotes.

  4. Opcional: Actualiza la versión de los nodos de GKE: Realiza este paso solo después de que se complete el mantenimiento del host para todos los nodos, para evitar situaciones en las que los nodos de GKE se implementen en hosts que aún no hayan terminado el mantenimiento. Consulta las instrucciones en la siguiente sección.

Actualiza la versión de GKE de los nodos

Considera la cantidad de nodos que deseas actualizar al mismo tiempo. Con la estrategia paralela, realizaste el mantenimiento del host para todo tu grupo de nodos o para varios grupos de nodos al mismo tiempo. Con la estrategia progresiva, realizaste el mantenimiento del host en lotes. Determina qué método de actualización usarás según el tamaño de los grupos de nodos:

  • Estrategia paralela: Si tus grupos de nodos tienen 20 nodos o menos por zona, usa las actualizaciones de aumento. Si tus grupos de nodos tienen más de 20 nodos por zona, borra y vuelve a crear los grupos de nodos.
  • Estrategia de actualización continua: Si tus lotes tienen 20 nodos por zona, por grupo de nodos o menos, usa actualizaciones de aumento. Si tus lotes tienen más de 20 nodos por zona y por grupo de nodos, borra y vuelve a crear los nodos.

Cómo usar las actualizaciones de aumento

  1. Configura las actualizaciones de aumento con el parámetro de configuración maxUnavailable para determinar cuántos nodos pueden no estar disponibles al mismo tiempo, por zona, en un grupo de nodos. Por ejemplo, si tienes 18 nodos en una zona de un grupo de nodos, establece el valor del campo maxUnavailable en 18.

    Este parámetro de configuración funciona mejor cuando se usa la capacidad de una reserva en la que no tienes capacidad excedente. Para obtener más información sobre por qué usar este parámetro de configuración, consulta Actualiza en un entorno con recursos restringidos.

  2. Ejecuta el siguiente comando para actualizar el grupo de nodos. Si deseas actualizar varios grupos de nodos, ejecuta este comando para cada uno de ellos:

    gcloud container clusters upgrade CLUSTER_NAME \
        --node-pool NODE_POOL_NAME \
        --cluster-version VERSION \
        --location CONTROL_PLANE_LOCATION \
        --quiet
    

    Reemplaza lo siguiente:

Borra y vuelve a crear los nodos

Borra el grupo de nodos y vuelve a crearlo con la versión posterior:

  1. Borra el grupo de nodos:

    gcloud container node-pools delete NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION
    
  2. Vuelve a crear el grupo de nodos y pasa la versión nueva con el parámetro --cluster-version. Pasa el destino de actualización automática recomendado para el grupo de nodos. Para obtener más información, consulta Cómo obtener información sobre las actualizaciones de los grupos de nodos de clústeres estándar. Si tu clúster no tiene un destino de actualización automática recomendado, consulta las entradas más recientes de Actualizaciones de versiones en las notas de la versión de GKE.