Avançado

Escolhendo e julgando um quant da comunidade

Quarenta repositórios afirmam ser o mesmo modelo. Como ler o nome, o que bits por peso realmente mede e como julgar dois artefatos que ambos dizem 4 bits.

Atualizada em

01 · Conceito

Conceito

A lição 7.12 terminou com uma decisão já tomada: você sabe qual degrau da escada de quantization sua máquina permite. Agora você busca esse modelo no Hub e recebe quarenta repositórios de volta. Alguns publicados por uma organização, a maioria por indivíduos. Os nomes discordam sobre quase tudo. Um diz 4bit, outro diz Q4_K_M, outro diz iQ-3.8bpw, e outro é o experimento de alguém subido ontem à noite. Não são o mesmo arquivo, não vão se comportar do mesmo jeito, e nada na página os classifica.

Esta lição é sobre ler esses nomes — e depois sobre não confiar neles.

O que um nome consegue te dizer

  1. Publicadormlx-community, ou uma pessoa. Nome de organização não é sinal de qualidade.
  2. Modelo baseQwen3.8-27B — os pesos de onde isto derivou. Igual para todos.
  3. Formato de contêinerMLX ou GGUF — quais runtimes conseguem carregá-lo. Igual para todos.
  4. Rótulo da receitaiQ, oQ4e, 4bit. Só os nomes Q e IQ do GGUF significam algo fora da cabeça do autor.
  5. Bits por peso3.8bpw — média sobre cada tensor, metadados inclusos. Um número, não um nome.
Pistas que o nome de um repositório de quant pode carregarNão é um padrão nem um formato fixo — um id de repositório é texto livre, e nomes reais omitem qualquer uma destas. Onde aparecem, apenas o modelo base e o formato de contêiner significam o mesmo para todo mundo: o rótulo da receita é o que o publicador decidiu chamá-lo, e bits por peso é a única pista que é uma medição.

Nada disso é um padrão, e a discordância que você acabou de ver é a prova: um id de repositório é um namespace e um nome em texto livre, então essas são pistas que podem aparecer, mais ou menos nessa ordem, não campos que todo artefato carrega. 4bit nomeia uma receita e nenhuma taxa de bits; Q4_K_M nomeia uma receita cuja taxa você precisa consultar; iQ-3.8bpw nomeia as duas. Muitos repositórios omitem o formato porque o namespace inteiro já o implica, e muitos anexam a taxa de bits a arquivos individuais em vez de ao repositório.

Das pistas que de fato aparecem, três são confiáveis. O modelo base nomeia os pesos de onde o artefato derivou. O formato de contêiner — GGUF, MLX, safetensors — decide quais runtimes conseguem carregar o arquivo, que é a verificação que a lição 7.12 mandou fazer antes de baixar dezesseis gigabytes. Bits por peso, quando está presente, é uma medição.

Os outros dois não são confiáveis, e confundi-los com padrões é o erro comum. Nome de publicador não é sinal de qualidade: mlx-community é onde vive uma boa quantidade de conversões MLX, e estar lá significa que alguém subiu uma conversão, não que alguém a avaliou. O rótulo da receita é pior. Fora das famílias Q e IQ do llama.cpp, um rótulo como iQ ou oQ4e é a abreviação particular que o publicador escolheu para uma receita. Pode codificar algo cuidadoso. Você não tem como saber pela string.

Bits por peso é o único número honesto

A lição 7.9 estabeleceu que um artefato de 4 bits não contém apenas códigos de meio byte: metadados de grupo e tensores deliberadamente protegidos viajam junto. A lição 7.10 fixa o arquivo de texto Q4_K_M do Qwen3.8-27B em 17,1 GB (15,93 GiB), contra um piso de 13,5 GB dos códigos puros. Bits por peso — bpw — nomeia a taxa de armazenamento medida de um artefato, mas calculá-la exatamente exige o denominador exato de tensores daquele artefato, não uma contagem comercial arredondada.

Depois que você consegue enxergá-lo, os rótulos ficam diferentes. Medido no Llama-3.1-8B, o Q4_K_M armazena 4,8944 bits por peso e o Q8_0 armazena 8,5008. Nenhum dos dois é o número redondo do próprio nome. Ou seja: um repositório anunciando 3.8bpw não está sendo excêntrico — está sendo mais preciso que aquele anunciando 4bit, e está te dizendo algo que o outro nome esconde.

