Como servidores de IA lidam com vários pedidos ao mesmo tempo sem travar
Entenda a diferença entre prefill e decode, os dois processos que acontecem quando um modelo de linguagem gera texto, e por que misturá-los na mesma GPU pode atrasar todo mundo.
Servidores de IA processam pedidos em duas etapas: prefill (quando o modelo lê a pergunta toda de uma vez) e decode (quando gera a resposta palavra por palavra). Misturar as duas na mesma GPU atrasa todo mundo; separá-las em processadores ou filas diferentes mantém o sistema rápido mesmo com dezenas de usuários simultâneos.

Quando você envia uma pergunta para o ChatGPT ou qualquer outro chatbot baseado em IA, o modelo de linguagem (LLM, sigla em inglês para Large Language Model, ou seja, um programa treinado para entender e gerar texto) passa por duas etapas distintas antes de responder. A primeira é o prefill (pré-preenchimento), quando o modelo processa toda a sua pergunta de uma vez para entender o contexto. A segunda é o decode (decodificação), quando ele gera a resposta palavra por palavra, ou melhor, token por token (cada token é um pedaço de palavra ou pontuação que o modelo processa). Segundo um artigo técnico publicado pela TNG Technology Consulting no blog da Hugging Face (uma plataforma onde desenvolvedores compartilham e baixam modelos de IA já treinados), a forma como esses dois processos são organizados em um servidor pode fazer toda a diferença na velocidade e na capacidade de atender muitas pessoas ao mesmo tempo.
O problema é que prefill e decode usam a GPU (Graphics Processing Unit, o chip especializado que acelera cálculos de IA) de maneiras muito diferentes. O prefill é um processo paralelo intenso: ele carrega toda a sua pergunta de uma vez, faz muitos cálculos ao mesmo tempo e termina rápido. Já o decode é sequencial e lento, porque o modelo gera um token, usa esse token para gerar o próximo, e assim por diante, não conseguindo aproveitar tanto a capacidade da GPU. Quando um servidor tenta misturar as duas etapas — processando a pergunta de um usuário enquanto gera a resposta de outro —, o prefill acaba monopolizando os recursos e atrasando todos os decodes que estão em andamento.
A TNG testou isso na prática com o modelo Llama 3.1 8B (um LLM de pesos abertos, ou seja, cujos parâmetros internos podem ser baixados e rodados por qualquer um, desenvolvido pela Meta) rodando em servidores do Modal (uma plataforma que aluga infraestrutura de nuvem para IA). Eles simularam cenários com dezenas de usuários fazendo perguntas ao mesmo tempo e mediram duas coisas: o time to first token (quanto tempo leva para o modelo começar a responder) e o throughput (quantos tokens por segundo o sistema inteiro consegue gerar). Os resultados mostraram que, quando prefill e decode rodam juntos na mesma GPU, o tempo até o primeiro token sobe drasticamente — em alguns casos, de menos de um segundo para mais de dez —, enquanto o throughput cai pela metade.
A solução proposta é simples: separar prefill e decode em GPUs ou filas diferentes. Assim, enquanto uma GPU processa rapidamente as perguntas que estão chegando, outra (ou outras) fica dedicada a gerar as respostas de forma contínua, sem interrupções. Nos testes da TNG, essa arquitetura manteve o tempo até o primeiro token abaixo de dois segundos mesmo com 32 usuários simultâneos, e o throughput geral ficou muito mais estável. O artigo conclui que, para quem está montando um serviço de IA que precisa atender muita gente ao mesmo tempo, entender essas duas fases e organizá-las corretamente é tão importante quanto escolher o modelo mais potente.


