Curso / Lição 06  ·  English →
Lição 06 · A memória de trabalho

O KV cache

Os pesos do modelo são fixos; o que cresce enquanto o modelo escreve é o KV cache — a memória de trabalho da geração. Ela guarda os estados de atenção (chave e valor) de cada token já visto, para o modelo não recomputar todo o passado a cada novo token. Esta lição mostra de onde vêm esses bytes, por que ela estoura a RAM no contexto longo, e o truque de atenção esparsa comprimida que faz o DeepSeek-V4 caber 1M de tokens onde um modelo normal não caberia.

0,5 MiB
por token em KV FP16 (regra de bolso)
128
janela deslizante crua do DS4 (tokens)
512
top-k de linhas comprimidas visíveis (indexador)
~26 GB
KV do DS4 num contexto de 1M tokens

01 · O que o KV cache realmente é

Quando o modelo gera o próximo token, a atenção precisa olhar para todos os tokens anteriores. Sem cache, ele recomputaria as projeções de chave (key) e valor (value) de toda a história a cada passo — trabalho quadrático e desperdiçado. O KV cache resolve isso guardando esses estados de atenção dos tokens passados, para que cada novo token só calcule o seu próprio K e V e leia o resto da memória.

O KV cache é a memória de trabalho do modelo durante a geração. Ele guarda os estados de atenção de chave/valor dos tokens anteriores para que o modelo não recompute a história a cada token.— Ahmad Osman, "LLMs 101 (2026)"

O custo é previsível. A regra de bolso do Ahmad: 0,5 MiB por token num KV em FP16. Isso escala linearmente com o comprimento do contexto — e é exatamente aí que mora o problema.

Memória de KV vs comprimento de contexto (FP16, ~0,5 MiB/token) memória KV (GiB) 0 8 16 24 0 4K 32K 256K 1M tokens teto da RAM — fora do gráfico ↑ modelo normal — linear, estoura 4K ≈ 2 GiB · 32K ≈ 16 GiB · 1M = impossível 4K, 2 GiB 32K, 16 GiB DeepSeek comprimido — achata 1M tokens ≈ 26 GiB (indexador ≈ 22) ≈26 GiB

A linha vermelha (atenção densa) cresce reto e sai do gráfico antes de 256K. A laranja (atenção esparsa comprimida do DS4) dobra e estabiliza perto de 26 GiB mesmo em 1M de tokens.

A fórmula dos bytes

O tamanho do KV não é mágica — é uma multiplicação. tokens × camadas × kv_heads × head_dim × precisão × 2 (o ×2 é porque guardamos K e V). Daí a regra de bolso: em FP16, isso dá ≈ 0,5 MiB por token. Multiplique pelo contexto: 4K ≈ 2 GiB, 32K ≈ 16 GiB. Cada alavanca da fórmula — menos kv_heads, menos precisão, menos linhas guardadas — é uma forma de cortar essa conta.

02 · Quantizar o KV — até onde dá

A primeira alavanca da fórmula é a precisão. Reduzir os bytes por número no cache derruba a memória direto. Mas, ao contrário de quantizar pesos, o KV é numericamente sensível — ele é a memória ativa da geração, e estragá-lo degrada a coerência na hora. O Ahmad dá os patamares práticos:

Precisão do KVStatusLeitura prática
FP16 / BF16Baseline limpoSem perda. É a referência da regra dos 0,5 MiB/token.
FP8 / INT8Piso práticoMetade da memória, qualidade aceitável. É até onde o usuário casual deve ir.
Sub-8-bit (KIVI, KVQuant)Território de pesquisaPesado, com métodos dedicados. Não é um botão casual de ligar.
FP16/BF16 é a baseline limpa; FP8/INT8 é o piso prático; abaixo de 8 bits é território de pesquisa (KIVI, KVQuant) — não um botão casual.— Ahmad Osman, "LLMs 101 (2026)"
Por que o KV é mais frágil que os pesos: os pesos são lidos; o KV é a história ativa. Um erro de quantização no cache se propaga por toda a sequência seguinte. Por isso o piso seguro é 8 bits — e ir mais fundo exige algoritmos como KIVI/KVQuant, não um simples flag.

03 · A outra alavanca — tipos de atenção

A fórmula tem um termo kv_heads. Quanto menos cabeças de KV, menor o cache — e essa é exatamente a ideia por trás das variantes de atenção. O modelo pode ter muitas cabeças de query mas compartilhar poucas cabeças de key/value.

cabeça de query (Q) cabeça de KV (memória) MHA multi-head — 1 KV por query Q1 Q2 Q3 Q4 KV1 KV2 KV3 KV4 4 KV — caro no contexto longo GQA grouped-query — KV por grupo Q1 Q2 Q3 Q4 KV1 KV2 2 KV — o meio-termo comum MQA multi-query — 1 KV compartilhada Q1 Q2 Q3 Q4 KV 1 KV — econômico em memória

Da esquerda para a direita, menos cabeças de KV: MHA (uma KV por query, cara em contexto longo), GQA (cabeças de query em grupos compartilhando uma KV cada), MQA (uma única KV para todas as queries, a mais eficiente em memória).

04 · O salto do DeepSeek-V4 — atenção esparsa comprimida

Quantizar e usar GQA cortam o KV por uma constante. Mas a curva ainda é linear no número de tokens — e em 1M de tokens nenhuma constante salva. O DeepSeek-V4 ataca o termo que importa de verdade: quantas linhas de KV cada camada guarda. A técnica é a Compressed Sparse Attention (CSA), e ela funciona por camada.

