Qwen3.6 27B: quanta VRAM ele precisa de verdade
Um modelo de 27B que gasta metade do KV cache de um Llama 3 8B. A arquitetura híbrida quebra a conta usual — e decide, por menos de 1 GB, quais placas ficam de fora.
Com pressa? Peça o TL;DR ao Claude — ele lê a página e resume.
O Qwen3.6 27B saiu em abril de 2026 como modelo denso, licença Apache 2.0, 262 mil tokens de contexto nativo e entrada multimodal. Denso de 27B costuma significar “esquece, não cabe na sua placa”.
Só que ao abrir o config.json dele a conta não fecha do jeito esperado. Ele gasta metade do KV cache de um Llama 3 8B — um modelo três vezes e meia menor.
O motivo está numa linha da configuração que quase ninguém lê.
Qwen3.6-27B · do config.json oficial
- Parâmetros
- 27,8 B (denso)
- Camadas
- 64
- Atenção plena
- apenas 16 delas
- Cabeças KV
- 4 (GQA 24:4)
- Dimensão da cabeça
- 256
- Contexto nativo
- 262.144 tokens
A linha que muda tudo
No config.json, entre as chaves comuns, está esta:
"full_attention_interval": 4,
"layer_types": ["linear_attention", "linear_attention", "linear_attention", "full_attention", ...]
O modelo tem 64 camadas, mas só uma a cada quatro usa atenção plena. As outras 48 usam atenção linear.
Essa distinção é a coisa mais importante deste post, porque as duas se comportam de maneira oposta na memória:
- Atenção plena guarda um par chave/valor por token, em cada camada. É o KV cache, e ele cresce sem parar conforme a conversa anda.
- Atenção linear mantém um estado de tamanho fixo, comprimindo o passado num resumo de dimensão constante. Dobre o contexto e esse estado não muda de tamanho.
Ou seja: 48 das 64 camadas simplesmente não participam do crescimento de memória. Quem aplicar a fórmula usual — a do post anterior sobre VRAM — sobre as 64 camadas vai errar por um fator de quatro.
O KV cache real
A fórmula continua a mesma, mudando apenas quantas camadas entram nela:
bytes por token = 2 × camadas_de_atenção_plena × cabeças_kv × dim_cabeça × bytes
2 × 16 × 4 × 256 × 2 = 65.536 bytes = 64 KiB por token
Sessenta e quatro KiB. Para comparar, com a mesma matemática:
| Modelo | Camadas com KV | KiB/token | 128k de contexto (GB) |
|---|---|---|---|
| Llama 3 8B | 32 de 32 | 128 | 17,18 |
| Qwen3.6 27B (real) | 16 de 64 | 64 | 8,59 |
| Qwen3.6 27B se fosse denso | 64 de 64 | 256 | 34,36 |
Um modelo de 27 bilhões de parâmetros com metade do custo de contexto de um de 8 bilhões. É contraintuitivo, e é a razão pela qual esse modelo cabe onde não deveria caber.
Os pesos
Com 27,8 bilhões de parâmetros:
| Quantização | Pesos (GB) |
|---|---|
| BF16 | 55,6 |
| Q8_0 | 29,5 |
| Q6_K | 22,9 |
| Q5_K_M | 19,8 |
| Q4_K_M | 17,0 |
Cabe na sua placa?
Aqui a conta encontra o hardware. Pesos em Q4_K_M, mais o KV cache do contexto, mais 1 GB de folga para o runtime:
| Máquina | Memória (GB) | Sobra p/ contexto (GB) | Contexto possível |
|---|---|---|---|
| RTX 5070 · 12 GiB | 12,9 | — | não cabe |
| RTX 5070 Ti · 16 GiB | 17,2 | — | falta 0,8 GB |
| RTX 4090 · 24 GiB | 25,8 | 7,7 | 115k |
| RTX 5090 · 32 GiB | 34,4 | 16,3 | 243k |
| MacBook Pro M4 Max · 48 GiB | 51,5 | 33,5 | 262k (teto) |
| Mini PC · 96 GiB | 103,1 | 85,1 | 262k (teto) |
Olhe a segunda linha. A 5070 Ti fica de fora por 0,8 GB — menos de 5% da memória da placa. Os pesos sozinhos ocupam 17,0 dos 17,2 GB que ela tem; sobram 200 MB para runtime e contexto, o que não dá nem para carregar.
É o tipo de margem que faz alguém comprar a placa errada. Uma placa de 16 GB parece confortável para um modelo “de 17 GB” até você lembrar que GB de arquivo e GiB de placa não são a mesma unidade, e que ainda faltam o cache e o overhead.
O que dá para reproduzir agora
A parte aritmética deste post você confere sozinho, sem baixar 17 GB:
# A configuração oficial — a fonte de tudo que está acima
curl -sL https://huggingface.co/Qwen/Qwen3.6-27B/raw/main/config.json \
| python3 -c "
import json,sys
from collections import Counter
t = json.load(sys.stdin)['text_config']
tipos = Counter(t['layer_types'])
plenas = tipos['full_attention']
kv = 2 * plenas * t['num_key_value_heads'] * t['head_dim'] * 2
print('camadas:', t['num_hidden_layers'], dict(tipos))
print('KV por token:', kv, 'bytes =', kv // 1024, 'KiB')
"
E, para conferir na sua própria placa depois de baixar:
ollama pull qwen3.6:27b
# Com contexto declarado — o padrao do runtime nao e o que voce vai usar
OLLAMA_CONTEXT_LENGTH=131072 ollama run qwen3.6:27b "ok"
# Quanto reservou de fato, e se sobrou algo na CPU
ollama ps
nvidia-smi --query-gpu=memory.used,memory.total --format=csv
O que eu ainda não sei
Sendo explícito sobre a fronteira entre o que este post prova e o que ele apenas sugere.
Provado aqui: a arquitetura híbrida, o KV cache de 64 KiB/token e o que a aritmética diz sobre cada máquina. Tudo derivado do config.json oficial, reproduzível pelo comando acima.
Ainda não medido: o estado das camadas lineares, o consumo real na GPU depois de carregado, tokens por segundo em cada máquina, e o que a atenção linear cobra em qualidade num contexto de 200 mil tokens — porque comprimir o passado num estado fixo não é de graça, e é justamente o teste que interessa.
Essa última é a pergunta boa. Um modelo que promete 262k de contexto e cabe numa 4090 é notícia; se ele lembra do que estava no token 30 mil quando chega no 200 mil é outra conversa, e ninguém responde isso com aritmética.
No próximo post eu meço, nas seis máquinas. A conta diz o que cabe; só a medição diz o que presta.
Fontes: config.json oficial no Hugging Face · anúncio do modelo · qwen3.6:27b no Ollama