2 de junho de 202613 min de leitura

Escalando inferência de LLM multi-node com NVIDIA Dynamo-Grove no AKS (Parte 4)

Sachi Desai e Ralph Squillace

Azure

Banner - Escalando inferência de LLM multi-node com NVIDIA Dynamo-Grove no AKS (Parte 4)

TL;DR: Este artigo analisa o NVIDIA Grove, uma API open-source do Kubernetes que abstrai a complexidade do deployment de inferência de LLMs multi-node. Grove organiza papéis (prefill, decode, router) em hierarquias (PodClique, ScalingGroup, PodCliqueSet), permitindo agendamento em grupo (gang scheduling) e escalabilidade controlada por SLO. Para empresas brasileiras, isso reduz o esforço operacional ao rodar modelos grandes no AKS, garantindo que recursos sejam alocados como unidades funcionais completas.


Qual é a lacuna de orquestração do Kubernetes para inferência distribuída?

Cargas de trabalho modernas de inferência de IA são fundamentalmente diferentes das aplicações distribuídas tradicionais baseadas em microsserviços independentes e stateless. Um deployment de LLM em produção pode incluir papéis distintos – serviços de frontend, roteadores cientes de KV-cache, workers de prefill e decode – que são fortemente acoplados em como devem ser agendados, iniciados e escalados. Eles exigem agendamento em grupos, inicialização em uma ordem específica e escalonamento em proporções que preservem um caminho de atendimento de ponta a ponta. Para modelos maiores, uma única instância de prefill ou decode pode abranger vários pods, onde um deployment completo de cada instância é necessário para uma capacidade funcional de serving.

Os primitivos do Kubernetes podem agendar e executar esses componentes de forma independente, mas não entendem nativamente as relações entre componentes necessárias para que o deployment opere como um serviço de inferência:

  • Quais pods formam uma instância de modelo utilizável?
  • Quais papéis devem ser iniciados antes de outros?
  • Quais componentes escalam independentemente e quais devem escalar como um grupo?

Usando primitivos do Kubernetes isoladamente, as equipes de operações são forçadas a distribuir essas considerações entre manifests, labels, scripts ou controladores personalizados. Isso cria desafios de orquestração e piora a observabilidade do deployment.

O LeaderWorkerSet (LWS) é uma API upstream que resolve parte do problema ao gerenciar um pod líder e seus pods workers como uma unidade replicada, o que geralmente mapeia bem para instâncias de modelo multi-node. No entanto, um deployment completo no estilo Dynamo pode conter múltiplas unidades líder-trabalhador em prefill e decode, além de roteamento e outros componentes de serviço. O LWS pode modelar esses grupos líder-trabalhador, mas não é destinado a descrever o serviço de inferência completo entre eles. Além disso, o LWS acopla unidades de escalonamento multi-node a um padrão líder-trabalhador, e nem todos os casos de uso multi-node se mapeiam claramente para isso. No geral, agendamento, inicialização e escalonamento para tais deployments modernos exigem uma abstração de workload do Kubernetes mais flexível.

O que é o NVIDIA Grove e como ele resolve o problema?

NVIDIA Grove é uma API Kubernetes open-source, disponível como um componente modular do NVIDIA Dynamo, para definir workloads de IA simples (single-node) e complexas (multi-node). Enquanto os recursos padrão do Kubernetes descrevem pods e serviços individuais, o Grove permite descrever todo o sistema de inferência e seus requisitos de orquestração como um único objeto: roteamento, prefill, decode, grupos líder-trabalhador/unidades multi-node, dependências de inicialização e limites de escalonamento – tudo expresso em uma especificação de workload.

A partir dessa especificação, o Grove assume a responsabilidade de coordenar os recursos Kubernetes necessários para executar o serviço. Agendamento, inicialização e escalonamento têm uma visão compartilhada da carga de trabalho: quais pods formam uma instância utilizável e quais papéis pertencem ao mesmo grupo. Ações de escalonamento podem mirar um único papel, uma instância completa de modelo multi-node ou uma réplica completa do serviço. Dependências de inicialização entre papéis fazem parte da definição da carga de trabalho, não de scripts externos.