Cada camada mantém uma janela deslizante crua (raw) com os 128 tokens mais recentes — atenção densa e exata onde ela mais importa, no passado imediato. Tudo que é mais antigo que isso vira linhas comprimidas (compressed), e o quanto se comprime depende do tipo da camada.

Uma camada CSA (par, ≥2): janela crua + linhas comprimidas + indexador top-512 fluxo de tokens (passado → presente) janela crua (raw) últimos 128 tokens · densa histórico comprimido — 1 linha por 4 tokens (ratio-4) … milhares de linhas comprimidas … INDEXADOR 64 cabeças · head-dim 128 seleciona até 512 linhas visíveis token atual (query) olha a janela crua direto pergunta ao indexador resultado: o token vê os ≤512 trechos antigos mais relevantes + os 128 recentes crus

A janela crua dá precisão no passado imediato; o indexador (64 cabeças, head-dim 128) faz uma busca esparsa no histórico comprimido e devolve só as 512 linhas mais relevantes — em vez de atender a milhões de tokens, a camada atende a centenas.

O insight central: contexto longo não exige olhar tudo o tempo todo. Quase todo token só depende do passado imediato (a janela crua) mais alguns trechos distantes específicos (o que o indexador pesca). A CSA codifica essa intuição direto na arquitetura.

05 · O padrão das 43 camadas

A CSA não é uniforme. O DS4 tem 43 camadas, e o tipo de cada uma alterna num padrão fixo. As duas primeiras camadas são cruas e simples; depois, camadas pares e ímpares se especializam — uma agressiva no detalhe, outra agressiva na compressão.

As 43 camadas do DeepSeek-V4, por tipo de CSA camadas 0–1 · só janela crua par ≥2 · ratio-4 + indexador ímpar ≥3 · ratio-128 (sem indexador) 0 1 2 3 42 par = guarda muito (1 linha / 4 tokens) e busca · ímpar = guarda pouco (1 linha / 128 tokens) o par caro e o ímpar barato se alternam — detalhe e compressão dividindo a profundidade
CamadaTipo CSARatio de compressãoIndexador?
0 e 1Só janela cruaNão
Pares a partir de 2 (2, 4, 6 …)Comprimida + buscaratio-4 (1 linha por 4 tokens)Sim — seleciona até 512 linhas
Ímpares a partir de 3 (3, 5, 7 …)Comprimida agressivaratio-128 (1 linha por 128 tokens)Não
Constantes fixas da CSA (do MODEL_CARD do DS4)

43 camadas · janela crua de 128 tokens · indexador com 64 cabeças · head-dim do indexador 128 · top-k do indexador 512. Camadas pares ≥2 usam ratio-4 com indexador; ímpares ≥3 usam ratio-128 sem indexador.

06 · O resultado — 1M de contexto em ~26 GB

Junte tudo e a conta fecha onde a atenção densa nunca fecharia. Segundo o README do DS4 (antirez), o KV de um contexto completo de 1M de tokens ocupa ≈ 26 GB de memória — e o indexador comprimido sozinho responde por ≈ 22 GB disso. É a curva laranja do primeiro diagrama, agora em números fechados.

Memória num contexto de 1M de tokens (à escala — 6,4 px/GB sobre 128 GB) 0 32 64 96 128 GB Pesos do DeepSeek-V4 q2 81 GB · pesos residentes + KV do contexto de 1M (≈ 26 GB) indexador ≈ 22 GB +4 outros KV total ≈107 GB teto 128 GB folga ≈21 GB Referência: KV denso (≈0,5 MiB/token) para 1M de tokens estouraria o gráfico → centenas de GB — impossível em 128 GB (é o que a CSA evita)

Os 81 GB de pesos mais os ~26 GB de KV (dos quais ~22 GB são o indexador) somam ~107 GB — cabe nos 128 GB, mas raspando a folga que a Lição 08 vai exigir.

Um contexto completo de 1M de tokens consome cerca de 26 GB de memória; só o indexador comprimido responde por ~22 GB. Com 128 GB rodando os 81 GB de pesos q2, um contexto de 100–300k é a escolha mais sábia.— antirez, README do DeepSeek-V4 (DS4)
A escolha prática: 1M de tokens é possível, não confortável. Rodar o q2 (81 GB) e ainda reservar ~26 GB para o KV de 1M deixa o sistema sem margem. Por isso a recomendação do antirez é mirar 100–300k de contexto — fração do KV, folga preservada, e ainda muito além do que um modelo denso entregaria.

07 · Fechando o raciocínio

O KV cache é a peça que transforma "quantos tokens cabem" numa conta de RAM concreta. Três alavancas o controlam, em ordem de impacto:

É por isso que o DeepSeek-V4 cabe 1M de tokens em ~26 GB onde um modelo denso precisaria de muito mais e simplesmente não caberia. A próxima lição mostra como esse modelo concreto roda no seu Mac.

1. Por que o KV cache existe — qual problema ele resolve na geração?
Correto: b. O KV cache é a memória de trabalho da geração: cada token novo só calcula o próprio K/V e lê o resto do cache, evitando recomputar o passado. Custo de bolso: ~0,5 MiB/token em FP16 (4K ≈ 2 GiB, 32K ≈ 16 GiB).
2. Na CSA do DeepSeek-V4, o que faz uma camada PAR a partir da 2 conseguir contexto longo sem guardar tudo?
Correto: c. A camada par ≥2 combina janela crua de 128 (densa, recente) + linhas comprimidas ratio-4 + indexador top-512 (busca esparsa no histórico). As ímpares ≥3 vão mais agressivas: ratio-128 e sem indexador. Resultado: 1M de tokens ≈ 26 GB de KV (indexador ≈ 22 GB).