View a markdown version of this page

Gerenciar recursos computacionais para workloads de IA/ML no Amazon EKS com grupos de nós - Amazon EKS

Ajudar a melhorar esta página

Para contribuir com este guia de usuário, escolha o link Editar esta página no GitHub, disponível no painel direito de cada página.

Gerenciar recursos computacionais para workloads de IA/ML no Amazon EKS com grupos de nós

dica

Registre-se para os próximos workshops do Amazon EKS AI/ML.

Esta seção aborda como gerenciar a computação acelerada (AWS Trainium, GPUs da NVIDIA) para workloads de treinamento e inferência de IA usando nós autogerenciados ou grupos de nós gerenciados pelo Amazon EKS.

Os grupos de nós gerenciados pelo EKS e os nós autogerenciados usam grupos do Auto Scaling (ASG) do EC2. Os grupos de nós gerenciados pelo EKS têm APIs dedicadas do EKS para criar, atualizar e excluir nós, e também têm a funcionalidade de reparo de nós e hooks de encerramento do ciclo de vida integrados. Os nós autogerenciados do EKS são implantados e gerenciados diretamente por meio de APIs do EC2.

Com essas opções, você define antecipadamente o tipo de instância, a contagem desejada, os limites de escalabilidade e o modelo de inicialização do EC2. Considere usar grupos de nós gerenciados pelo EKS ou nós autogerenciados se você também tiver workloads não EKS e preferir a consistência da configuração por meio de modelos de inicialização do EC2. Os grupos de nós do EKS são adequados para workloads de treinamento e ajuste fino em que a capacidade de computação acelerada é conhecida com antecedência. Observe que tanto o Modo Automático do EKS quanto o Karpenter também são compatíveis com o provisionamento de capacidade estática; consulte Gerenciar a computação para workloads de IA/ML com o Modo Automático do EKS e o Karpenter para obter mais informações.

Os nós autogerenciados e os grupos de nós gerenciados pelo EKS são compatíveis com todas as opções de compra de computação acelerada (sob demanda, spot, reservas de capacidade sob demanda, Blocos de Capacidade para ML). Você cria um grupo de nós gerenciados ou autogerenciados separado por tipo de capacidade, cada um com seu próprio modelo de inicialização, tipos de instância e configuração de escalabilidade. Isso proporciona um controle explícito, apoiado pelo ASG, sobre cada grupo de capacidade sem uma lógica heterogênea de provisionamento dinâmico.

Grupos de nós gerenciados pelo EKS vs nós autogerenciados

A escolha entre grupos de nós gerenciados pelo EKS e nós autogerenciados depende do nível de personalização e controle de que você precisa. Os grupos de nós gerenciados pelo EKS permitem a personalização de um subconjunto de modelos de inicialização do EC2, enquanto os nós autogerenciados são compatíveis com toda a extensão de modelos de inicialização do EC2. Se você não tiver um motivo específico para personalizar e gerenciar o ciclo de vida do nó por conta própria, comece com os grupos de nós gerenciados pelo EKS e passe para os nós autogerenciados somente quando um requisito específico exigir.

Use grupos de nós gerenciados quando: você quiser que o EKS gerencie a seleção de AMIs, a inicialização de nós, as atualizações contínuas, o reparo de nós e os fluxos de trabalho de drenagem suave em seu nome. Os grupos de nós gerenciados pelo EKS são o ponto de partida recomendado se você não preferir usar o Modo Automático do EKS ou o Karpenter para workloads de treinamento e inferência. Ao usar os Blocos de Capacidade para ML, os grupos de nós gerenciados pelo EKS criam automaticamente uma política de escalabilidade programada que drena o grupo de nós 40 minutos antes do término da reserva, eliminando a necessidade de usar o AWS Node Termination Handler ou sua própria automação de redução vertical da escala. Use grupos de nós gerenciados pelo EKS quando estiver usando uma AMI compatível otimizada para EKS, quando não precisar de personalizações no nível do kernel ou personalizações profundas do modelo de inicialização do EC2, e quando quiser um caminho de atualização de nós mais simples para as versões do Kubernetes.

Use grupos de nós autogerenciados quando: você precisar de controle total sobre o modelo de inicialização do EC2, as AMIs, os parâmetros do kernel, a configuração do runtime do contêiner ou os scripts de inicialização personalizados. Os cenários comuns de ML incluem o ajuste das configurações do kernel e da NIC para treinamento distribuído com o Elastic Fabric Adapter (EFA) ou a integração com um controlador de ciclo de vida de nós personalizado. Os nós autogerenciados oferecem a flexibilidade de disponibilizar todos os dados do usuário e o perfil de instância do IAM de que você precisa, mas você assume a responsabilidade por atualizações, políticas de escalabilidade programada e ganchos do ciclo de vida, como o AWS Node Termination Handler.

