The Cost of Attention
Uma página à parte. O exemplo destas páginas tem cinco tokens e não custa nada para rodar. Esta página trata do que a atenção custa num modelo de verdade: o cache que a geração guarda de um token para o seguinte e o \(O(n^2)\) dos contextos longos. ← Máscaras e cabeças · Visão geral
O cache de KV é o que ninguém ensina e todo mundo paga
Um modelo gera texto um token por vez e cada token novo precisa de atenção sobre todos os anteriores. O que isso exige de cada token antigo? A query dele não: ela só serviu para calcular a própria saída, lá atrás. Mas a chave e o valor dele serão consultados por todo token que vier depois. Sem guardá-los, o passo \(t\) rodaria a rede inteira sobre os \(t\) tokens do prefixo só para refazê-los e gerar \(n\) tokens custaria \(1 + 2 + \dots + n = O(n^2)\) passagens de token em vez de \(n\) — então ninguém faz isso. Cada K e V é calculado uma vez e guardado.
Esse cache é hoje o custo dominante de memória para servir um modelo e é a razão pela qual "contexto de 128k" é uma decisão de preço, não de arquitetura:
O 2 conta K e V; \(L\) é o número de camadas, \(n\) o comprimento do contexto e \(B\) o tamanho do batch. Ponha números de um modelo real, o Llama 3 8B: \(L = 32\), \(h_{kv} = 8\), \(d_\text{head} = 128\), em 16 bits (2 bytes). Cada token custa \(2 \times 32 \times 8 \times 128 \times 2 = 131\,072\) bytes, ou 128 KiB. Um contexto de 128k tokens ocupa então 16 GiB — tanto quanto os próprios pesos do modelo — e isso para um usuário. O brinquedo destas páginas, com uma camada e duas cabeças de largura 2, guarda \(2 \times 1 \times 2 \times 2 = 8\) números por token; o GPT-2 small guarda \(2 \times 12 \times 12 \times 64 = 18.432\), 36 KiB por token em 16 bits.
Só um termo desse produto é uma variável livre de projeto: \(h_{kv}\), o número de cabeças de chave/valor. As queries podem manter todas as \(h\) cabeças; K e V podem ser compartilhados. O Llama 3 8B tem 32 cabeças de query e só 8 de chave/valor — com uma por query o cache seria quatro vezes maior. Na tabela de formas de máscaras e cabeças, K e V passam a ser \(B \times h_{kv} \times n \times d_\text{head}\) e cada um é repetido \(h / h_{kv}\) vezes para encontrar as queries; só a versão pequena vai para o cache. Isso produziu a sequência sobre a qual todo modelo atual se posiciona:
| Esquema | Cabeças de KV | Cache | Qualidade | Situação em 2026 |
|---|---|---|---|---|
| MHA — multi-cabeça1 | \(h\) | 1× | Referência | Histórico. Ninguém serve isso em contexto longo. |
| MQA — multi-query3 | 1 | \(1/h\) | Mensuravelmente pior | Usado onde memória domina tudo |
| GQA — grouped-query4 | \(g\) (tipicamente 8) | \(g/h\) | Indistinguível do MHA | O padrão. Llama, Mistral, Qwen, Gemma |
| MLA — latente multi-cabeça5 | — | ~\(1/57\) | Reportada igual ou acima do MHA | DeepSeek-V2/V3; comprime KV em um latente de posto baixo e faz cache dele |
Isto é um problema de banda de memória, não de FLOPs
Durante a geração você lê o cache de KV inteiro para produzir um token. A intensidade aritmética é péssima, o acelerador fica ocioso e a vazão é ditada pela banda da HBM. Tudo que acelera inferência — GQA, cache de KV quantizado, PagedAttention6, decodificação especulativa, batches maiores — é um ataque a bytes movidos, não a operações realizadas. Reconhecer de qual recurso você está com falta é a maior parte da engenharia prática de LLMs.
Tornando o \(O(n^2)\) pagável
A atenção é \(O(n^2 d)\) em tempo e, escrita ingenuamente, \(O(n^2)\) em memória: a matriz \(S\) da tabela de formas tem uma entrada por par de tokens. Com \(n = 128\text{k}\) ela tem \(1{,}7 \times 10^{10}\) entradas — 34 GB em 16 bits, por cabeça, por camada. Existem quatro famílias de respostas e elas não têm o mesmo sucesso.
-
Mesma matemática, execução melhor
O FlashAttention2 nunca materializa a matriz \(n \times n\). Ele fatia a computação em blocos que cabem na SRAM e usa o truque do softmax online para combiná-los. A memória cai para \(O(n)\), o tempo de parede cai várias vezes e a saída é a da versão ingênua a menos do arredondamento de ponto flutuante.
Isto não é uma aproximação e não há trade-off de qualidade. O FlashAttention-2 reorganiza o trabalho na GPU e o FlashAttention-3 o afina para hardware classe Hopper. Se você está escrevendo atenção à mão, é quase certo que está mais lento — use
F.scaled_dot_product_attention. -
Atender a menos
Janela deslizante: cada token vê apenas os últimos \(w\); empilhar camadas amplia o alcance efetivo exatamente como o campo receptivo de uma CNN. Sumidouros de atenção7: manter os primeiros tokens sempre visíveis — os modelos despejam massa de atenção excedente neles e removê-los destrói a geração.
Modelos modernos de contexto longo intercalam: algumas camadas de atenção completa entre muitas locais, de modo que a informação global ainda tem rota enquanto o custo fica quase linear.
-
Mudar a matemática
A atenção linear troca o softmax por um kernel, tornando a operação associativa e o custo \(O(n)\) — e abrindo mão da recuperação afiada que o softmax oferece. Modelos de espaço de estados (Mamba, Mamba-28) alcançam o mesmo \(O(n)\) com um estado recorrente e um cache de tamanho constante.
O veredito honesto de 2026: modelos lineares puros perdem em recuperação exata de contexto longo. Híbridos vencem — Jamba, Zamba, Nemotron-H e Falcon-H1 combinam camadas SSM com uma parcela pequena de atenção completa (uma minoria das camadas, ou cabeças de atenção ao lado do SSM) e reportam qualidade de Transformer com uma fração do cache.
-
Aprender o que pular
Atenção esparsa treinável — o NSA da DeepSeek9 e o MoBA da Kimi — escolhe quais blocos do passado atender, com a seleção treinada ponta a ponta em vez de fixada por um padrão.
Esta é a mais promissora das quatro no momento: mantém a recuperação exata do softmax onde importa e paga custo quase linear no resto — e, ao contrário de esquemas esparsos anteriores, é alinhada ao hardware o bastante para de fato ser mais rápida.
O que usar, na prática
Atenção completa com FlashAttention e GQA, RoPE para posição, janela deslizante ou camadas híbridas se suas sequências forem genuinamente longas. Essa combinação é o que essencialmente todo modelo lançado nos últimos dois anos faz e sair dela exige uma razão medida.
Verifique você mesmo — enquanto o brinquedo gera ␣telhado depois de “o gato subiu no”, o que está no cache e o que é calculado?
As chaves e os valores dos cinco tokens do prompt, na sua única camada e nas duas cabeças: \(5 \times 8 = 40\) números. Para ␣telhado o modelo calcula só a linha nova (o embedding, \(q\), \(k\) e \(v\), uma linha de scores contra seis chaves e o MLP) e acrescenta \(k\) e \(v\) dela ao cache. Sem o cache ele recalcularia as seis linhas; gerar \(n\) tokens custaria \(1 + 2 + \dots + n\) linhas.
← Máscaras e cabeças · Visão geral · próximo capítulo: Transformers
-
Vaswani, A., et al. (2017). Attention Is All You Need — NeurIPS. Atenção escalada por produto escalar, multi-cabeça, posições senoidais. ↩
-
Dao, T., Fu, D., Ermon, S., Rudra, A., & Ré, C. (2022). FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness — NeurIPS. Veja também FlashAttention-2 (2023) e FlashAttention-3 (2024). ↩
-
Shazeer, N. (2019). Fast Transformer Decoding: One Write-Head is All You Need. Atenção multi-query e a primeira afirmação clara de que decodificar é limitado por memória. ↩
-
Ainslie, J., et al. (2023). GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints — EMNLP. O meio-termo que virou padrão. ↩
-
DeepSeek-AI (2024). DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model. Atenção latente multi-cabeça: fazer cache de um latente de posto baixo em vez de K e V. ↩
-
Kwon, W., et al. (2023). Efficient Memory Management for Large Language Model Serving with PagedAttention — SOSP. Memória virtual para o cache de KV; o núcleo do vLLM. ↩
-
Xiao, G., Tian, Y., Chen, B., Han, S., & Lewis, M. (2024). Efficient Streaming Language Models with Attention Sinks — ICLR. Por que o primeiro token não pode ser descartado. ↩
-
Dao, T., & Gu, A. (2024). Transformers are SSMs: Generalized Models and Efficient Algorithms Through Structured State Space Duality — ICML. Mamba-2 e a equivalência que torna híbridos projetáveis. ↩
-
Yuan, J., et al. (2025). Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention — ACL. Esparsidade aprendida durante o pré-treino em vez de imposta depois dele. ↩