Da investigação à produção: acelere o LLM de OSS com o EAGLE-3 no Vertex

TL;DR: a descodificação especulativa aumenta a inferência do MDG, mas os métodos tradicionais requerem um modelo de rascunho separado e ineficiente. A Vertex AI usa o EAGLE-3, adicionando um pequeno cabeçalho de rascunho (2 a 5% do modelo de destino) às camadas internas, simplificando o treino e alcançando uma aceleração da descodificação de ~2 a 3 vezes. Esta publicação descreve o nosso pipeline para limpeza de dados, incorporações, preparação e apresentação do EAGLE-3 com o SGLang no Vertex AI em grande escala.
Tempo de leitura: 10 minutos
Para quem trabalha com MDIs, o gargalo de um token de cada vez é um desafio familiar. A geração autorregressiva padrão é inerentemente sequencial. Isto cria um processo clássico limitado pela memória que limita a velocidade não pelo cálculo, mas pelo tempo necessário para ler pesos de modelos massivos da memória para cada passo, o que leva a núcleos da GPU subutilizados.

A solução é a descodificação especulativa. Esta técnica de otimização acelera o processo lento e sequencial do seu GML grande (o modelo de destino) que gera um token de cada vez, através da introdução de um mecanismo de rascunho.

Este mecanismo de rascunho propõe rapidamente vários tokens seguintes de uma só vez. O modelo de destino grande valida estas propostas num único lote paralelo. Aceita o prefixo correspondente mais longo das suas próprias previsões e continua a geração a partir desse novo ponto.

No entanto, nem todos os mecanismos de rascunho são criados da mesma forma. A abordagem clássica de rascunho-alvo usa um modelo de MDG separado e mais pequeno como o criador de rascunhos, o que significa que tem de alojar e gerir mais recursos de publicação, o que causa custos adicionais.

Fluxograma que representa um exemplo com a abordagem de segmentação por rascunho. O comando "São Francisco é" direciona para dois passos: 1. O modelo de rascunho gera uma cadeia sequencial de tokens (os tokens são: "a", "city", "in") e 2. O modelo de destino valida e seleciona os tokens de rascunho esperados (os tokens são: "a", "city", "in", com o token "in" a ser rejeitado pelo modelo). Caso contrário, gera novos tokens (os tokens são: "a", "city", "known"). Os resultados dos dois passos convergem para o resultado final de "San Francisco é uma cidade conhecida".

Clique para aumentar a imagem

É aqui que entra o EAGLE-3 (Extrapolative Attention Guided LEarning). O EAGLE-3 é uma abordagem mais avançada. Em vez de um modelo totalmente separado, anexa um "cabeçalho de rascunho" extremamente leve, apenas 2 a 5% do tamanho do modelo de destino, diretamente às respetivas camadas internas. Este cabeçalho funciona ao nível das funcionalidades e dos tokens, incorporando funcionalidades dos estados ocultos do modelo de destino para extrapolar e prever uma árvore de tokens futuros.

O resultado? Todas as vantagens da descodificação especulativa, ao mesmo tempo que elimina a sobrecarga da preparação e execução de um segundo modelo.

A abordagem do EAGLE-3 é muito mais eficiente do que a tarefa complexa e com utilização intensiva de recursos de formar e manter um modelo de rascunho separado com vários milhares de milhões de parâmetros. Prepara apenas um "esboço" simples, que representa apenas 2% a 5% do tamanho do modelo de destino, e que é adicionado como parte do seu modelo existente. Este processo de preparação mais simples e eficiente oferece um aumento significativo de 2 a 3 vezes no desempenho da descodificação para modelos como o Llama 70B (dependendo dos tipos de carga de trabalho, por exemplo, de várias interações, código, contexto longo e muito mais).

Fluxograma que representa um exemplo de utilização da abordagem EAGLE-3. O comando "São Francisco é" direciona para um modelo de destino com o EAGLE-3 que contém várias camadas. A camada de incorporação flui para o descodificador e as camadas ocultas, que, por sua vez, fluem para a cabeça do EAGLE-3. A camada de cabeçalho do EAGLE-3 divide-se em duas cadeias de tokens ("a", "city", "in" e "a", "city", "known") que direcionam de volta para a camada de incorporação. Os tokens validados "a", "city" e "known" fluem para o resultado final: "São Francisco é uma cidade conhecida".

Clique para aumentar a imagem

