Creación de nodos autoadministrados con bloques de capacidad para ML - Amazon EKS

Creación de nodos autoadministrados con bloques de capacidad para ML

Los bloques de capacidad para machine learning (ML) permiten reservar instancias de GPU en una fecha futura para respaldar cargas de trabajo de ML de corta duración. Para obtener más información, consulte Bloques de capacidad para ML en la Guía del usuario de Amazon EC2 para instancias de Linux.

Consideraciones

importante
  • Los bloques de capacidad solo están disponibles para determinados tipos de instancias de Amazon EC2 y regiones de AWS. Para obtener información sobre compatibilidad, consulte los requisitos previos para trabajar con bloques de capacidad en la Guía del usuario de Amazon EC2 para instancias de Linux.

  • Actualmente, los bloques de capacidad no se pueden usar con Karpenter.

  • Si crea el grupo de nodos autoadministrados antes de que se active la reserva de capacidad, defina la capacidad deseada como 0.

  • Para que los nodos dispongan de tiempo suficiente para vaciarse correctamente, le sugerimos que programe el escalado para que llegue a cero más de 30 minutos antes de la hora de finalización de la reserva del bloque de capacidad.

  • Para agotar los Pods correctamente, se recomienda configurar AWS Node Termination Handler, tal como se explica en los pasos de ejemplo.

Uso de bloques de capacidad con nodos autoadministrados

Puede utilizar bloques de capacidad con Amazon EKS para aprovisionar y escalar nodos autoadministrados. En los siguientes pasos se ofrece un ejemplo general. Los ejemplos de plantillas de AWS CloudFormation no cubren todos los aspectos necesarios en una carga de trabajo de producción. Por lo general, también querrá un script de arranque para unir el nodo al clúster, especificar la AMI acelerada de Amazon EKS y un perfil de instancia adecuado para unirse al clúster. Para obtener más información, consulte Creación de nodos autoadministrados de Amazon Linux.

  1. Cree una plantilla de lanzamiento que se adapte a su carga de trabajo. Para obtener más información, consulte Use Capacity Blocks for machine learning workloads en la Guía del usuario de Amazon EC2 Auto Scaling.

    Asegúrese de que LaunchTemplateData incluya lo siguiente:

    • InstanceMarketOptions con "capacity-block" establecido en MarketType

    • CapacityReservationSpecification: CapacityReservationTarget con CapacityReservationId establecido en el bloque de capacidad (por ejemplo: cr-02168da1478b509e0 )

    • IamInstanceProfile con Arn establecido en el iam-instance-profile-arn aplicable

    • ImageId establecido en el image-id aplicable

    • InstanceType establecido en un tipo de instancia que admita bloques de capacidad (por ejemplo: p5.48xlarge)

    • SecurityGroupIds establecido en los ID aplicables (por ejemplo:sg-05b1d815d1EXAMPLE)

    • UserData establecido en los user-data aplicables a su grupo de nodos autoadministrado

      A continuación se muestra un extracto de una plantilla de CloudFormation que crea una plantilla de lanzamiento dirigida a un bloque de capacidad.

      NodeLaunchTemplate: Type: "aws::EC2::LaunchTemplate" Properties: LaunchTemplateData: InstanceMarketOptions: MarketType: "capacity-block" CapacityReservationSpecification: CapacityReservationTarget: CapacityReservationId: "cr-02168da1478b509e0" IamInstanceProfile: Arn: iam-instance-profile-arn ImageId: image-id InstanceType: p5.48xlarge KeyName: key-name SecurityGroupIds: - sg-05b1d815d1EXAMPLE UserData: user-data

      Debe pasar la subred de la zona de disponibilidad en la que se realiza la reserva, ya que los bloques de capacidad son zonales.

  2. Utilice la plantilla de lanzamiento para crear un grupo de nodos autoadministrado. Si lo hace antes de que se active la reserva de capacidad, ajuste la capacidad deseada a 0. Al crear el grupo de nodos, asegúrese de especificar únicamente la subred correspondiente a la zona de disponibilidad en la que se va a reservar la capacidad.

    A continuación se muestra un ejemplo de plantilla de CloudFormation a la que puede hacer referencia al crear una que se aplique a su carga de trabajo. En este ejemplo se obtienen LaunchTemplateId y Version del recurso AWS::Amazon EC2::LaunchTemplate que se muestra en el paso anterior. También se obtienen los valores de DesiredCapacity, MaxSize, MinSize y VPCZoneIdentifier que se declaran en otras partes de la misma plantilla.

    NodeGroup: Type: "AWS::AutoScaling::AutoScalingGroup" Properties: DesiredCapacity: !Ref NodeAutoScalingGroupDesiredCapacity LaunchTemplate: LaunchTemplateId: !Ref NodeLaunchTemplate Version: !GetAtt NodeLaunchTemplate.LatestVersionNumber MaxSize: !Ref NodeAutoScalingGroupMaxSize MinSize: !Ref NodeAutoScalingGroupMinSize VPCZoneIdentifier: !Ref Subnets Tags: - Key: Name PropagateAtLaunch: true Value: !Sub ${ClusterName}-${NodeGroupName}-Node - Key: !Sub kubernetes.io/cluster/${ClusterName} PropagateAtLaunch: true Value: owned
  3. Una vez que el grupo de nodos se ha creado correctamente, asegúrese de registrar el valor de NodeInstanceRole correspondiente al grupo de nodos que se ha creado. Esto es necesario para asegurarse de que, al escalar el grupo de nodos, los nuevos nodos se unan al clúster y Kubernetes pueda reconocerlos. Para obtener más información, consulte las instrucciones de AWS Management Console en Creación de nodos autoadministrados de Amazon Linux.

  4. Se recomienda crear una política de escalado programado para el grupo de escalado automático que se ajuste a los tiempos de reserva del bloque de capacidad. Para obtener más información, consulte Scheduled scaling for Amazon EC2 Auto Scaling en la Guía del usuario de Amazon EC2 Auto Scaling.

    Puede utilizar todas las instancias que haya reservado hasta 30 minutos antes de la hora de finalización del bloque de capacidad. Las instancias que aún estén en ejecución en ese momento comenzarán a finalizar. Para que los nodos dispongan de tiempo suficiente para vaciarse correctamente, le sugerimos que programe el escalado para que llegue a cero más de 30 minutos antes de la hora de finalización de la reserva del bloque de capacidad.

    Si en lugar de esto desea escalar verticalmente cada vez que el estado de la reserva de capacidad sea Active, debe actualizar la capacidad deseada para el grupo de escalado automático a la hora de inicio de la reserva del bloque de capacidad. En ese caso, también tendría que reducir verticalmente y manualmente más de 30 minutos antes de la hora de finalización de la reserva del bloque de capacidad.

  5. El grupo de nodos ya está listo para la programación de cargas de trabajo y Pods.

  6. Para vaciar los Pods correctamente, se recomienda configurar AWS Node Termination Handler. Este controlador podrá observar eventos del ciclo de vida de “reducción horizontal de grupos de escalado automático” de Amazon EC2 Auto Scaling mediante EventBridge y permitir que el plano de control de Kubernetes tome las medidas necesarias antes de que la instancia deje de estar disponible. De lo contrario, los objetos de Pods y Kubernetes quedarán bloqueados en estado pendiente. Para obtener más información, consulte AWS Node Termination Handler en GitHub.

    Si no configura un Node Termination Handler, le recomendamos que comience a vaciar los Pods manualmente antes de la ventana de 30 minutos, con el fin de que tengan tiempo suficiente para vaciarse correctamente.