Fronteira

Dimensionamento do KV cache e orçamentos de memória

Um acelerador de 80 GB orçado linha a linha para o Qwen3.8-27B: pesos, reserva de runtime, o pool de key-value a 64 KiB por token, os 144 MiB de estado matricial DeltaNet em float32 por sequência na referência e o orçamento refeito em FP8.

Atualizada em

01 · Conceito

Conceito

Você tem um acelerador de 80 GB e quer servir o Qwen3.8-27B com janelas de 8.192 tokens. Alguém subtrai 54 dos pesos de 80, divide o restante pelos 64 KiB por token da lição 7.2 e reporta 48 usuários. O resultado calculado é 36: a estimativa ingênua fica um terço acima, e o modo de falha é um crash por falta de memória sob carga. Esta lição faz o orçamento linha a linha porque tudo o que vem depois é precificado contra ele.

Comece pela capacidade utilizável, e não pela capacidade de folheto. Uma peça vendida como 80 GB carrega HBM da classe 80 GiB e reporta aproximadamente 79,6 GiB ao runtime depois que ECC e regiões reservadas de firmware são descontadas, então o número que você consegue de fato alocar é menor que o número na caixa. Fazer o orçamento inteiro numa única família de unidades é a única defesa, então converta tudo para gibibytes e permaneça ali. Os pesos em bf16, cerca de 54 GB pelo número canônico, são 50,3 GiB. Em seguida vem uma linha que a subtração ingênua omite por completo: a reserva de runtime. O contexto do driver, buffers de ativação para o maior batch que você pretende rodar, workspace temporário para os kernels de attention e de feed-forward, e a fragmentação do alocador consomem juntos vários gibibytes antes que exista um único token de cache. Seis gibibytes é um número ilustrativo e nada generoso; frameworks de serving codificam a mesma ideia como uma fração de utilização, retendo por padrão cerca de um décimo do dispositivo. O restante é o pool:

79.6 GiB50.3 GiB6 GiB = 23.3 GiB = 23,859 MiB.79.6\ \text{GiB} - 50.3\ \text{GiB} - 6\ \text{GiB} \ =\ 23.3\ \text{GiB} \ =\ 23{,}859\ \text{MiB}.

Agora precifique uma sequência, e precifique-a por completo. A lição 7.2 derivou o cache em 4 KiB por token por camada que faz cache, 64 KiB por token através das 16 camadas de full attention, e essa derivação não se repete aqui. Uma conversa de 8.192 tokens, portanto, guarda

  1. Pesos, bfloat1654 GB · fixo
  2. Cache KV, uma sequência de contexto completo16 GiB · cresce por token
  3. Estado recorrente DeltaNet~144 MiB · constante
  4. Ativações, fragmentação, runtimereserva, nunca zero
O que ocupa um aceleradorOs pesos são fixos no momento em que você escolhe a precisão. Todo o restante decide quantas sequências simultâneas cabem, e o cache KV é a única parte que cresce a cada token gerado.Derivado na aula 7.2-the-kv-cache
8,192 tokens×64 KiB = 524,288 KiB = 512 MiB8{,}192\ \text{tokens} \times 64\ \text{KiB} \ =\ 524{,}288\ \text{KiB} \ =\ 512\ \text{MiB}

de keys e values. Mas as 48 camadas de Gated DeltaNet também não são de graça. Na referência do Transformers, cada uma mantém um estado matricial de 3 MiB em float32, totalizando 144 MiB sem o pequeno estado de convolução. Esse estado pertence à sequência, não ao modelo. Cada conversa carrega uma cópia. O custo real é 512 mais 144, ou 656 MiB, e o pool comporta

23,859 MiB656 MiB  36 sequeˆncias concorrentes.\frac{23{,}859\ \text{MiB}}{656\ \text{MiB}} \ \approx\ 36\ \text{sequências concorrentes}.

Trinta e seis, não quarenta e oito. As três correções são a conversão de unidades, a reserva de runtime e o estado recorrente constante.

Empurre o mesmo pool ao outro extremo. Uma sequência de 262.144 tokens guarda 16.384 MiB de K/V mais 144 MiB de estado matricial, então o pool comporta uma. Em 32.768 tokens, cada sequência custa 2.048 mais 144, ou 2.192 MiB, e a placa serve dez. A concorrência é função do comprimento de contexto prometido.

Refaça o orçamento com pesos em FP8 e cache em FP8. Os pesos caem para cerca de 27 GB, ou 25,15 GiB, e o cache para 32 KiB por token. O pool passa a 49.613 MiB. Cada sequência de 8.192 tokens custa 256 MiB de cache mais os 144 MiB inalterados do estado da referência, 400 MiB no total, então a placa serve

49,613 MiB400 MiB  124 sequeˆncias concorrentes,\frac{49{,}613\ \text{MiB}}{400\ \text{MiB}} \ \approx\ 124\ \text{sequências concorrentes},

e cinco conversas em contexto nativo completo. Isso é um ganho de aproximadamente 3,4 vezes nessa mudança combinada de precisão.

