KV Cache: Memória Eficiente
Ao terminar: Você calcula por que um modelo de 30GB pode exigir 60GB de VRAM e o que o KV cache muda nessa conta.
- ⬜⚙️ Transformers e Mecanismo de Atenção(Fundamentos da IA)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Por que um modelo de 30GB de parametros pode precisar de 60GB+ de VRAM? Por que gerar o primeiro token e lento mas os seguintes sao rapidos? A resposta e o KV Cache — uma das otimizacoes mais importantes (e menos explicadas) da inferencia de LLMs. Neste artigo, voce vai entender como ele funciona, quanto de memoria consome, e como tecnicas modernas (GQA, Flash Attention, PagedAttention) lidam com seus limites.
Pre-requisito: voce precisa entender self-attention (Q, K, V) e como o Transformer gera tokens autorregressivamente. Se nao leu o artigo de Transformers, leia antes.
O problema: atencao autorregressiva e redundante
Na geracao autorregressiva, o modelo gera um token por vez. Para gerar o token na posicao t, ele precisa calcular a atencao entre Q(t) e os Keys de todos os tokens anteriores (1 ate t-1), e combinar com os Values correspondentes.
Para N tokens: recalcula N(N+1)/2 pares K/V — custo O(N²) em compute redundante.
A solucao: KV Cache
A ideia e simples: calcule K e V de cada token uma unica vez e guarde em memoria. Quando o proximo token chegar, so calcule K e V dele e concatene com o cache.
- → contém
- Conceito de arquitetura
- Compute
- Banco de dados
Duas fases com gargalos opostos: essa é a chave para entender preço, latência e capacidade de um serviço de inferência. Quase toda otimização que você vai encontrar ataca uma das duas — raramente as duas.
- 1 · Sem cache, cada token recalcularia tudo. A atenção olha para todos os tokens anteriores. Recalcular as chaves e valores deles a cada passo é trabalho idêntico repetido — cresce com o quadrado do comprimento.
- 2 · Guardar chaves e valores torna o passo linear. O que é constante fica no cache; só o token novo é processado. É a otimização que viabiliza gerar texto longo.
- 3 · As duas fases têm gargalos opostos. Preencher é limitado por cálculo — muitos tokens em paralelo. Gerar é limitado por banda — pouco cálculo e muita leitura. Otimizar as duas com a mesma técnica não funciona.
- 4 · Isso explica o preço diferente de entrada e saída. Entrada é processada em paralelo e sai barata por token. Saída é sequencial e limitada por memória — e por isso custa mais.
- 5 · O cache é o que limita quantas sessões cabem. Ele cresce com o comprimento e se multiplica pelo número de conversas simultâneas. É ele, e não os pesos, que define quantos usuários a placa atende.
- 6 · Reservar por comprimento máximo desperdiça quase tudo. Alocar espaço para o pior caso deixa a maior parte reservada e ociosa. Distribuir em blocos pequenos multiplica a capacidade real da mesma placa.
Para N tokens: calcula exatamente N pares K/V — custo O(N) em vez de O(N²).
O trade-off e classico: compute vs memoria. KV Cache troca recalculo (compute) por armazenamento (memoria VRAM). A geracao fica muito mais rapida, mas o cache ocupa espaco — e quanto maior o contexto, mais espaco.
Prefill vs Decode: as duas fases da inferencia
Por isso o primeiro token demora mais (prefill inteiro) e os seguintes sao rapidos (so decode incremental). Voce ja percebeu isso ao usar ChatGPT ou Claude — aquela pausa inicial seguida de streaming rapido.
Quanto de memoria o cache consome?
KV Cache (bytes) = 2 × layers × seq_len × d_model × bytes_per_param
| Modelo | Layers | Dim | Cache 4k ctx | Cache 128k ctx |
|---|---|---|---|---|
| LLaMA 3 8B | 32 | 4096 | 2 GB | 64 GB |
| LLaMA 3 70B | 80 | 8192 | 10 GB | 320 GB |
| GPT-4 (est.) | ~120 | ~12k | ~23 GB | ~750 GB |
LLaMA 3 70B em FP16: modelo ~140 GB + cache 128k = 320 GB → ~460 GB de VRAM para UM request = 6× H100 80GB apenas para servir 1 usuário.
GQA e MQA: compartilhando K/V entre cabecas
Multi-Head Attention (MHA) padrao gera K/V independentes para cada cabeca de atencao. Mas K/V consomem muito mais memoria que Q (cache!). Solucao: compartilhar K/V entre cabecas.
| Tecnica | Q heads | K/V heads | Reducao de cache | Usado em |
|---|---|---|---|---|
| MHA (padrao) | 32 | 32 | 0% (baseline) | GPT-2, BERT, Transformer original |
| GQA (Grouped) | 32 | 8 | 75% | LLaMA 3, Gemma 2, Mistral |
| MQA (Multi-Query) | 32 | 1 | 97% | PaLM, Falcon, StarCoder |
Flash Attention: compute eficiente, nao menos compute
Flash Attention nao reduz a complexidade O(n2) — reduz os acessos a memoria. GPUs tem dois tipos de memoria:
| Memoria | Tamanho (H100) | Velocidade | Papel |
|---|---|---|---|
| SRAM (on-chip) | ~50 MB | ~19 TB/s | Rapida mas minuscula — usada como cache de trabalho |
| HBM (VRAM) | 80 GB | ~3.4 TB/s | Grande mas ~6x mais lenta — onde modelo e KV Cache vivem |
A atencao padrao materializa a matriz n x n inteira na HBM. Flash Attention calcula a atencao em blocos (tiles) que cabem na SRAM, sem nunca materializar a matriz completa. Resultado:
| Metrica | Atencao padrao | Flash Attention v2 |
|---|---|---|
| Memoria de pico | O(n2) — materializa matriz n x n | O(n) — so armazena tiles parciais |
| Acessos HBM | Muitos — le e escreve matriz inteira | Poucos — tudo fica na SRAM o maximo possivel |
| Speedup tipico | Baseline | 2-4x mais rapido |
| Complexidade | O(n2) | O(n2) — mesma! So reordena os calculos |
O que o cache de chaves e valores armazena, e por que ele existe?
PagedAttention: servindo multiplos usuarios
Em producao, um servidor serve multiplos usuarios simultaneamente. Cada request tem um KV Cache de tamanho diferente. Alocar memoria contiguamente causa fragmentacao: espacos vazios entre caches de tamanhos diferentes.
vLLM (UC Berkeley) implementa PagedAttention. Padrão na indústria para servir LLMs em produção.
Prompt Caching: reutilizando o prefill
Se 100 requests usam o mesmo system prompt de 2000 tokens, por que recalcular K/V desses 2000 tokens 100 vezes? Prompt Caching resolve: o KV Cache do prefixo comum e calculado uma vez e reutilizado.
Requisitos: prefixo idêntico byte a byte · TTL ~5 min (Anthropic) · Preços: cache write = normal, cache read = ~10% do preço.
📋 Quando usar Prompt Caching?
O custo de cache write e negligivel comparado com a economia em cache reads. Qualquer chatbot, RAG pipeline ou agent com system prompt longo se beneficia.
Alt: Sem cache — Apenas para requests unicos com prompts sempre diferentes (raro em producao).
MLA: a próxima geração de eficiência de cache
GQA e MQA compartilham K/V entre cabeças — mas ainda armazenam K e V separadamente. Multi-head Latent Attention (MLA), introduzido pelo DeepSeek v2/v3 (2024), vai além: comprime K e V num espaço latente de dimensão muito menor antes de armazenar.
Trade-off do MLA: menos VRAM de cache, mas mais compute na atenção (re-projeção latente → K/V a cada step). Na prática, GPUs modernas têm compute sobrando mas VRAM escassa — MLA é o trade-off certo. É a razão pela qual DeepSeek v3 pode rodar contextos de 128k tokens com muito menos VRAM que LLaMA 3 equivalente.
| Técnica | Redução de cache | Custo | Adoção |
|---|---|---|---|
| MQA (Multi-Query) | 1 K/V pair total → 8× menos (vs MHA 8h) | Perda de qualidade pequena-média | GPT-3.5, Falcon |
| GQA (Grouped Query) | 1 K/V por grupo → 2-8× menos | Perda mínima (LLaMA 3 usa) | LLaMA 3, Mistral, Gemma |
| MLA (Latent Attention) | 5-10× menos que MHA | Compute extra para re-projeção | DeepSeek v2/v3 (emergente) |
| Cache Quantization (FP8) | 2× menos que FP16 | Ruído mínimo em V, moderado em K | TensorRT-LLM, vLLM recente |
Perguntas e respostas
❓ KV Cache existe durante o treinamento?
❓ Quantizar o KV Cache ajuda?
❓ O que e sliding window attention?
O que voce aprendeu: KV Cache elimina recalculo redundante na geracao autorregressiva (O(n2) → O(n) por token). O custo e memoria VRAM — que pode superar o tamanho do modelo. GQA compartilha K/V entre cabecas (4x menos cache). Flash Attention reordena calculos para minimizar acessos a HBM (2-4x mais rapido). PagedAttention resolve fragmentacao em batch serving. Prompt Caching reutiliza o prefill entre requests. Proximo: como modelos com 1T+ parametros rodam sem carregar tudo na memoria — Mixture of Experts.
Perguntas frequentes
❓ Por que um modelo de 30 GB precisa de mais VRAM que isso?
❓ Como reduzir o consumo do cache de atenção?
❓ O cache de atenção é a mesma coisa que cache de prompt?
Fixando
Qual é a consequência prática do consumo de memória desse cache?
Como o cache se relaciona com o reaproveitamento de prefixo entre requisições?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…