Reservar GPUs com Blocos de Capacidade para ML

Os Blocos de Capacidade para machine learning (ML) permitem que você reserve instâncias de GPU para uma data futura, a fim de executar workloads de treinamento ou inferência por tempo limitado. Para obter mais informações, consulte Blocos de Capacidade para ML no Guia do usuário do Amazon EC2.

Você pode usar as reservas do Bloco de Capacidade por meio dos grupos de nós gerenciados pelo EKS e dos nós autogerenciados. A configuração do modelo de inicialização do EC2 é a mesma nos dois casos. O fluxo de trabalho de criação de nós, o comportamento de redução vertical da escala e os ganchos do ciclo de vida para o encerramento das workloads diferem entre as opções de provisionamento.

Considerações

  • Os blocos de capacidade estão disponíveis apenas para determinados tipos de instância do Amazon EC2 e para regiões da AWS. Consulte Pré-requisitos para trabalhar com Blocos de Capacidade para obter mais informações.

  • Os Blocos de Capacidade são zonais. Durante a criação do grupo de nós, você deve usar a sub-rede na mesma zona de disponibilidade (AZ) da reserva do Bloco de Capacidade.

  • Se você criar um grupo de nós antes que a reserva do Bloco de Capacidade se torne ativa, defina a capacidade desejada como 0 durante a criação do grupo de nós.

  • Para dar tempo para uma drenagem suave da workload, programe a redução para zero mais de 30 minutos antes do término da reserva do Bloco de Capacidade. O Amazon EC2 começa a encerrar as instâncias 30 minutos antes do término da reserva.

Criar grupos de nós com Blocos de Capacidade para ML

Os nós autogerenciados e os grupos de nós gerenciados pelo EKS exigem o uso de um modelo de inicialização personalizado do EC2 direcionado à reserva do Bloco de Capacidade. A seguir, são mostrados os campos mínimos obrigatórios para nós autogerenciados e grupos de nós gerenciados pelo EKS. Campos adicionais são necessários para nós autogerenciados, conforme mostrado nas etapas de nós autogerenciados abaixo.

O LaunchTemplateData deve incluir:

  • InstanceMarketOptions com MarketType definido como "capacity-block"

  • CapacityReservationSpecification: CapacityReservationTarget com CapacityReservationId definido como o ID do Bloco de Capacidade. Por exemplo, cr-0123456789abcdef0.

  • InstanceType definido como o tipo de instância da sua reserva do Bloco de Capacidade. Por exemplo, p5.48xlarge.

Esses requisitos são mostrados nos exemplos abaixo para criar o modelo de inicialização para nós autogerenciados e grupos de nós gerenciados pelo EKS.

Managed node groups
  1. Crie um arquivo denominado eks-capacity-block-lt.json com os conteúdos a seguir.

    Substitua o conteúdo de CapacityReservationId e InstanceType pelos valores do seu Bloco de Capacidade. Para obter mais informações sobre os campos adicionais do modelo de inicialização do EC2, consulte Personalizar nós gerenciados com modelos de execução e Usar Blocos de Capacidade para workloads de machine learning.

    { "LaunchTemplateData": { "InstanceMarketOptions": { "MarketType": "capacity-block" }, "CapacityReservationSpecification": { "CapacityReservationTarget": { "CapacityReservationId": "cr-0123456789abcdef0" } }, "InstanceType": "p5.48xlarge" } }
  2. Criar o modelo de execução.

    aws ec2 create-launch-template \ --launch-template-name EKS-Capacity-Block-Launch-Template \ --launch-template-data file://eks-capacity-block-lt.json
  3. Use o modelo de inicialização para criar um grupo de nós gerenciados pelo EKS. Substitua os espaços reservados no comando abaixo pelos valores aplicáveis ao seu ambiente. O comando abaixo define --ami-type para as AMIs NVIDIA AL2023 otimizadas para EKS. Consulte Uso de AMIs aceleradas e otimizadas para o EKS em instâncias de GPU para obter mais informações sobre as AMIs disponíveis otimizadas para EKS. Caso esteja usando uma AMI personalizada com grupos de nós gerenciados pelo EKS, especifique o ID da AMI no modelo de inicialização.

    Ao criar um grupo de nós gerenciados pelo EKS que usa Blocos de Capacidade, faça o seguinte:

    • Defina --capacity-type como "CAPACITY_BLOCK".

    • Especifique somente a sub-rede na mesma zona de disponibilidade da reserva de capacidade.

    • Se você especificar um valor de desiredSize diferente de zero antes que a reserva esteja ativa, o grupo do Auto Scaling indicará erros de inicialização até que a reserva se torne ativa. Uma vez ativas, as instâncias são iniciadas e o ASG aumenta a escala verticalmente de acordo com o desiredSize requisitado.

      aws eks create-nodegroup \ --cluster-name my-eks-cluster \ --nodegroup-name eks-cb-nodes \ --node-role "arn:aws:iam::111122223333:role/myNodeRole" \ --region region-code \ --subnets subnet-ExampleID1 \ --ami-type "AL2023_x86_64_NVIDIA" \ --scaling-config minSize=0,maxSize=2,desiredSize=0 \ --capacity-type "CAPACITY_BLOCK" \ --launch-template name="EKS-Capacity-Block-Launch-Template"
  4. Caso defina desiredSize como 0 no momento da criação, aumente a escala verticalmente do grupo de nós quando a reserva ficar ativa usando um dos seguintes métodos:

    • Uma política de escalabilidade programada no ASG alinhada ao horário de início da reserva. Para obter mais informações, consulte Escalabilidade agendada para o Amazon EC2 Auto Scaling no Manual do usuário do Amazon EC2 Auto Scaling.

    • O console do Amazon EKS ou aws eks update-nodegroup-config para atualizar a configuração de escalabilidade.

  5. Verifique se os nós ingressam no cluster após o aumento vertical da escala.

  6. O EKS cria automaticamente uma política de escalabilidade programada denominada Amazon EKS Node Group Capacity Scaledown Before Reservation End para reduzir a escala verticalmente do grupo de nós até 0 40 minutos antes do término da reserva. Isso dá tempo para que os pods sejam drenados de forma suave antes que o EC2 comece a encerrar as instâncias na marca de 30 minutos. Não edite nem exclua essa ação programada.

