Mangaba-Nano-1M

Um modelo de linguagem de 1,4 milhão de parâmetros, treinado do zero em português do Brasil pela Mangaba AI.

📄 Relatório técnico completo (dados, arquitetura, Muon, ablações, controles e destilação): https://huggingface.co/spaces/mangaba-ai/mangaba-nano-artigo

Não há modelo base: os pesos começaram aleatórios e o tokenizer também foi treinado do zero sobre o mesmo corpus. O treino rodou nas GPUs NVIDIA L40S da própria Mangaba, em datacenter no Brasil.

É um modelo de pesquisa e de borda: cabe em 5,6 MB, roda em qualquer CPU e serve como base para estudar escalas minúsculas, fazer ajuste fino em tarefas estreitas (classificação, autocompletar, extração simples) ou rodar em microcontroladores e navegadores. Não é um assistente de chat e não sabe fatos: a 1M de parâmetros, ele aprende ortografia, morfologia e sintaxe do português, e só um pouco de semântica.

Benchmarks

Comparativo

Modelo Parâmetros Dados de treino BPB GigaVerbo ↓ BPB Wikipédia PT ↓ CALAME-PT ↑ Story Cloze PT ↑
Mangaba-Nano-1M 1,41M PT-BR, 2,85B tokens 1,282 1,593 17,1% 56,2%
Mangaba-Nano-1M v2 (destilado) 1,41M PT-BR, 4,9B tokens + destilação do Base-91M 1,296 1,569 17,8% 55,4%
Mangaba-Nano-1M v2 (controle, sem destilação) 1,41M PT-BR, 33,8B tokens (instabilizou no meio) 1,370 1,674 11,8% 58,0%
Baseline Qwen3 + AdamW (mesmos dados) 1,41M PT-BR, 2,85B tokens (idênticos) 1,323 1,635 16,2% 55,9%
Baseline GPT-2 + AdamW (mesmos dados) 1,42M PT-BR, 2,85B tokens (idênticos) 1,425 1,736 11,7% 56,7%
TinyStories-1M 3,75M inglês (TinyStories); ~1M sem embedding 6,407 6,273 0,0% 50,0%
Mangaba-Base-91M (professor) 91,25M PT-BR, 2,5B tokens (do zero) 0,886 1,091 45,7% 57,8%
Tucano-160m 162M PT-BR (GigaVerbo v1) 0,929 0,955 45,6% 61,7%

