Se você ainda armazena o KV‑cache de atenção em FP16, está queimando dinheiro. Com a oferta de GPU apertada e janelas de contexto inflando, o cache é a sua conta de verdade, não os pesos. A boa notícia: a quantização do KV‑cache (8‑bit e até 4‑bit) está madura em 2026 para ir a produção — se você fizer isso de forma deliberada.
O sinal de hoje: engenheiros da Huawei acabaram de abrir o KVarN, um backend nativo do vLLM para quantização de KV‑cache. Enquanto isso, o TensorRT‑LLM da NVIDIA estabilizou os caminhos de KV em INT8, e o llama.cpp oferece opções práticas de quantização de KV há meses. As manchetes sobre a capacidade da TSMC lembram por que isso importa: cada 2–4x a mais de contexto que você consegue encaixar por instância de GPU é dinheiro real e latência real economizados.
Por que é o KV‑cache, e não os pesos, que está destruindo seu orçamento
O KV‑cache escala com o comprimento do contexto L, não apenas com o tamanho do modelo. Para um modelo mental concreto, pegue o Llama‑3 8B: 32 camadas, 32 cabeças, head_dim 128. Por token, por camada, o cache armazena K e V: 2 × cabeças × head_dim × tamanho_do_dtype.
- Por token por camada em FP16: 2 × 32 × 128 × 2 bytes = 16 KB
- Ao longo de 32 camadas: ~512 KB por token
- 8K tokens de histórico: ~4 GB de memória só para KV
- 32K tokens: ~16 GB para KV — antes de pesos, estado do otimizador (para finetuning) ou qualquer outra coisa
Agora, quantize o cache:
- KV em INT8: cai pela metade para ~256 KB/token (2× mais capacidade ou 2× mais contexto)
- KV em INT4: cai a um quarto para ~128 KB/token (4× mais capacidade)
Em servidores reais, esses multiplicadores se traduzem em menos falhas de página, menos troca de páginas de cache, maiores tamanhos de lote efetivos e latências de cauda menores. Em nossos deploys, migrar para KV em INT8 entregou 1,3–1,7× tokens/s em contextos de 16–32K em classes A100 e H100 e eliminou retries por OOM que estavam silenciosamente detonando os p99.
O que quebra quando você quantiza o KV (e como não ligar)
Quantizar o KV‑cache não muda os pesos do modelo. Você está comprimindo as chaves e valores de atenção — a memória de ativações efêmera usada pelo mecanismo de atenção. O impacto é sutil, mas real:
- Desvio de qualidade em recuperação de contexto extremo: Se seu produto depende de citações precisas de longo alcance (pense em documentos RAG de 100+ páginas), INT4 pode deslocar as distribuições de atenção o suficiente para inserir ou remover citações no limite. INT8 costuma ser seguro; INT4 requer escalas cuidadosas por cabeça ou por tile.
- Kernels extras no hot path: Quantização e desquantização adicionam FLOPs. Para prompts curtos e conversas de ida e volta com históricos pequenos, você pode ver uma pequena regressão de p50. Prompts longos e workloads multi‑tenant ainda saem ganhando porque a pressão de memória domina.
- As características de batching mudam: Schedulers como o PagedAttention do vLLM ou o KV paginado do TensorRT‑LLM ficam muito mais tolerantes. Isso é bom, mas pode mascarar má higiene de prompt. Limpe seus templates de qualquer forma.
Tradução: se seu workload é de contexto curto, single‑tenant e sensível a latência em p50, você pode manter o KV em FP16/FP8. Se seu workload é de contexto longo, multi‑tenant ou limitado por custo, adote INT8 agora; pilote INT4 com guardrails.
Framework de decisão: você deve enviar quantização de KV‑cache?
1) Meça seu mix de comprimentos de contexto
- Se 30%+ dos pedidos excedem 8K tokens (prompt + histórico), KV em INT8 é quase uma vitória certa.
- Se 10%+ excedem 16K tokens, avalie KV em INT4 para evitar upgrades de classe de GPU para essas caudas.
- Meça a realidade, não as configurações. Rotineiramente vemos sistemas com “8K máx.” empurrando 12–20K de históricos efetivos por causa de inchaço de prompt e transcrições de tool calls.
2) Mapeie seus SLOs
- SLOs rígidos de p50 em chat (≤150 ms/token): Fique em KV INT8 primeiro. O overhead de quant‑dequant geralmente fica em 5–10 ms/token; os ganhos em contextos longos compensam.
- SLOs duros de throughput em p99 ou limites de custo: INT8 e depois INT4. Cortar falhas de página e retries por OOM derruba as caudas.
3) Faça o inventário do seu stack de inferência
- vLLM: Scheduler maduro, ótimo batching. Base já suporta KV paginado; KVarN (Huawei) traz backends nativos de quantização de KV. Se você tolera um módulo bleeding‑edge por 20–30% de ganho de memória em cima de paged attention, comece aqui.
- TensorRT‑LLM: KV em INT8 em nível de produção com escalas por tile e kernels fundidos; melhor quando você já roda o stack da NVIDIA e quer caminhos totalmente acelerados.
- llama.cpp / MLC: Inferência “commodity” em 4090s e laptops. As opções de quant de KV são pragmáticas e testadas em batalha para local/borda. Ótimo para topologias híbridas e agentes near‑edge.
4) Escolha um esquema de quantização que você consiga explicar
- Escalonamento dinâmico por cabeça: Mais seguro para acurácia, um pouco mais de compute. Bom padrão para KV em INT8.
- Escalonamento por tile/grupo (por exemplo, tamanho de grupo 32–128): Mais rápido, mais comprimível; INT4 precisa disso. Teste o tamanho do grupo: grande demais aumenta o erro, pequeno demais prejudica a velocidade.
- Escalonamento em domínio logarítmico para o cache K: Keys são mais sensíveis que Values; um esquema log ou de precisão mista para K e um mais agressivo para V pode equilibrar estabilidade e economia.
A matemática que você precisa para dimensionar GPUs pós‑quantização
Você não precisa de simulador. Use contas de guardanapo com 10–15% de folga para fragmentação:
- Calcule o KV por token em FP16 para seu modelo: ~512 KB/token para Llama‑3 8B, ~1 MB/token para classe 70B.
- Aplique seu fator de quant: ×0,5 para INT8, ×0,25 para INT4.
- Multiplique pelo máximo esperado de tokens vivos (prompt + histórico + rascunho de decodificação especulativa, se usado).
- Some pesos + margem de ativações: pesos de 8B ~16 GB em FP16, ~8–10 GB com weight‑only INT8/AWQ; modelos maiores escalam de forma semelhante.
- Deixe 10–15% livre para evitar thrashing do alocador sob burst.
Exemplo: Llama‑3 8B de chat com 24K tokens vivos, KV em INT8. KV ≈ 24.000 × 256 KB ≈ 6,1 GB. Some 10 GB para pesos, 2 GB para diversos, 15% de margem: alvo ≈ 21 GB. Uma placa de 24 GB fica confortável; com KV em FP16, você estaria flertando com OOMs.
Guia de implementação: 30 dias até produção
Semana 1: Instrumente, estabeleça baseline e decida INT8 vs INT4
- Instrumentação: Adicione comprimento de contexto efetivo por requisição, tokens/s e telemetria de memória (uso do alocador, páginas de KV ativas). Exponha isso como métricas do tipo gauge no Prometheus para seu banco de séries temporais.
- Execuções de baseline: 2–3 dias de snapshots de tráfego. Registre latência p50/p95/p99, taxa de OOM/retry e folga de memória de GPU nos horários de pico.
- Decisão: Se ≥30% do tráfego é 8K+, mire INT8. Se ≥10% é 16K+, pilote INT4 por trás de um kill switch.
Semana 2: Levante um caminho em paralelo
- Caminho com vLLM: Suba um pool canário com vLLM + KVarN ou KV INT8 upstream se disponível para sua família de modelos. Garanta que o paged attention esteja ativado. Para llama.cpp, habilite as flags de kv‑quant em um pool irmão de 4090s para comparação realista.
- Caminho com TensorRT‑LLM: Se você se padronizou no stack da NVIDIA, habilite KV em INT8 com escalonamento por tile e construa planos de engine por bucket de comprimento de sequência (por exemplo, ≤8K, ≤16K, ≤32K) para evitar kernels excessivamente generalistas.
- Shadowing de tráfego: Espelhe 5–10% das requisições de produção para o canário, remova PII (dados pessoais) e registre saídas para avaliação offline. Não cobre em duplicidade dos usuários ainda.
Semana 3: Avalie qualidade e caudas
- Avaliação offline: Use seus próprios prompts. Rankings públicos não dirão se seu bot de análise de contratos perdeu uma citação de cláusula. Construa um conjunto de 1–2K exemplos: RAG longo, tool‑calls, múltiplos turnos, testes de jailbreak. Meça correspondência exata, correção de citações e acurácia de chamadas de ferramentas.
- Análise de latência: Espere uma pequena regressão de p50 em prompts curtos, mas uma melhora significativa de p95/p99 em contextos longos. Procure por retries por OOM caindo a quase zero.
- Guardrails: Se INT4 desviar em citações de longo alcance, adote uma política dupla: INT4 para ≤16K e INT8 para 16–32K, ou faça fallback para FP16 via heurística por requisição (veja abaixo).
Semana 4: Faça o rollout com controles reversíveis
- Fallback heurístico: Compute entropia de atenção ou um proxy mais barato (por exemplo, novidade de segmentos de origem no RAG). Para sequências com atenção incomumente “pontuda”, roteie para INT8/FP16.
- Kill switch: Feature flag de quantização de KV no roteador. Um toggle para reverter uma coorte para FP16.
- Rampa gradual: 10% → 25% → 50% → 100% ao longo de 5–7 dias, monitorando os deltas em relação ao baseline da Semana 1.
Detalhes de engenharia que separam vitórias de regressões
Agrupe comprimentos de sequência em buckets
Não deixe um único pedido de 28K tokens envenenar suas escolhas de kernel para 99% do tráfego de 6–12K. Mantenha planos de engine ou pools do vLLM separados por bucket de comprimento (por exemplo, ≤8K, ≤16K, ≤32K). Isso eleva a utilização e mantém as operações de desquantização enxutas.
Quantize K e V de forma diferente
Keys são mais sensíveis que Values. Receita prática:
- K em INT8 com escala dinâmica por cabeça para preservar a endereçabilidade de tokens de longo alcance.
- V em INT4 com escalas por tile (grupo 64) para maximizar cortes de memória com impacto mínimo na reconstrução.
Vários stacks permitem especificar parâmetros de quant diferentes para K e V. Se o seu não permitir, fique em INT8 no geral por segurança.
Decodificação especulativa e quantização de KV
Spec‑decode cria KV de rascunho extra. Com KV em INT8/INT4, o buffer de rascunho não explode mais a memória, o que frequentemente destrava decodificação especulativa onde antes era impossível. Observe interações: se o modelo rascunho satura os SMs, os kernels extras de quant podem competir com o modelo alvo. Alocar rascunho e alvo em slices de MIG diferentes se você tiver H100s.
Observabilidade e alertas
- Páginas de KV ativas e taxa de falhas de página: se isso não cair após a quantização, você não está realmente usando os novos kernels, ou seu scheduler está mal “bucketizado”.
- Retries por OOM: devem ir a quase zero fora de sobrecarga real.
- Tokens/s e tamanho de batch: espere 1,3–1,7× em contextos longos com INT8; INT4 pode adicionar mais 10–20% se os kernels estiverem bem fundidos.
- Latência p99: deve melhorar materialmente sob carga de contexto longo. Se não, seu mix de tráfego é dominado por contexto curto — considere condicionar a quantização por comprimento.
Realidades de fornecedores e frameworks em meados de 2026
- vLLM + KVarN (Huawei): Traz quantização nativa de KV para o scheduler em que a comunidade já confia. É open, mas jovem — teste burn‑in sob pico por uma semana antes do rollout completo. Espere iteração rápida.
- TensorRT‑LLM: Se sua frota é NVIDIA de ponta a ponta, este é o caminho mais seguro para KV em INT8 com kernels fundidos e performance previsível. Builds de engine por bucket são chatos, mas valem a pena.
- llama.cpp / MLC: Se você roda near‑edge (ferramentas para creators, dispositivos de campo, laptops de vendas), a quantização de KV é a diferença entre “funciona em 8K” e “funciona em 32K”. Não ignore energia e térmica: KV quantizado reduz consumo sustentado e throttling.
- Provedores de nuvem: Endpoints gerenciados de LLM raramente expõem controles de quantização de KV. Se você está alugando, pergunte diretamente sobre formatos de KV e paging. Se não souberem responder, assuma que você está pagando o imposto do FP16.
Considerações de segurança e correção
- Determinismo: Kernels de quant podem mudar caminhos numéricos e seeds aleatórias. Se você depende de saídas totalmente determinísticas (arquivos de conformidade), fixe seeds e rode A/B para certificar limites de drift.
- Auditabilidade: Registre o regime de quant de KV (INT8/INT4, escalas, tamanho de grupo) com a versão do modelo na sua proveniência de inferência. Se um cliente contestar uma resposta, você vai querer saber o regime numérico exato.
- Prompts adversariais: Alguns jailbreaks exploram descontinuidades nas probabilidades de tokens; pequenas perturbações na atenção podem importar. Reexecute seu pacote de red team após habilitar INT4; você frequentemente encontrará robustez similar ou melhor graças a menos fallbacks por OOM — mas verifique.
Modelo de custos: quanto você realmente economiza?
Pense em horas de GPU e SLOs não violados, não apenas em contagem de placas.
- Ganho de capacidade: KV em INT8 tipicamente dobra suas sessões concorrentes ou seu comprimento de contexto utilizável por GPU. Se você roda 8 A100s a 70% de utilização para chat + RAG, frequentemente pode consolidar para 5–6 com caudas melhores.
- Colapso da cauda: Eliminar retries e reinícios por OOM frequentemente economiza 5–10% do tempo total de GPU que era invisível nas métricas de p50, mas dolorosamente presente na fatura.
- Adiamento de hardware: Se TSMC e OEMs não conseguem te entregar mais H100s no próximo trimestre, KV em INT8/INT4 é a alavanca limpa de 2–4× que você controla hoje.
Objeções comuns — e por que geralmente estão erradas
- “Vamos perder qualidade.” Com KV em INT8 e escalas por cabeça, a maioria dos workloads mostra desvio negligenciável em avaliações internas. INT4 requer guardrails sensíveis ao workload, mas é viável para tarefas sem citação e agentes com muitas tool‑calls.
- “É complexidade demais.” Você já opera quant de pesos, paged attention e decodificação especulativa. Quant de KV é mais uma configuração, não um projeto de pesquisa. Envie atrás de uma flag e observe.
- “Endpoints de nuvem não suportam isso.” Isso é um argumento para rodar sua própria inferência onde importa, ou para pedir ao seu fornecedor que exponha formatos de KV. Caso contrário, você pagará o imposto do FP16 para sempre.
Uma nota sobre equipe e execução
Você não precisa de um laboratório de pesquisa para isso. Você precisa de:
- Um engenheiro de infra para ligar telemetria e autoescalonamento por bucket de comprimento.
- Um engenheiro de ML para escolher parâmetros de quant e rodar o harness de avaliação.
- Um SRE para conduzir o canário e o plano de rollback.
Em equipe distribuída, já vimos isso ser entregue em 3–4 semanas com redução de 20–35% em horas de GPU para produtos de contexto longo. O pré‑requisito é disciplina: medir, canariar, ramp up e manter o kill switch visível.
A aposta
A quantização do KV‑cache é a rara alavanca de inferência de 2026 que melhora custo e confiabilidade sem re‑treinar modelos ou reescrever seu produto. Com trabalhos abertos como KVarN orbitando o vLLM e stacks de fornecedores como TensorRT‑LLM já estáveis em INT8, o ecossistema está claramente se movendo. Sua escolha é simples: adote no seu timing — ou adote quando a dor de capacidade te forçar.
Principais pontos
- KV‑cache, não os pesos, domina a memória em contextos longos; KV em FP16 custa ~512 KB/token em modelos classe 8B.
- KV em INT8 reduz a memória pela metade; INT4 reduz a um quarto — frequentemente rendendo 1,3–1,7× tokens/s em contextos de 16–32K e derrubando caudas p99.
- Adote INT8 agora para a maioria dos workloads; pilote INT4 com escalonamento por tile e guardrails para tarefas com citações de longo alcance.
- Use vLLM (com KVarN), TensorRT‑LLM ou llama.cpp; faça buckets por comprimento de sequência e registre seu regime de quant para auditabilidade.
- Envie em 30 dias: instrumente, canarie, avalie com seus prompts, faça ramp up atrás de um kill switch.
Author: Diogo Hudson Dias