- Rust 54.8%
- Jupyter Notebook 20.6%
- Python 16.8%
- Makefile 7.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| preparar_dataset | ||
| tests | ||
| .gitignore | ||
| arquitetura.odp | ||
| arquitetura.pdf | ||
| arquitetura.png | ||
| LICENSE | ||
| makefile | ||
| nanowiki_split.py | ||
| plain_pix.py | ||
| README.md | ||
| requirements-lean.txt | ||
| requirements.txt | ||
| treinar_small_language_model.ipynb | ||
| treinar_tokenizer.py | ||
NanoWiki
NanoWiki é uma prova de conceito de modelo de linguagem pequeno, treinado com a Wikipedia em português. O fluxo padrão usa apenas essa fonte, para que a preparação e o treino possam ser repetidos em hardware doméstico.
Fluxo padrão
No Linux, WSL ou macOS, instale pyenv, wget, Rust, CUDA compatível com PyTorch e as ferramentas de compilação necessárias para o llama.cpp. Em seguida, execute as etapas na ordem abaixo:
make run_dataset
make run_tokenizer
make run_train
make run_conversion
make run_inference
make run_dataset baixa wikipedia_pt_all_nopic.zim e extrai a Wikipedia em português em quatro artefatos irmãos: data/processed/wikipedia_pt_full.jsonl, seu índice data/processed/wikipedia_pt_full.jsonl.idx, o texto legível data/processed/wikipedia_pt_full.plain e o índice de texto data/processed/wikipedia_pt_full.pix. O Rust preserva JSONL/IDX para auditoria e combinação interna. O .plain contém um artigo limpo UTF-8 por linha terminada em LF; o .pix guarda pares start/end exclusivos de 16 bytes para acesso aleatório ao texto, sem incluir o LF. O tokenizador e o treino Python consomem somente .plain/.pix.
As etapas seguintes usam estes artefatos, com nomes estáveis e genéricos:
| Etapa | Artefato |
|---|---|
| Tokenizador | artifacts/nanowiki-tokenizer |
| Execuções de treino | artifacts/nanowiki-model-runs |
| Modelo no formato Hugging Face | artifacts/nanowiki-model-hf |
| Modelo GGUF BF16 | artifacts/nanowiki-model.bf16.gguf |
make run_inference chama llama-cli com o GGUF gerado. O alvo instala e usa a cópia do llama.cpp preparada pelo Makefile, portanto não exige que llama-cli já esteja no PATH.
Perfil NanoWiki
O perfil padrão tem exatamente 23.604.096 parâmetros. É um modelo LLaMA-style com dimensão oculta 384, dimensão FFN 1024, 14 camadas, 6 cabeças de atenção e 2 cabeças key-value.
O tokenizador tem vocabulário de 4096 tokens. O contexto de treino é fixado em 256 tokens e o aquecimento dura 1000 passos. Tokens de preenchimento não contribuem para a perda: os rótulos dessas posições recebem -100.
As medições de memória, disco e tempo que descreviam um perfil anterior de cerca de 170M parâmetros não representam o NanoWiki atual. Elas não devem ser usadas para estimar os requisitos deste perfil PoC.
Catálogo de fontes do extrator
As fontes abaixo são um catálogo de capacidades do extrator, obtidas de Kiwix. O extrator continua sabendo processar todos esses ZIMs. Porém, o pipeline padrão de treino usa somente wikipedia_pt_all_nopic.zim.
Se dados de outras fontes já existirem em data/processed, o fluxo padrão os ignora e não os apaga. Eles podem ser usados por fluxos configurados explicitamente para essas fontes.
O catálogo contém 18 fontes: 15 sob CC-BY-SA-4.0, uma sob CC0, uma sob MIT e uma sob blessing. Cada fonte preserva sua licença original. O NanoWiki padrão é treinado somente com a Wikipedia em português, licenciada sob CC-BY-SA-4.0.
Licença do modelo
O modelo de linguagem é licenciado sob a licença CC-BY-SA-4.0, que é compatível com a fonte usada pelo pipeline padrão.
Licença do código gerador do modelo
O código do projeto é licenciado sob a licença CC0, para maximizar a liberdade de uso, modificação e distribuição, de forma que autoria não seja impedimento.
A exceção notória é o diretório preparar_dataset/vendor/zim/ que possui suas próprias licenças em preparar_dataset/vendor/zim/README.md e recebeu correções mínimas para que rodasse neste projeto.
O projeto usa bibliotecas de terceiros que possuem suas licenças próprias; deixo ao usuário a responsabilidade de verificar a compatibilidade das licenças de terceiros com o uso pretendido.