Inferência

KV-Cache

KV-Cache (Cache de Chave-Valor) é um buffer de memória que armazena os tensores de chave (key) e valor (value) produzidos pelas camadas de atenção de um transformer para tokens já processados, eliminando recomputação redundante durante geração autorregressiva. É o mecanismo principal que torna a geração por token de LLM prática em latência de produção.

No mecanismo de atenção multi-cabeça de um transformer, cada token de entrada produz três vetores: uma query (Q), uma chave (K) e um valor (V). Durante geração autorregressiva — onde o modelo emite um token por vez — a query de cada novo token deve atender sobre as chaves e valores de todos os tokens anteriores. Sem cache, esses tensores de K e V seriam recomputados do zero a cada passo de geração, causando custo de inferência escalar quadraticamente com o comprimento da sequência. O KV-cache armazena tensores de K e V computados em memória GPU ou CPU para que cada par seja computado exatamente uma vez e reutilizado para todos os passos de geração subsequentes.

No início de uma requisição de geração, o modelo executa uma fase de "prefill": o prompt de entrada inteiro é processado em uma única passagem para frente paralela e os tensores de K e V resultantes para cada token do prompt são escritos no cache. A subsequente fase de "decode" processa um novo token por passo; cada passo lê o KV-cache completo para computar atenção e anexa a entrada própria K/V do novo token ao cache. O tamanho do cache escala como O(num_layers × num_key_value_heads × head_dim × sequence_length), atingindo dezenas de gigabytes para contextos longos em modelos grandes, tornando a capacidade de memória GPU uma restrição primária no serving de produção.

Sem um KV-cache, o custo de decode por token cresceria como O(n) porque a sequência inteira em crescimento seria reprocessada a cada passo. Com o cache, cada passo de decode é O(1) em computação (excluindo largura de banda de memória), mantendo a latência aproximadamente constante independentemente de quantos tokens já foram gerados. O KV-cache também permite otimizações avançadas de serving: PagedAttention do vLLM (2023) aplica paginação de memória virtual ao armazenamento de KV-cache para eliminar fragmentação e suportar tamanhos de batch concorrentes maiores; decodificação especulativa utiliza um KV-cache compartilhado entre um modelo de draft pequeno e um verificador grande para aumentar throughput efetivo.

A partir de 2026, o gerenciamento de KV-cache é um foco central da engenharia de inferência de LLM. Quantizar tensores de KV-cache para INT8 ou INT4 (independentemente de quantização de peso) é prática padrão em pilhas de serving de produção incluindo vLLM, TensorRT-LLM e SGLang, aproximadamente reduzindo pela metade o uso de memória de ativações em cache. Flash Attention 2 e 3 reduzem o custo de largura de banda de memória de ler e escrever o cache. Pesquisa em offloading de cache (derramando tensores para CPU ou NVMe quando memória GPU é esgotada) e compressão de cache (Infini-Attention, evicção de token H2O) está ativa, mirando em deployments onde o comprimento do contexto excede memória GPU disponível.

Exemplo

Ao gerar uma resposta de 500-token para um prompt de 4.000-token, o KV-cache armazena todos os tensores de chave e valor para os 4.000 tokens do prompt após uma única passagem de prefill; cada um dos 500 passos de decode então lê o cache em vez de reprocessar o prompt, reduzindo a latência por token por aproximadamente uma ordem de magnitude comparado à inferência sem cache.

Termos relacionados

Últimas notícias sobre o tema

← Glossário