Como ler.

  • BPB (bits por byte): perda medida por byte de texto, então independe do tokenizer e 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 (Polygl0t/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, pela log-verossimilhança normalizada por byte. O acaso dá 50%. Com 1.511 itens, a margem de erro é de ±2,5 pontos (IC 95%): aqui os três modelos PT de ~1M empatam, e só o Tucano-160m se destaca.

  • Baselines: mesmo tamanho (≈1,41M), mesmos 2,85B tokens e mesmo tokenizer, com a receita clássica (AdamW + cosseno, LR escolhido por varredura: 2e-2 no Qwen3; 3e-3 no GPT-2, porque o 1e-2 que venceu a varredura curta divergiu no passo ~2.900 do treino longo). Eles isolam o efeito da receita do Mangaba (Muon + WSD + arquitetura moderna).

  • O TinyStories-1M (o modelo público mais próximo em tamanho: 3,75M no total, ~1M fora do embedding) foi treinado em inglês e entra como régua de tamanho, não de idioma. O Tucano-160m é mais de 100× maior e serve de teto de referência.

  • v2 (18/10/2026): 7,5× mais dados e destilação a partir do Mangaba-Base-91M, professor também treinado do zero. O resultado é misto: melhora fora do domínio (Wikipédia −1,5%, CALAME +0,7 ponto, dentro da margem de erro) e piora 1,1% na validação do domínio. Por isso o main continua sendo a v1, e a v2 fica no branch v2-destilado. O controle da v2, sem destilação e com 33,8B tokens, instabilizou no meio do treino (Muon sem weight decay em treino longo) e ficou abaixo da v1; ele aparece aqui como registro, não como comparação justa.

Todos os números vêm do bench.py deste repositório, rodado em CPU com float32.

Arquitetura

Decoder no desenho padrão atual (o mesmo de Qwen3 e Llama), carregado com Qwen3ForCausalLM do Transformers. A classe é só a implementação desse desenho: os pesos começaram aleatórios e nenhum peso da Qwen foi usado (por isso o config.json mostra model_type: qwen3).

Camadas 6
Dimensão oculta 128
FFN (SwiGLU) 256
Atenção 4 cabeças de query, 2 de key/value (GQA), head_dim 32, QK-norm
Posição RoPE (θ = 10.000), contexto de 512 tokens
Normalização RMSNorm pré-camada
Embeddings amarrados entre entrada e saída
Vocabulário 4.096 tokens, BPE byte-level treinado do zero (≈3,5 caracteres por token em PT-BR)
Parâmetros 1.411.072 (524.288 de embedding, 886.784 nas camadas)

Receita de treino

Técnicas atuais de pré-treino eficiente, escolhidas por ablação curta antes da rodada final:

  • Otimizador Muon (ortogonalização de Newton-Schulz com momentum de Nesterov) nas matrizes ocultas, e AdamW nos embeddings e nas normas. Busca de LR em rodadas de 40M tokens: Muon 0,015, AdamW 0,015.
  • Agenda Warmup-Stable-Decay (WSD): 2% de aquecimento, platô, e resfriamento final de 25% com curva 1−√t.
  • Precisão mista bf16, torch.compile com a cross-entropy fundida no grafo, recorte de gradiente em 1,0.
  • Lote de 65.536 tokens por passo, 43.487 passos, 2,85 bilhões de tokens (1 época, sem repetição; cerca de 2.000 tokens por parâmetro).
  • Tempo: 67 minutos em uma L40S, usando menos de 0,5 GB de VRAM, ao lado do modelo de produção que divide a mesma GPU.

Dados

Só dados públicos em português:

Documentos com menos de 200 caracteres foram descartados e o texto foi normalizado em Unicode NFC. Total tokenizado: 2,9 bilhões de tokens (≈1 bilhão sintéticos e ≈1,9 bilhão edu_high).

Uso

from transformers import AutoModelForCausalLM, AutoTokenizer

tok = AutoTokenizer.from_pretrained("mangaba-ai/Mangaba-Nano-1M")
model = AutoModelForCausalLM.from_pretrained("mangaba-ai/Mangaba-Nano-1M")

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 llama.cpp (o GGUF está neste repositório):

llama-cli -m Mangaba-Nano-1M-F32.gguf -p "O Brasil é um país" -n 60 --temp 0.7

Exemplos (amostragem, temperatura 0,7)

O Brasil é um país de gado, entretanto, em que há uma reação dos direitos humanos. Para ele, é preciso considerar a forma como os homens estão se relacionando com o mundo e com os seus filhos. Ainda assim, muitos professores também têm o direito à educação e ao ensino público.

A Constituição Federal de 1988, sendo a primeira vez que o homem de Israel tem sido uma nova fase para a qual se aplica a um sistema de defesa da sociedade, o qual é fundamental para o desenvolvimento e o desenvolvimento da democracia, mas sim do processo de construção da democracia.

A fotossíntese é o processo de transmissão de dados, mas o que está sendo feito para isso é muito difícil, porque pode ser inevitável.

Limitações

  • Com 1,4M de parâmetros, o texto é gramatical e com vocabulário correto, mas perde o fio em poucas frases e inventa fatos. Não use para responder perguntas.
  • Sem ajuste de instrução nem alinhamento. Os tokens <|im_start|> e <|im_end|> já estão no vocabulário para um ajuste fino de chat futuro.
  • Contexto máximo de 512 tokens.
  • Herda os vieses do texto da web em português.

Licença

Pesos e código sob Apache-2.0. Os dados de treino seguem as licenças das fontes listadas nos cartões do GigaVerbo-v2.


Feito pela Mangaba AI.

Downloads last month
141
Safetensors
Model size
1.41M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Datasets used to train mangaba-ai/Mangaba-Nano-1M

Evaluation results

  • bits_per_byte on GigaVerbo-v2 (validação separada, edu_high + synth)
    self-reported
    1.282
  • perplexity on GigaVerbo-v2 (validação separada, edu_high + synth)
    self-reported
    22.570