O resultado é uma API de workload que corresponde a como os sistemas de inferência distribuída são realmente construídos: papéis individuais com diferentes perfis de recursos, instâncias de modelo agrupadas que devem escalar juntas e réplicas completas de serviço que representam capacidade de atendimento utilizável de ponta a ponta.

Em um deployment de inferência, o Dynamo fornece o stack de serving: workers de inferência, roteamento, o Planner, gerenciamento de KV-cache e integrações de backend como vLLM, TensorRT-LLM e SGLang. O Grove define a camada de orquestração do Kubernetes ao redor desse stack, ou seja, o contrato entre o sistema de inferência e o cluster. O Grove também pode ser implantado de forma independente ou integrado a outros frameworks de inferência de alto desempenho.

Como o Grove modela a carga de trabalho?

O modelo do Grove é construído em torno de três primitivos hierárquicos que juntos descrevem a forma completa de um deployment de inferência, desde papéis individuais até o serviço completo:

Primitivo Grove O que representa Exemplo em inferência de modelo
PodClique Um grupo de pods com o mesmo papel e template de pod. Possui sua própria contagem de réplicas, necessidades de recursos e política de escalonamento opcional. Pods de router, workers de prefill, workers de decode, pods de frontend
PodCliqueScalingGroup Um grupo de objetos PodClique que devem escalar juntos enquanto preservam as proporções dos papéis. Uma instância de prefill multi-node com um líder e quatro workers
PodCliqueSet O objeto de workload de nível superior que descreve o sistema de inferência completo. Router + grupo de prefill + grupo de decode, com ordem de inicialização e política de escalonamento

Usando essa hierarquia, o Grove gera os recursos Kubernetes de nível inferior que o cluster precisa para agendar, iniciar e escalar a carga de trabalho. Os usuários trabalham no nível do deployment de inferência, enquanto o Grove traduz a intenção em pods gerenciados pelo Grove e outros recursos, incluindo os recursos PodGang voltados para o scheduler que codificam as restrições de agendamento.

Como o Grove coordena agendamento, inicialização e escalabilidade?

Uma vez que o Grove tem a especificação da carga de trabalho, ele usa a mesma hierarquia para guiar como a carga de trabalho é agendada, iniciada e escalada.

Agendamento

Para inferência multi-node, a capacidade de serving chega como uma coleção de instâncias completas. Uma instância de prefill ou decode que abrange vários pods pode servir tráfego apenas quando o conjunto completo puder executar junto. O gang scheduling dá ao Kubernetes um contrato de tudo-ou-nada: ou todos os pods da instância são agendados juntos, ou nenhum. O Grove cria automaticamente os recursos PodGang voltados para o scheduler a partir da especificação da carga de trabalho, de modo que essa garantia seja parte do modelo de workload, não uma regra que as equipes precisam aplicar separadamente.

O gang scheduling garante que cada componente individual do deployment seja alocado como uma unidade completa – por exemplo, uma instância completa de prefill ou uma instância completa de decode. No entanto, isso por si só não garante que o deployment possa realmente atender requisições de ponta a ponta: o scheduler pode alocar várias instâncias completas de prefill sem qualquer capacidade de decode correspondente, ou vice-versa.

O Grove aborda essa limitação com o hierarchical gang scheduling. Em vez de garantir a completude apenas no nível da instância, o Grove também a garante no nível do serviço. A carga de trabalho especifica restrições de viabilidade de nível superior – por exemplo, que pelo menos uma instância completa de prefill e uma instância completa de decode devem ser agendadas juntas antes que o deployment seja considerado pronto. O scheduler, portanto, trata esses componentes interdependentes como um “gang de nível superior”: ele agenda a combinação necessária apenas quando recursos suficientes estão disponíveis. Isso impede que o sistema aloque configurações individualmente completas, mas funcionalmente inutilizáveis, que não podem processar requisições de ponta a ponta.