Há um segundo motivo para o número ser fracionário, e é o mais interessante. Uma receita não precisa usar a mesma largura em todo lugar. A quantization mista atribui larguras de bits diferentes a camadas diferentes — protegendo as projeções que mais sofrem quando são grosseiras e gastando menos no resto — e a média cai onde essa mistura a colocar. No mlx-lm elas vêm como receitas nomeadas (mixed_2_6, mixed_3_4, mixed_3_6, mixed_4_6) e, no caminho de learned quantization, como um alvo que você define diretamente: --target-bpw pede uma média e deixa a ferramenta escolher a atribuição por camada que a alcança. Um 3,8 é uma posição de dial, não um erro de digitação.

Importância é mensurável

A pergunta que uma receita mista precisa responder é quais camadas merecem os bits. A lição 7.10 deu uma família de respostas: GPTQ compensa erro camada a camada, AWQ protege os canais que as activations mostram ser significativos. O rótulo do Hub que você ainda não encontrou pertence à mesma família.

Uma importance matrix, geralmente escrita imatrix, é construída passando dados de calibração pelo modelo e acumulando, por coluna de tensor, a soma dos quadrados das ativações que passam por ali. Colunas que os dados de calibração exercitam bastante pontuam alto; colunas que eles mal tocam pontuam baixo. O quantizador então pondera seu erro de acordo, gastando precisão onde a estatística diz que importa. Note o que isso é e o que não é: é uma medição das ativações que um corpus produz, não de quanto cada peso individual move a saída — e a própria documentação do llama.cpp sinaliza que usar ativações ao quadrado, em vez das brutas, torna a estatística menos confiável do que parece à primeira vista.

Duas correções que a maioria dos leitores precisa. Primeira, uma importance matrix não é a mesma coisa que um formato IQ: k-quants são construídos com uma rotineiramente, e muitos arquivos Q4_K_M bem avaliados no Hub são calibrados por imatrix. Nem todo tipo IQ exige uma. O llama.cpp recusa de saída nos seus degraus mais baixos — as famílias IQ1 e IQ2, os tipos IQ3 menores e o Q2_K_S —, avisando que o resultado seria lixo sem dados de calibração; IQ4_XS e IQ4_NL são construídos sem uma e apenas se beneficiam dela. A verificação é por tensor e depende do tipo de destino, então o conjunto exato muda entre releases: leia o erro, não decore uma lista. Segunda, ela importa mais onde a precisão é mais escassa, que é a mesma afirmação pelo outro lado: acima de aproximadamente 4 bits o benefício é modesto; nos degraus que se recusam a ser construídos sem ela, é a diferença entre um modelo que funciona e lixo. O análogo no MLX é a dynamic quantization baseada em sensibilidade, que estima a influência de cada camada e salva as sensibilidades por camada para que a mesma medição possa ser reaproveitada em outros alvos.

Por que dois arquivos de 4 bits diferem

A lição 7.9 avisou que a largura de bits sozinha não prevê nem velocidade nem qualidade, e a lição 8.7 observou que dois conversores produzem arquivos mensuravelmente diferentes. Agora o mecanismo está disponível. Dois artefatos na mesma média podem diferir em group size — quantos pesos compartilham uma escala e, portanto, quão de perto as escalas acompanham as estatísticas locais; em quais tensores foram mantidos em precisão mais alta; e no corpus de calibração, já que um quantizador ajustado em prompts curtos em inglês não viu nada sobre código nem sobre um documento de cem mil tokens.

É por isso que o relato de um praticante de que um build de 4 bits supera outro não é surpreendente nem místico. Mesma largura nominal, receitas diferentes, medições diferentes por baixo.

O que menos bits realmente compram

Q4_K_MLinha de base F16
101001.000
051015

Bits por peso (bpw)

Vazão (tok/s)

  • Decode (geração)
  • Prefill (processamento do prompt)
Ver os dados desta figura
Bits por pesoDecode (geração)Prefill (processamento do prompt)
2,00479,73858,88
2,14672,92847,99
2,92974,44787,68
2,9790,01798,91
3,49871,67708,71
3,64369,84752,17
3,66169,31798,78
3,99671,68783,44
4,29869,38761,17
4,4677,51771,8
4,66776,71818,55
4,68276,63806,03
4,89471,93821,81
5,5769,53752,52
8,50150,93865,09
16,00129,17923,49
O que menos bits realmente compram (Llama-3.1-8B)Medido em Llama-3.1-8B, não no Qwen3.8-27B. Neste benchmark, a vazão do decode quantizado varia de 1,75 a 3,09 vezes os 29,17 tokens por segundo do F16: o Q8_0 alcança 50,93 e o Q2_K_S alcança 90,01. Mas abaixo de 8 bits a linha para de descer de forma organizada — o Q2_K_S, com 2,97 bpw, é a linha mais rápida daqui, e o Q4_K_S supera o menor Q3_K_S —, então nessa faixa quem decide a velocidade é a eficiência do kernel, não o tamanho. O prefill é limitado por computação e nunca melhora; ele cai de 923 para 709 tokens por segundo, porque desquantizar é aritmética extra.