No entanto, a mudança desta abordagem EAGLE-3 simplificada de um papel para um serviço na nuvem dimensionado e pronto para produção é um verdadeiro percurso de engenharia. Esta publicação partilha o nosso pipeline técnico, os principais desafios e as lições que aprendemos ao longo do caminho.

Desafio n.º 1: preparar os dados

O cabeçalho EAGLE-3 tem de ser preparado. O primeiro passo óbvio é obter um conjunto de dados genérico disponível publicamente. A maioria destes conjuntos de dados apresenta desafios, incluindo:

  • Termos de Utilização rigorosos: estes conjuntos de dados são gerados através de modelos que não permitem a sua utilização para desenvolver modelos que concorram com os fornecedores originais.
  • Contaminação por IIP: alguns destes conjuntos de dados contêm IIP significativas, incluindo nomes, localizações e até identificadores financeiros.
  • Qualidade não garantida: alguns conjuntos de dados só funcionam bem para exemplos de utilização de "demonstração" gerais, mas não funcionam melhor para a carga de trabalho especializada de clientes reais.

Não é possível usar estes dados tal como estão.

Lição 1: crie um pipeline de geração de dados sintéticos

Uma solução é criar um pipeline de geração de dados sintéticos. Consoante os exemplos de utilização dos nossos clientes, selecionamos o conjunto de dados certo não só com boa qualidade, mas também que corresponda melhor ao tráfego de produção dos nossos clientes para várias cargas de trabalho diferentes. Em seguida, pode extrair apenas os comandos do utilizador destes conjuntos de dados e aplicar uma filtragem rigorosa de DLP (prevenção contra a perda de dados) e PII. Estes comandos limpos aplicam um modelo de chat, tokenizam-nos e, em seguida, podem ser introduzidos no modelo de destino (por exemplo, Llama 3.3 70B) para recolher as respetivas respostas.

Esta abordagem fornece dados gerados pelo destino que não são apenas conformes e limpos, mas também bem adequados à distribuição de resultados real do modelo. Isto é ideal para preparar o cabeçalho do rascunho.

Fluxograma linear que representa o pipeline de geração de dados sintéticos. Os comandos do utilizador são extraídos de dados não processados, que são limpos e filtrados. Os comandos
limpos são tokenizados através de modelos de chat e tokenizadores. Em seguida, os comandos tokenizados são usados para gerar respostas em conjunto com um modelo de destino, que devolve os tokens de resposta gerados.

Clique para aumentar a imagem

Desafio n.º 2: criar o pipeline de preparação

Outra decisão fundamental é como fornecer os dados de preparação ao cabeçalho do EAGLE-3. Tem dois caminhos distintos: formação online, onde as incorporações são "geradas em tempo real", e formação offline, onde "as incorporações são geradas antes da formação".

No nosso caso, escolhemos uma abordagem de formação offline porque requer muito menos hardware do que a formação online. Este processo envolve o pré-cálculo de todas as funcionalidades e incorporações antes de prepararmos o EAGLE-3. Guardamo-los no GCS e tornam-se os dados de preparação para a nossa arquitetura EAGLE-3 simplificada. Depois de ter os dados, a preparação em si é rápida. Dado o tamanho diminuto da cabeça do EAGLE-3, a preparação inicial com o nosso conjunto de dados original demorou aproximadamente um dia num único anfitrião. No entanto, à medida que dimensionámos o nosso conjunto de dados, os tempos de preparação aumentaram proporcionalmente, abrangendo agora vários dias.

Fluxograma linear que representa o pipeline de preparação. Os comandos tokenizados e os tokens de resposta gerados são usados para gerar funcionalidades e incorporações com o modelo de destino, que devolve tokens e funcionalidades. Estes tokens e funcionalidades são usados na preparação do cabeçalho EAGLE com o modelo rascunho, que devolve o cabeçalho EAGLE preparado.

Clique para aumentar a imagem

Este processo ensinou-nos duas lições importantes que deve ter em atenção.

Lição 2: os modelos de chat não são opcionais

Durante a preparação do modelo ajustado às instruções, verificámos que o desempenho do EAGLE-3 pode variar muito quando o modelo de chat não está correto. Tem de aplicar o modelo de chat específico do modelo de destino (por exemplo, Llama 3) antes de gerar as funcionalidades e as incorporações. Se apenas concatenar texto inserido, as incorporações vão estar incorretas e o seu cabeçalho vai aprender a prever a distribuição errada.