Self-managed nodes
  1. Crie um arquivo denominado eks-capacity-block-lt.json com os conteúdos a seguir.

    Substitua o conteúdo de CapacityReservationId e InstanceType pelos valores do seu Bloco de Capacidade. Para obter mais informações sobre os campos adicionais do modelo de inicialização do EC2, consulte Personalizar nós gerenciados com modelos de execução e Usar Blocos de Capacidade para workloads de machine learning.

    Substitua o conteúdo de IamInstanceProfile, ImageId, SecurityGroupIds, UserData, KeyName pelos valores do seu ambiente.

    { "LaunchTemplateData": { "InstanceMarketOptions": { "MarketType": "capacity-block" }, "CapacityReservationSpecification": { "CapacityReservationTarget": { "CapacityReservationId": "cr-0123456789abcdef0" } }, "IamInstanceProfile": { "Arn": "arn:aws:iam::111122223333:role/myNodeRole" }, "ImageId": "image-id", "InstanceType": "p5.48xlarge", "KeyName": "key-name", "SecurityGroupIds": "sg-05b1d815d1EXAMPLE" ], "UserData": "user-data" } }
  2. Criar o modelo de execução.

    aws ec2 create-launch-template \ --launch-template-name EKS-Capacity-Block-Launch-Template \ --launch-template-data file://eks-capacity-block-lt.json
  3. Use o modelo de inicialização para criar o grupo do Auto Scaling seguindo as etapas em Criar nós autogerenciados do Amazon Linux. Se a reserva ainda não estiver ativa, defina DesiredCapacity como 0. Somente especifique a sub-rede na zona de disponibilidade em que a capacidade está reservada.

  4. Depois que seus nós autogerenciados forem criados com DesiredCapacity definido como 0, crie uma política de escalabilidade programada no grupo do Auto Scaling alinhada aos horários de reserva do Bloco de Capacidade. Para obter mais informações, consulte Escalabilidade programada do Amazon EC2 Auto Scaling.

    É possível usar as instâncias reservadas até 30 minutos antes da hora de término da reserva. Programe a escala até zero mais de 30 minutos antes do horário de término para que os pods tenham tempo de drenar.

    Se você preferir escalar manualmente, atualize a capacidade desejada do ASG no horário de início da reserva e novamente mais de 30 minutos antes do horário de término.

  5. Para drenar os pods de forma suave, configure o AWS Node Termination Handler. Ele monitora os eventos do ciclo de vida da redução horizontal da escala do ASG do Amazon EC2 Auto Scaling usando o EventBridge e permite que o ambiente de gerenciamento do Kubernetes execute as ações antes que a instância fique indisponível. Sem ele, os pods e objetos do Kubernetes podem ficar travados em um estado pendente. Para obter mais informações, consulte Manipulador do término do nó da AWS no GitHub.

    Se você não configurar o Node Termination Handler, drene os pods manualmente antes da janela de 30 minutos para que haja tempo suficiente para uma drenagem suave.