A primeira metade dessa figura é a lição 7.3 tornada visível. O decode relê aproximadamente todo o conjunto de pesos para cada token que gera, então é limitado por largura de banda, e encolher os pesos ataca diretamente sua restrição. Neste benchmark do Llama-3.1-8B, as linhas quantizadas geram entre 1,75 e 3,09 vezes a vazão do F16: o Q8_0 fica no limite inferior, com 50,93 contra 29,17 tokens por segundo, enquanto o Q2_K_S fica no superior, com 90,01. O prefill é limitado por computação, e a quantization não multiplica unidades aritméticas — pior, desquantizar é aritmética extra —, então o processamento do prompt não melhora e na verdade recua, de 923 tokens por segundo no F16 para 709 no degrau quantizado mais lento.

A segunda metade é a parte que merece calma, porque ela se recusa a virar regra. Abaixo de cerca de 8 bits, o tamanho para de prever a velocidade. Nesta tabela o Q2_K_S, com 2,97 bpw, é o artefato mais rápido medido, a 90 tokens por segundo — mais rápido que todo build de 4 bits. O Q4_K_S, com 4,67 bpw, decodifica a 76,7 enquanto o menor Q3_K_S, com 3,64, alcança apenas 69,8. E o Q4_K_M, o degrau mais baixado do Hub, é mais lento que os dois, a 71,9, apesar de ficar entre eles em tamanho.

O mecanismo é eficiência de kernel, não bytes. Assim que um formato fica pequeno o bastante para o barramento de memória deixar de ser a única restrição, quem decide o resto é quão bem o kernel de desempacotamento se encaixa no hardware — e é por isso que i-quants, cujas consultas a codebook custam tempo de decode que um k-quant nunca paga, podem perder para k-quants maiores, a ressalva que a lição 8.7 levanta pelo lado do llama.cpp.

Então, quando alguém relata que 6 bits é o ponto ideal para ela, está fazendo uma afirmação sobre fidelidade contra velocidade que é inteiramente plausível e não derivável da largura de bits. Nada nesta tabela permitiria prever isso. Essa é a razão honesta pela qual a última seção desta lição existe.

Julgando por conta própria

A medição não é elaborada. Fixe um conjunto de prompts tirado do trabalho que você realmente faz, não de um leaderboard. Fixe os parâmetros de sampling e declare-os — o preset instruct do model card, conforme a disciplina da lição 8.9, em vez do que um runner traz por padrão. Rode os dois artefatos na mesma máquina, mesmo runtime, mesmo comprimento de contexto, e registre tempo de carga, time to first token, tokens por segundo e pico de memória residente ao lado do seu julgamento da saída, como estabelece a nota de benchmarking da lição 7.12. Depois rode de novo, porque um laptop dez minutos adentro de uma sessão é outra máquina.

E aplique o reflexo da lição 0.8 ao que você lê. Quando alguém relata que um quant venceu a comparação noturna dele, ou nomeia um benchmark particular próprio, o que você recebeu foi uma hipótese formada no hardware, nos prompts e no envelope térmico daquela pessoa. Isso é genuinamente útil — é mais evidência do que o nome do arquivo carrega. Não é um resultado até você saber o harness, o número de amostras e a variância, e essas costumam ser justamente as partes que ficam sem ser ditas.

A ideia durável é uma hierarquia de confiança. O formato de contêiner é um fato. Bits por peso é uma medição. O rótulo da receita é uma alegação. O ranking é o experimento de um desconhecido. Só os dois últimos falam de qualidade, e são os dois que você não consegue verificar sem rodar a coisa você mesmo.

02 · Analogia

Analogia

Uma loja de ferragens vende parafusos em caixas rotuladas por quem as encheu. Duas caixas dizem 4 mm. Uma foi medida com paquímetro e separada; a outra foi avaliada a olho a partir de uma caixa maior, e os compridos ficaram porque quase sempre servem. O rótulo informa a intenção, o paquímetro informa o tamanho, e só colocar um no furo real informa se funciona. Quantizations da comunidade são essas caixas, bits por peso é o paquímetro, e os seus próprios prompts são o furo.

03 · Explique de volta

Explique de volta

Alguém te oferece dois arquivos do mesmo modelo, um chamado 4bit e outro 3.8bpw. Explique o que cada nome diz e o que não diz, por que o segundo número é fracionário, e como você decidiria entre eles sem confiar em nenhum dos rótulos.

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

Aguardando sua explicação.

Comparar com uma resposta-modelo

Um id de repositório é texto livre, então ele carrega pistas e não campos: publicador, modelo base, formato de contêiner, rótulo da receita e bits por peso podem aparecer ou não, e só o modelo base e o formato de contêiner significam o mesmo para todo mundo. Um rótulo de receita como iQ ou oQ4e é a abreviação particular do publicador e não carrega garantia alguma; mesmo o Q4_K_M padronizado do GGUF nomeia uma mistura, não uma largura de bits fixa. Bits por peso é o único campo que é uma medição: ele faz média sobre cada tensor e conta as escalas de grupo, os zero points e os tensores deliberadamente protegidos que viajam junto aos códigos, e é por isso que a taxa medida sempre excede a largura nominal — o Q4_K_M mede 4,8944 bits por peso no Llama-3.1-8B, e um modelo diferente, com outra proporção de embedding, cai em outro lugar; portanto o número pertence a um artefato, nunca a um formato. Ele é fracionário por um segundo motivo também: receitas mistas atribuem larguras de bits diferentes a camadas diferentes, e as ferramentas expõem isso como um alvo que você define, não como um degrau que você escolhe. Portanto 3.8bpw é uma afirmação mais precisa que 4bit, não mais estranha. Nenhum dos nomes informa qualidade, porque dois artefatos na mesma média podem diferir em group size, em quais tensores foram protegidos e no corpus de calibração usado para decidir. A decisão é, então, uma medição: prompts fixos tirados do trabalho que você realmente faz, parâmetros de sampling fixos, os dois artefatos na mesma máquina e no mesmo runtime, reportando tempo de carga, time to first token, tokens por segundo e pico de memória ao lado da qualidade — e tratando um número isolado do benchmark particular de um desconhecido como hipótese inicial, não como resultado.

04 · Teste seu entendimento

Teste seu entendimento

01Um artefato GGUF é rotulado Q4_K_M e mede 4,8944 bits por peso. O que explica a diferença entre 4 e 4,8944?
Resposta e explicação

Escalas de bloco, metadados de super-bloco e tensores que a receita mantém deliberadamente em precisão mais alta entram todos na média — Bits por peso faz média do checkpoint inteiro, metadados inclusos, e é exatamente por isso que excede a largura nominal. As lições 7.9 e 8.7 aplicam o mesmo raciocínio ao Qwen3.8-27B e chegam a outra taxa — o efeito é geral, o número é por artefato.

02Usando a lição 7.3, por que quantizar aumenta bastante a velocidade de geração de texto e não faz nada pelo processamento do prompt?
Resposta e explicação

O decode é limitado por largura de banda de memória e move os bytes de peso por token, enquanto o prefill é limitado por computação — e desempacotar pesos quantizados acrescenta aritmética ali, em vez de remover — A lição 7.3 separou as duas máquinas: o decode relê aproximadamente todo o conjunto de pesos por token gerado, então menos bytes armazenados atacam diretamente o gargalo dele. O prefill já satura as unidades aritméticas, e desquantizar é trabalho extra para elas — e é por isso que a tabela medida mostra o processamento do prompt não apenas plano, mas ligeiramente pior que o F16.

03O que uma importance matrix contribui para uma rodada de quantization?
Resposta e explicação

Estatísticas de ativação por coluna colhidas de dados de calibração, que ponderam o erro do quantizador para que a precisão vá onde aquele corpus mais exercitou o modelo — O imatrix do llama.cpp acumula a soma dos quadrados das ativações por coluna de tensor — uma estatística sobre o que o corpus de calibração exercitou, não uma medição de sensibilidade por peso. É separável dos formatos IQ (k-quants são construídos com um rotineiramente) e apenas os degraus mais baixos se recusam a ser construídos sem ele.

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

◎ · Marcador de evidência

Fontes

  1. Georgi Gerganov e contribuidores (2023). llama.cpp — quantize: quantization types, sizes and benchmarks.
  2. Alex Barron (2024). Mixed Quantizations (mlx-examples pull request 1132).
  3. Awni Hannun e contribuidores do mlx-lm (2025). mlx-lm: Learned Quantization.
  4. Qwen Team (2026). Qwen3.8-27B Model Card.