Omitir o estado DeltaNet prevê 46 sequências em bf16 em vez de 36, cerca de 28 por cento a mais, e 193 em FP8 em vez de 124, cerca de 56 por cento a mais. O estado é constante, então seu peso relativo cresce quando os termos variáveis encolhem; muitas cópias de 144 MiB viram uma linha relevante do orçamento.

Leve dois hábitos desta lição. Orce numa única família de unidades, e precifique uma sequência por completo em vez de precificar apenas o cache dela. A lição 9.4 muda a linha de capacidade mudando o silício, e a lição 9.10 transforma esses números de ocupação em custo por token.

02 · Analogia

Analogia

Um caminhão de mudanças tem capacidade declarada, mas o espaço utilizável é o que sobra depois da plataforma elevatória, das cintas, dos cobertores e da caixa de ferramentas do motorista. Um plano de carga que parte do número do folheto termina com móvel na calçada. Um orçamento de memória é o mesmo exercício: o folheto diz 80 GB, os pesos são o piano, a reserva de runtime é a caixa de ferramentas que ninguém contou, e cada passageiro extra traz uma bagagem que escala com a viagem e uma sacola que não escala.

03 · Laboratório

Laboratório

Pesos50,3 GiB
Pool de KV23,3 GiB
Por sequência2.192 MiB
Sequências simultâneas10

Cabe, com folga.

KV fixo em 64 KiB por token (16 camadas de attention, lição 7.2) mais 144 MiB de estado Gated DeltaNet por sequência, constante no comprimento.

04 · Explique de volta

Explique de volta

Orce um acelerador de 80 GB para o Qwen3.8-27B linha a linha e diga quantas conversas de 8.192 tokens ele serve simultaneamente, depois refaça o orçamento com pesos em FP8 e cache em FP8.

Mínimo: 80 caracteres e 15 palavras. Seu texto fica somente neste navegador.

Aguardando sua explicação.

Comparar com uma resposta-modelo

Uma peça de 80 GB reporta aproximadamente 79,6 GiB utilizáveis. Os pesos em bf16 são cerca de 54 GB, ou 50,3 GiB, e uma reserva de runtime de 6 GiB deixa cerca de 23,3 GiB, ou 23.859 MiB, como pool de estado. A lição 7.2 derivou 64 KiB por token, então uma conversa de 8.192 tokens guarda 512 MiB de cache; o estado matricial DeltaNet da referência em float32 acrescenta 144 MiB, dando 656 MiB por sequência e 36 conversas concorrentes. Uma sequência completa precisa de 16.384 MiB de cache mais 144 MiB, então só cabe uma. Com pesos em FP8 e cache em FP8 a 32 KiB por token, o pool cresce para 49.613 MiB e cada sequência de 8.192 tokens custa 256 mais 144, ou 400 MiB, dando 124 conversas concorrentes e cinco sequências de contexto completo.

05 · Teste seu entendimento

Teste seu entendimento

01Num acelerador de 80 GB rodando o Qwen3.8-27B em bf16, por que a estimativa ingênua de 48 conversas concorrentes de 8.192 tokens supera o resultado calculado de 36?
Resposta e explicação

Ela conta 80 GB como totalmente utilizáveis, ignora a reserva de runtime e omite os 144 MiB de estado matricial DeltaNet em float32 que cada sequência carrega na referência — Capacidade de folheto não é capacidade utilizável, o runtime precisa de vários gibibytes antes de qualquer cache ser alocado, e o estado recorrente constante por sequência é memória real que a aritmética de KV sozinha nunca mostra.

02A lição 7.2 derivou o cache do Qwen3.8-27B como 64 KiB por token em vez de 256 KiB. Qual fato arquitetural produz o número menor?
Resposta e explicação

Só as 16 camadas de full attention fazem cache de keys e values; as outras 48 camadas de Gated DeltaNet mantêm estado de tamanho fixo — Assumir que todas as 64 camadas fazem cache quadruplica a estimativa; o layout híbrido significa que três quartos da profundidade não contribuem com cache por token algum.

03Mudar para pesos em FP8 e cache em FP8 eleva a concorrência de 36 para 124 sequências. O que acontece com a fatia do orçamento tomada pelo estado do DeltaNet?
Resposta e explicação

Ela sobe, porque os 144 MiB constantes da referência permanecem fixos enquanto tudo à volta encolhe — Ignorar o estado superestima a concorrência em bf16 em cerca de 28 por cento, mas a concorrência em FP8 em cerca de 56 por cento; um termo constante ganha importância relativa conforme os termos variáveis encolhem.

Conclua o teach-back e acerte o quiz para finalizar a aula.

◎ · Marcador de evidência

Fontes

  1. Woosuk Kwon et al. (2023). Efficient Memory Management for Large Language Model Serving with PagedAttention.
  2. vLLM Project (2026). vLLM Documentation.
  3. Qwen Team (2026). Qwen3.8-27B Model Card.