Lição 3: tenha cuidado com a máscara

Durante a preparação, o modelo recebe as representações do comando e da resposta. No entanto, o cabeçalho do EAGLE-3 só deve aprender a prever a representação da resposta. Tem de mascarar manualmente a parte do comando na função de perda. Se não o fizer, o cabeçalho desperdiça capacidade de aprendizagem para prever o comando que já lhe foi dado, e o desempenho vai sofrer.

Diagrama que representa um exemplo de uma máscara de perda. A expressão "São Francisco é uma cidade
conhecida" está dividida em duas partes: tokens que já são conhecidos ("São",
"Francisco", "é"), que são representados por zeros na máscara de perda; e tokens
que precisam de ser previstos ("uma", "cidade", "conhecida"), que são representados por uns
na máscara de perda.

Clique para aumentar a imagem

Desafio n.º 3: publicação e escalabilidade

Com um cabeçalho EAGLE-3 preparado, avançámos para a fase de publicação. Esta fase introduziu desafios de escalabilidade significativos. Seguem-se as nossas principais aprendizagens.

Lição 4: a sua estrutura de publicação é fundamental

Ao trabalhar em estreita colaboração com a equipa do SGLang, implementámos com êxito o EAGLE-3 na produção com o melhor desempenho. O motivo técnico é que o SGLang implementa um kernel de atenção de árvore crucial. Este kernel especial é crucial porque o EAGLE-3 gera uma "árvore de rascunho" de possibilidades (não apenas uma simples cadeia) e o kernel do SGLang foi concebido especificamente para validar todos esses caminhos ramificados em paralelo num único passo. Sem esta, está a perder desempenho.

Lição 5: não deixe que a CPU limite o desempenho da GPU

Mesmo depois de acelerar o seu MDG com o EAGLE-3, pode atingir outro limite de desempenho: a CPU. Quando as suas GPUs estão a executar a inferência de MDIs, o software não otimizado desperdiça uma grande quantidade de tempo na sobrecarga da CPU, como o lançamento do kernel e a gestão de metadados. Num agendador síncrono normal, a GPU executa um passo (como Rascunho) e, em seguida, fica inativa enquanto a CPU faz o seu trabalho administrativo e inicia o passo Validar seguinte. Estas bolhas de sincronização acumulam-se, desperdiçando grandes quantidades de tempo valioso da GPU.

Exemplo de um agendador síncrono normal. Cada passo é apresentado sequencialmente com a quantidade de tempo gasto durante cada passo: rascunho (10 ms), validação (15 ms),
extensão (10 ms), sincronização da CPU (5 ms), rascunho (10 ms) e validação (15 ms). O passo de sincronização da CPU é realçado com uma cor diferente para indicar o tempo não otimizado gasto na sobrecarga da CPU.

Clique para aumentar a imagem

Resolvi este problema usando o Zero-Overhead Overlap Scheduler do SGLang. Este agendador está especificamente otimizado para o fluxo de trabalho de descodificação especulativa de vários passos Rascunho -> Verificar -> Extensão do rascunho . O importante é sobrepor a computação. Enquanto a GPU está ocupada a executar o passo Validar atual, a CPU já está a trabalhar em paralelo para iniciar os núcleos dos passos seguintes Rascunho e Estender rascunho . Isto elimina a bolha inativa, garantindo que a próxima tarefa da GPU está sempre pronta, usando uma FutureMap, uma estrutura de dados inteligente que permite à CPU preparar o próximo lote ENQUANTO a GPU ainda está a funcionar.

Exemplo de um programador de sobreposição sem custos gerais. A maioria dos passos e tempos são
idênticos aos da imagem anterior, mas, em vez do passo de sincronização da CPU, existe um
passo mais pequeno que indica os passos de escrita e leitura a ocorrerem em simultâneo, cada um
a demorar 0,1 ms a concluir.

Clique para aumentar a imagem

Ao eliminar esta sobrecarga da CPU, o programador de sobreposição oferece-nos um aumento de velocidade de 10% a 20% em geral. Isto prova que um excelente modelo é apenas metade da batalha. Precisa de um tempo de execução que consiga acompanhar.

Resultados de testes de referência

Depois desta viagem, valeu a pena? Claro.