Em um cluster AKS, os pods de inferência gerenciados pelo Grove podem ser agendados por um scheduler ciente de gang como o KAI Scheduler, um scheduler open-source nativo do Kubernetes construído para workloads de IA com reconhecimento nativo de PodGang. O Grove define a carga de trabalho de inferência – os papéis, grupos, dependências e limites de escalonamento – enquanto o KAI fornece ao Kubernetes o comportamento de agendamento necessário para colocar esses pods como unidades completas. Juntos, eles permitem que essas capacidades sejam expressas e aplicadas de forma limpa dentro da infraestrutura nativa do Kubernetes.

Nota: Ao implantar workloads Dynamo com Grove e KAI scheduler, recomenda-se configurar o cluster com recursos dedicados para o KAI scheduler, a fim de evitar conflitos de agendamento. Workloads de propósito geral podem continuar usando o kube-scheduler padrão em node pools separados, para que os dois schedulers não compitam pela mesma capacidade de nós.

Inicialização

Agendamento é apenas o primeiro passo. Sistemas de serving distribuídos frequentemente têm dependências de inicialização – por exemplo, workers precisam ser descobertos antes que os líderes iniciem, e roteadores ou frontends podem precisar estar prontos antes que os workers de modelo se registrem. O Grove integra a ordem de inicialização à definição da carga de trabalho através de cliqueStartupType e startsAfter, em vez de deixá-la para scripts ou convenções externas.

Escalabilidade

O Grove possui múltiplos limites de escalonamento em um modelo hierárquico: um PodClique para um único papel, um PodCliqueScalingGroup para uma unidade líder-trabalhador completa e um PodCliqueSet para o serviço completo. Isso preserva o escalonamento independente mesmo quando o agendamento é coordenado: prefill e decode podem ser agendados como unidades viáveis enquanto ainda escalam separadamente em resposta a diferentes gargalos.

Diferentes limites de escalonamento também se integram bem com o Dynamo Planner (abordado na Parte 2 desta série). Enquanto o Planner raciocina sobre o formato do tráfego, comprimentos de sequência e metas de TTFT (time-to-first-token) ou ITL (inter-token latency) para decidir quando a capacidade deve mudar, o Grove garante que essa decisão atinja o limite de workload apropriado do Grove: um PodClique para um único papel, um PodCliqueScalingGroup para uma instância líder-trabalhador completa ou o PodCliqueSet para o serviço de inferência de ponta a ponta. Em última análise, o scale-out orientado pelo Planner não apenas adiciona pods; ele adiciona uma instância de inferência completa, agendada em grupo e pronta para servir.

Como modelar deployments de inferência com o Grove?

A API PodCliqueSet do Grove é flexível o suficiente para cobrir uma variedade de formas de deployment de inferência:

  • Serving agregado: onde um único PodClique é suficiente; cada worker lida com o ciclo de vida completo da requisição, e escalar significa adicionar mais cópias desse pod worker.
  • Serving desagregado: router, prefill e decode tornam-se PodCliques separados, cada um escalando independentemente em resposta a diferentes pressões de tráfego.
  • Multi-node: quando uma única instância de modelo abrange vários pods, um PodCliqueScalingGroup vincula os PodCliques líder e worker em uma unidade de escalonamento.

O repositório GitHub do Grove inclui manifests de referência para esses padrões de deployment, fornecendo às equipes pontos de partida concretos para mapear sua própria arquitetura de serving em PodCliques, PodCliqueScalingGroups e PodCliqueSets.

Veja o Grove em ação abaixo enquanto ele orquestra um deployment multi-node Llama 3.1 70B no AKS. A demonstração serve Llama-3.1-70B-Instruct-FP8 em 16x NVIDIA H100 (2 nós de Azure Standard_ND96isr_H100_v5) com tp=16. O walkthrough mostra um DynamoGraphDeployment sendo traduzido em recursos Grove, pods workers sendo alocados nos nós H100 e o scale-out adicionando um segundo worker de dois pods agendado em grupo como uma unidade agrupada.

[Assista à demonstração do Grove em ação] (vídeo disponível no artigo original)

