KV Cache: Memoria Eficiente
- ⬜⚙️ 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.
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.
Para N tokens: calcula exatamente N pares K/V — custo O(N) em vez de O(N²).
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 |
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.
| 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?
Quiz rápido
4 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito