Resumo
- O Mangaba-Base-91M tem 91,25 milhões de parâmetros e foi treinado do zero: pesos aleatórios no início, tokenizer próprio, nenhum modelo de terceiros.
- Foram 2,52 bilhões de tokens de texto público em português, em 4h52 numa NVIDIA L40S, com o otimizador Muon e a agenda Warmup-Stable-Decay.
- Contra o Tucano-160m (162M de parâmetros), ele é 4,6% melhor em bits por byte no domínio de treino e empata no CALAME-PT (45,7% contra 45,6%). Fora do domínio fica atrás: na Wikipédia e no Story Cloze.
- Ele foi treinado como professor para a destilação do Mangaba-Nano-1M. O resultado justificou publicá-lo como modelo próprio.
- Por que 91M
- Dados e tokenizer
- Arquitetura
- Treino
- Resultados
- Exemplos de geração
- Como professor de destilação
- Limitações e próximos passos
- Como usar e reproduzir
1. Por que 91M
O Base-91M nasceu com um propósito específico: ser o professor do Mangaba-Nano-1M, um modelo de 1,4 milhão de parâmetros, numa destilação de logits. Para isso, ele precisava ser bem maior que o aluno, usar o mesmo tokenizer e caber, com folga, numa noite de GPU.
Na faixa de 100 milhões de parâmetros, um modelo de linguagem já escreve frases conectadas e mantém o tema por um parágrafo. Ainda assim, roda em CPU e cabe em 97 MB no formato GGUF Q8_0. É um bom ponto de partida para ajuste fino em tarefas estreitas em português, como classificação, extração e autocompletar, e para estudar o que muda entre escalas.
2. Dados e tokenizer
Usamos só dados públicos em português, do GigaVerbo-v2:
- Texto da web com nota educacional alta (subconjunto
edu_high), 23 arquivos. - Texto sintético didático (gigaverbo-v2-synth, Apache-2.0), 15 arquivos.
O corpus somou 21,6 bilhões de tokens, com ~24% de texto sintético. Descartamos documentos com menos de 200 caracteres e normalizamos tudo em Unicode NFC. Os trechos de treino foram sorteados ao acaso, proporcionalmente ao tamanho de cada arquivo. Os arquivos foram tokenizados durante o próprio treino: na primeira hora, só os 2,9B tokens iniciais estavam prontos, e os demais entraram à medida que ficavam disponíveis. A validação (14 milhões de tokens) foi separada antes do treino e nunca entrou nele.
Tokenizer compartilhado
O tokenizer é um BPE byte-level de 4.096 tokens, treinado do zero no próprio corpus, com 3,4 a 3,7 caracteres por token. Esse vocabulário pequeno foi escolhido para o Nano-1M, em que cada token pesa no orçamento de parâmetros. O Base-91M o herdou porque a destilação de logits exige que professor e aluno prevejam sobre o mesmo vocabulário. Para um modelo deste porte, é um vocabulário pequeno (ver seção 8).
3. Arquitetura
É um decoder no desenho atual da indústria, o mesmo de famílias como Qwen3 e Llama: RMSNorm antes de cada bloco, RoPE, SwiGLU, atenção com consultas agrupadas (GQA), QK-norm e embeddings amarrados. Usamos a classe Qwen3ForCausalLM do Transformers só como implementação desse desenho: os pesos foram inicializados aleatoriamente e nenhum peso da Qwen é usado. Por isso o config.json mostra model_type: qwen3.
| Componente | Mangaba-Base-91M | Mangaba-Nano-1M |
|---|---|---|
| Camadas × dimensão | 14 × 768 | 6 × 128 |
| FFN (SwiGLU) | 2.048 | 256 |
| Cabeças de query / key-value | 12 / 4 | 4 / 2 |
| head_dim | 64 | 32 |
| Contexto | 512 tokens | 512 tokens |
| Parâmetros | 91.250.176 | 1.411.072 |
| Fração no embedding | 3% | 37% |
4. Treino
- Otimizador Muon: nas matrizes internas, a atualização com momentum de Nesterov é ortogonalizada por 5 iterações de Newton-Schulz, de modo que todas as direções da matriz avançam com a mesma intensidade. LR de 0,02. Embeddings e normas usam AdamW, com LR de 0,006.
- Sem varredura de LR neste tamanho. Os valores seguem a prática comum para essa largura. A janela de GPU foi dedicada às ablações do Nano, então é provável que haja ganho a ser obtido aqui.
- Agenda Warmup-Stable-Decay: 2% de aquecimento, platô e resfriamento 1−√t nos últimos 25%.
- Orçamento por relógio: o treino mediu a própria vazão depois de 200 passos e recalculou o total para terminar dentro da janela de GPU. Isso deu 9.621 passos de 262.144 tokens, ou 2,52 bilhões de tokens: ~28 tokens por parâmetro, acima dos ~20 da regra de Chinchilla.
- Execução: precisão mista bf16,
torch.compilee recorte de gradiente em 1,0. Usou 7,8 GB de memória. - Hardware: uma NVIDIA L40S, num datacenter no Brasil, durante uma janela noturna em que o modelo de produção dessas GPUs foi desligado. A vazão ficou em 145 mil tokens/s (~79 TFLOPS), cerca de 22% do pico bf16 da placa. A outra GPU rodava ao mesmo tempo 10 a 12 treinos de ablação, disputando a CPU usada para carregar os dados.
5. Resultados
As métricas:
- Bits por byte (BPB): perda medida por byte de texto. Não depende do tokenizer, então compara modelos de vocabulários diferentes. GigaVerbo é a validação separada do corpus de treino; Wikipédia PT são 400 artigos (3.000 caracteres cada), fora desse domínio.
- CALAME-PT (2.076 textos): o modelo precisa gerar exatamente a última palavra do texto.
- Story Cloze PT (1.511 histórias): escolher o final certo entre dois. O acaso dá 50%.
bench.py), em CPU e float32.| Modelo | Parâmetros | BPB GigaVerbo ↓ | BPB Wikipédia ↓ | CALAME-PT ↑ | Story Cloze ↑ |
|---|---|---|---|---|---|
| Mangaba-Base-91M | 91M | 0,886 | 1,091 | 45,7% | 57,8% |
| Tucano-160m | 162M | 0,929 | 0,955 | 45,6% | 61,7% |
| Mangaba-Nano-1M | 1,41M | 1,282 | 1,593 | 17,1% | 56,2% |
Leitura
- No domínio, ganha: 0,886 contra 0,929 bits por byte, 4,6% melhor com 1,8 vez menos parâmetros. Parte da vantagem vem de ter treinado na mesma distribuição da validação (GigaVerbo-v2), enquanto o Tucano treinou na primeira versão do GigaVerbo.
- No CALAME-PT, empata: 45,7% contra 45,6%. Com 2.076 textos, a margem de erro é de ±2,1 pontos.
- Fora do domínio, perde: 1,091 contra 0,955 na Wikipédia, e 57,8% contra 61,7% no Story Cloze. Conhecimento enciclopédico e senso comum dependem de volume e variedade de texto. O Base-91M viu 2,5B tokens de dois tipos de fonte; o Tucano-160m foi treinado sobre o GigaVerbo v1, um corpus de 780 GB e bem mais variado.
- A escala pesa: com o mesmo tokenizer e os mesmos dados, o salto de 1,4M para 91M de parâmetros reduz a perda de validação de 3,125 para 2,132 e leva o CALAME-PT de 17% para 46%.
6. Exemplos de geração
Amostragem com temperatura 0,7, top-p 0,9 e penalidade de repetição 1,15. São os trechos iniciais das cinco amostras geradas, sem escolher as melhores:
O Brasil é um país de grande riqueza, com uma população que tem crescido ao redor
do mundo. Para chegar lá, temos que nos adequar a esse novo ambiente. O que há em
termos de mudança, na realidade?
A fotossíntese é o processo pelo qual a planta realiza sua respiração, através da
luz que recebe do sol. Esse processo acontece na presença de elementos químicos
como enxofre e nitrogênio.
Era uma vez uma menina que tinha um vestido, mas não era bonito, ela dizia: “Que
mulher!”, e a menina ria.
A Constituição Federal de 1988. SOARES, Celso Antônio Bandeira de. Magistério da
Educação Infantil: uma proposta para a formação do professor em creche e pré-escola.
Para fazer um bolo de cenoura, você pode usar pedaços pequenos e então cozinhe-os
em água quente. Isso ajudará a evitar que eles se tornem grumosos demais.
As frases são gramaticais, se conectam e mantêm o tema. Os fatos, porém, não são confiáveis: a fotossíntese não é respiração e não depende de enxofre. No quarto exemplo, o modelo reproduz o formato de uma referência bibliográfica, padrão comum em textos acadêmicos da web.
7. Como professor de destilação
O Base-91M foi usado para destilar o Mangaba-Nano-1M: o aluno aprendeu a distribuição completa de probabilidades do professor para o próximo token, com perda de 30% cross-entropy e 70% divergência KL, ao longo de 4,9B tokens. O resultado no aluno foi misto:
- fora do domínio, ele melhorou (Wikipédia: 1,569 contra 1,593 bits por byte);
- no domínio, piorou (GigaVerbo: 1,296 contra 1,282).
A explicação mais provável é a lacuna de capacidade: com 65 vezes mais parâmetros, o professor gera distribuições que o aluno não consegue imitar. Um professor intermediário, de 5 a 20M de parâmetros, deve funcionar melhor para um aluno de 1M. Os detalhes estão no relatório do Mangaba-Nano-1M.
8. Limitações e próximos passos
- É um modelo base, sem ajuste de instrução nem alinhamento. Não use para responder perguntas factuais.
- O contexto máximo é de 512 tokens.
- O vocabulário de 4.096 tokens foi escolhido pela destilação, não por este modelo. Com só 3% dos parâmetros no embedding, um vocabulário de 16k a 32k comprimiria melhor o texto e provavelmente melhoraria as métricas fora do domínio.
- O modelo herda os vieses do texto da web em português.
Os próximos ganhos mais prováveis:
- uma varredura de LR neste tamanho;
- weight decay junto do Muon: sem ele, um treino longo do Nano instabilizou depois de ~8B tokens;
- 10B tokens ou mais;
- fontes mais variadas (enciclopédia, livros, notícias);
- contexto de 2.048 tokens.
9. Como usar e reproduzir
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("mangaba-ai/Mangaba-Base-91M")
model = AutoModelForCausalLM.from_pretrained("mangaba-ai/Mangaba-Base-91M")
ids = tok("A fotossíntese é o processo", return_tensors="pt").input_ids
out = model.generate(ids, max_new_tokens=60, do_sample=True, temperature=0.7,
top_p=0.9, repetition_penalty=1.15)
print(tok.decode(out[0], skip_special_tokens=True))
Com o llama.cpp: llama-completion -m Mangaba-Base-91M-Q8_0.gguf -p "O Brasil é um país" -n 60.
O repositório do modelo traz o train2.py usado no treino (dados em vários arquivos, mistura configurável, orçamento por relógio e destilação), o bench.py da suíte de benchmarks e o log.jsonl com a perda de validação ao longo do treino. O comando de treino:
python train2.py --save teacher100m --hidden 768 --layers 14 --heads 12 --kv 4 \
--ffn 2048 --micro 32 --accum 16 --tokens 2e10 --minutes 295 \
--lr_muon 0.02 --lr_adam 0.006 --eval_every 500