Perspectivas futuras

Ao introduzir essa camada de workload, o Grove fornece ao Kubernetes um contrato estruturado para orquestrar os requisitos de agendamento em grupo e escalonamento de workloads de IA. Isso também fornece a base para lidar com desafios complexos que as cargas de trabalho modernas de inferência enfrentam hoje.

Um desses desafios é o agendamento ciente de topologia. À medida que os deployments abrangem múltiplos nós e domínios de aceleradores, as decisões de agendamento tornam-se críticas para o desempenho. Sem ciência de topologia, instâncias agendadas em grupo podem ser colocadas em nós fisicamente ou topologicamente distantes, introduzindo gargalos de comunicação que prejudicam a eficiência que o stack de inferência foi projetado para entregar.

Atualizações contínuas (rolling updates) introduzem outra camada de complexidade. Em inferência desagregada, componentes de prefill e decode geralmente têm restrições de compatibilidade entre versões de framework, exigindo que o tráfego entre versões seja bloqueado durante upgrades. Isso pode deixar capacidade ociosa entre versões: por exemplo, um rollout pode deixar oito instâncias de prefill em versão antiga, mas apenas duas instâncias de decode em versão antiga, reduzindo a quantidade de capacidade de ponta a ponta que realmente pode atender requisições. Atualizar esses sistemas com segurança requer um comportamento de rollout que preserve capacidade de serving viável em todo o pipeline, em vez de atualizar cada papel como um pool independente de pods.

Na Parte 5, exploraremos como o modelo de workload do Grove apresentado aqui permite orquestração mais avançada, incluindo agendamento ciente de topologia para inferência distribuída e rolling updates mais seguros para pipelines de serving desagregados. Também compartilharemos como estamos colaborando com as comunidades NVIDIA Grove e Dynamo em direção a um objetivo comum: construir uma camada de orquestração nativa do Kubernetes para as demandas da inferência moderna.


Perguntas Frequentes

  • O que diferencia o NVIDIA Grove do LeaderWorkerSet (LWS)?
    Enquanto o LWS gerencia um grupo líder-trabalhador como uma unidade replicada, o Grove vai além: modela todo o serviço de inferência, incluindo múltiplos grupos (prefill, decode, router) e suas dependências. O Grove também oferece agendamento hierárquico em grupo (hierarchical gang scheduling) para garantir que componentes interdependentes sejam alocados juntos, evitando configurações inutilizáveis.

  • Como o agendamento hierárquico em grupo evita configurações inutilizáveis?
    O agendamento em grupo (gang scheduling) garante que todos os pods de uma instância sejam alocados juntos. O Grove estende isso para o nível do serviço: ele exige que pelo menos uma instância completa de prefill e uma de decode sejam agendadas simultaneamente. Assim, o scheduler não aloca prefill sem decode correspondente, evitando que recursos fiquem alocados sem capacidade funcional de atender requisições.

  • O Grove funciona apenas com o Dynamo ou pode ser usado com outros frameworks de inferência?
    O Grove foi projetado como um componente modular do NVIDIA Dynamo, mas pode ser utilizado de forma independente ou integrado a outros frameworks de inferência de alto desempenho, conforme mencionado no artigo. Ele define a camada de orquestração do Kubernetes ao redor do stack de serving, sendo compatível com diferentes backends como vLLM, TensorRT-LLM e SGLang.

  • Como o Grove lida com atualizações contínuas (rolling updates) em pipelines de inferência?
    O artigo indica que rolling updates em pipelines com prefill e decode são desafiadores devido a restrições de compatibilidade entre versões. O Grove ainda não resolve esse problema de forma nativa, mas o artigo adianta que a Parte 5 da série abordará como o modelo de workload do Grove permite implementar rolling updates mais seguros, preservando capacidade de serviço durante a atualização.


Artigo originalmente publicado por Sachi Desai e Ralph Squillace em Azure Updates - Latest from Azure Charts.

Gostou? Compartilhe:
Precisa de ajuda?Fale com nossos especialistas 👋
Avatar Walcew - Headset