O speculative decoding é uma técnica que acelera a geração de texto pelos grandes modelos de linguagem, sem modificar o modelo nem degradar a qualidade das respostas. Apresentada como capaz de acelerar a inferência de 2 a 3 vezes, baseia-se numa estratégia de geração mais inteligente em vez de numa mudança de arquitetura.
- O speculative decoding acelera a geração de texto sem alterar o modelo nem degradar as respostas.
- Um modelo pequeno propõe vários tokens, e o modelo alvo verifica-os em paralelo.
- O ganho de 2x a 3x depende da taxa de aceitação dos candidatos.
- Variantes como Medusa, Eagle e Prompt Lookup Decoding dispensam o modelo de rascunho.
O estrangulamento da memória
Sempre que um utilizador envia uma mensagem a um chatbot, o modelo gera a sua resposta token por token, ou seja, fragmento de texto por fragmento de texto. Este funcionamento torna-se um obstáculo à medida que os modelos crescem, especialmente para assistentes de programação, serviços ao cliente ou agentes em tempo real, que exigem uma resposta quase imediata.
O travão não vem principalmente da potência de cálculo. GPUs como as NVIDIA H100 são muito rápidas para cálculos matriciais. O problema reside no facto de os milhares de milhões de parâmetros do modelo, armazenados em memória, terem de ser transferidos para o processador antes da geração de cada token. As unidades de cálculo ficam então largamente inativas. Os engenheiros falam de um sistema limitado pela largura de banda da memória: adicionar potência de cálculo não acelera, portanto, significativamente as coisas.
Propor, depois verificar
O princípio consiste em gerar vários tokens candidatos de uma só vez, para depois os verificar em paralelo. O sistema baseia-se em dois modelos. Um modelo pequeno, designado de rascunho (draft model), produz rapidamente uma sequência de candidatos, geralmente quatro a oito tokens. Um modelo alvo (target model), maior e de melhor qualidade, avalia o conjunto numa única passagem. Como as GPUs são concebidas para cálculo paralelo, processar um lote de tokens não demora muito mais tempo do que processar um único token.
Para cada candidato, o modelo alvo compara a sua própria probabilidade com a que lhe foi atribuída pelo rascunho. Se o modelo alvo estiver pelo menos tão confiante, o token é aceite. Caso contrário, é aceite com uma probabilidade que diminui à medida que a diferença aumenta. Um token rejeitado é substituído por um token extraído de uma distribuição ajustada, e depois o ciclo recomeça. Segundo a apresentação do método, este procedimento estatístico garante que a saída segue exatamente a mesma distribuição de probabilidade que se o modelo alvo tivesse gerado cada token sozinho.
No melhor dos casos, todos os candidatos são aceites e o modelo alvo adiciona um token extra, ou seja, cinco a nove tokens pelo custo de uma passagem do modelo alvo. No pior dos casos, o primeiro candidato é rejeitado, o que adiciona uma ligeira sobrecarga, uma vez que o tempo de geração do rascunho continua a ser devido. Um par de modelos mal combinados pode, portanto, abrandar ligeiramente a geração.
O ganho real depende sobretudo da taxa de aceitação, ou seja, da frequência com que os candidatos do rascunho passam a verificação. À volta de 70 a 80%, um nível qualificado como típico para pares bem combinados em tarefas comuns, a aceleração situa-se entre 2x e 3x. Os textos previsíveis ou repetitivos produzem taxas mais elevadas e ganhos maiores.
Variantes e implementação prática
O esquema original exige um modelo de rascunho distinto, o que adiciona memória e complexidade de engenharia. Várias técnicas mais recentes dispensam-no. Algumas renunciam à garantia estatística estrita para uma implementação mais simples ou um débito mais elevado, com, segundo a fonte, um impacto geralmente negligenciável na qualidade das saídas.
Medusa adiciona ao modelo alvo várias cabeças de previsão adicionais na sua última camada, cada uma prevendo uma posição futura diferente. Eagle, de «Extrapolation Algorithm for Greater Language-model Efficiency», baseia-se nos estados internos do modelo em vez dos seus tokens de saída, o que, segundo a fonte, favorece taxas de aceitação mais elevadas em textos complexos ou especializados. O Prompt Lookup Decoding não utiliza nenhum modelo secundário: identifica no prompt e no histórico de conversação as expressões suscetíveis de reaparecer na resposta, e usa-as como candidatos, o que é adequado nomeadamente para edição de código e resumo de documentos.
O speculative decoding é oferecido como opção em várias frameworks de inferência, incluindo o text-generation-inference da Hugging Face, o vLLM e o llama.cpp. Segundo a fonte, ativá-lo consiste geralmente numa mudança de configuração.
A técnica beneficia sobretudo gerações longas, quando o modelo processa um pedido de cada vez e o prompt e a resposta partilham vocabulário ou estrutura. As perguntas-respostas, o resumo de documentos e a conclusão de código estão entre os casos onde os ganhos são maiores. No serviço por lotes de alto débito, pelo contrário, pode reduzir o débito, pois os tokens de rascunho consomem memória e cálculo que poderiam servir a outros pedidos.