Comparámos o nosso modelo EAGLE-3 treinado com a base não especulativa usando o SGLang com o Llama 4 Scout 17B Instruct. Os nossos testes de referência mostram um aumento de 2 a 3 vezes na latência de descodificação e ganhos significativos de débito, consoante os tipos de carga de trabalho.

Veja os detalhes completos e faça o teste de referência você mesmo com o nosso notebook abrangente.

Métrica 1: tempo mediano por token de saída (TPOT)

Gráfico de linhas que representa o tempo por token de saída (TPOT) versus a concorrência, com a indicação de que quanto mais baixo, melhor. O eixo Y representa o TPOT mediano em milissegundos, enquanto o eixo X representa a simultaneidade máxima. O gráfico representa duas linhas que representam os resultados de base e os resultados do EAGLE, com os resultados de base a obterem consistentemente uma pontuação mais elevada do que os resultados do EAGLE. Ambas as linhas começam perto do canto inferior esquerdo do gráfico e tendem a subir à medida que a concorrência máxima aumenta, com os resultados de referência a apresentarem um pico ascendente mais acentuado em direção ao limite do gráfico.

Clique para aumentar a imagem

Este gráfico mostra o melhor desempenho de latência do EAGLE-3. O gráfico Tempo por token de saída (TPOT) mostra que o modelo acelerado EAGLE-3 (linha verde) atinge consistentemente uma latência inferior (mais rápida) do que a base (linha azul) em todos os níveis de concorrência testados.

Métrica 2: débito de saída

Gráfico de linhas que representa o débito de tokens em comparação com a concorrência, com a nota de que
quanto mais alto, melhor. O eixo Y representa o débito em tokens por segundo, enquanto o eixo X representa a concorrência máxima. O gráfico representa duas linhas que representam os resultados de base e os resultados do EAGLE. Os resultados do EAGLE
têm sempre uma pontuação superior à dos resultados de base. Ambas as linhas começam no canto inferior esquerdo e tendem a subir à medida que a concorrência máxima aumenta, com os resultados do EAGLE a apresentarem uma tendência a uma taxa mais suave e significativa do que os resultados de base.

Clique para aumentar a imagem

Este gráfico realça ainda mais a vantagem de débito do EAGLE-3. O gráfico de débito de tokens vs. concorrência demonstra claramente que o modelo acelerado EAGLE-3 (linha verde) supera de forma consistente e substancial o modelo de base (linha azul).

Embora as observações semelhantes se mantenham verdadeiras para modelos maiores, vale a pena notar que pode observar um aumento no tempo até ao primeiro token (TTFT) em comparação com outras métricas de desempenho. Além disso, estes desempenhos variam consoante a tarefa, como ilustrado pelos seguintes exemplos:

Gráfico de barras que compara as velocidades de saída entre categorias entre o modelo de base e o modelo acelerado EAGLE-3 preparado com o Vertex AI. Em todas as categorias (código, chat, contexto longo, matemática e multilingue), a velocidade de saída do modelo EAGLE-3 é drasticamente superior à do modelo de base.

Clique para aumentar a imagem

Conclusão: agora é a sua vez

O EAGLE-3 não é apenas um conceito de investigação, mas um padrão pronto para produção que pode oferecer um aumento tangível de 2x na latência de descodificação. No entanto, para o expandir, é necessário um verdadeiro esforço de engenharia. Para implementar esta tecnologia de forma fiável para os seus utilizadores, tem de:

  1. Crie um pipeline de dados sintéticos em conformidade.
  2. Processar corretamente modelos de chat e máscaras de perda, e formar o modelo numa grande escala de conjunto de dados.

No Vertex AI, já simplificámos todo este processo para si, oferecendo-lhe um contentor e uma infraestrutura otimizados concebidos para dimensionar as suas aplicações baseadas em MDIs. Para começar, consulte os seguintes recursos:

Agradecemos a leitura

Agradecemos o seu feedback e perguntas sobre a Vertex AI.

Confirmações

Gostaríamos de expressar a nossa sincera gratidão à equipa da SGLang, especificamente a Ying Sheng, Lianmin Zheng, Yineng Zhang, Xinyuan Tong e Liangsheng Yin, bem como à equipa da SGLang/SpecForge, especificamente a Shenggui Li e Yikai Zhu, pelo seu apoio inestimável ao longo deste projeto. A sua generosa assistência e estatísticas técnicas detalhadas foram fundamentais para o sucesso deste projeto.