Nenhuma GPU, nenhuma conta em nenhum serviço, nenhum download de modelo: bastam JDK 21 e Maven. O primeiro texto gerado sai em menos de um minuto.
java -version. O build recusa JDK mais antigo, com uma mensagem dizendo isso.mvn -v. Se preferir não instalar, o repositório traz o wrapper: troque mvn por ./mvnw (ou mvnw.cmd no Windows) em qualquer comando desta página, e ele baixa a versão certa sozinho.Antes de qualquer treino: mvn test roda a verificação de gradiente por diferenças finitas. Se ela passa, a matemática do repositório está íntegra na sua máquina.
Gera target/mini-gpt-java.jar, que é o que todos os comandos seguintes usam.
Instantâneo: conta os pares e já gera uma amostra. É o "olá, mundo" do projeto.
O MLP treina em segundos. O Transformer leva cerca de 25 minutos com os padrões; comece com --steps 200 se quiser só ver o formato da saída.
$ git clone https://github.com/alegauss/mini-gpt && cd mini-gpt && mvn test$ mvn -q package -DskipTests$ java -jar target/mini-gpt-java.jar train --model bigram$ java -jar target/mini-gpt-java.jar train --model mlp --steps 3000Gerar a partir de um prompt, com temperatura e top-k. Lembre-se: mlp e transformer treinam do zero antes de gerar, porque o projeto não persiste pesos.
$ java -jar target/mini-gpt-java.jar generate --model mlp --prompt "O menino " --length 200 --temp 0.8 --topk 5Os três níveis lado a lado, no mesmo corpus e com o mesmo prompt, numa única saída.
$ java -jar target/mini-gpt-java.jar compare --prompt "O menino " --steps 400O Transformer completo, com a meta de perda de validação abaixo de 1,7. Reserve o tempo.
$ java -jar target/mini-gpt-java.jar train --model transformer --steps 2000| Opção | Significado | Padrão |
|---|---|---|
--model | bigram | mlp | transformer | bigram |
--corpus | caminho do .txt | data/corpus.txt |
--prompt | texto inicial da geração | vazio |
--length | quantos caracteres gerar | 200 |
--temp | temperatura de amostragem (>0) | 1.0 |
--topk | mantém os k mais prováveis (0 = desliga) | 0 |
--steps | passos de treino (mlp e transformer) | mlp 3000, transf. 2000 |
--context | comprimento de contexto (block size) | mlp 8, transf. 64 |
--embed | dimensão do embedding | mlp 24, transf. 128 |
--hidden | tamanho da camada oculta do MLP | 128 |
--heads | cabeças de atenção (transformer) | 4 |
--blocks | blocos do transformer | 2 |
--batch | tamanho do mini-lote | mlp 32, transf. 16 |
--lr | taxa de aprendizado | 1e-3 |
--seed | semente aleatória (reprodutibilidade) | 1234 |
Os modelos mlp e transformer treinam do zero a cada execução (o projeto não persiste pesos), por isso generate e compare incluem uma fase de treino antes de gerar.
O data/corpus.txt que vem no repositório é um placeholder curto: ele existe para o pipeline rodar assim que você clona, e é pequeno demais para um bom modelo. Com ele, os três níveis parecem melhores do que são, porque decoram em vez de generalizar.
.txt em UTF-8, em português, de domínio público.cat parte1.txt parte2.txt parte3.txt > data/corpus.txtwc -c data/corpus.txt # ~1000000 é um bom alvo
| Nível | Perda de validação | Tempo de treino | O texto |
|---|---|---|---|
| Bigrama | ~2–3 nats | instantâneo | Textura de português, sem palavras reais. |
| MLP | abaixo do bigrama | segundos | Sílabas e palavras curtas; a frase não fecha. |
| Transformer | meta: < 1,7 | ~25 min (2000 passos) | Palavras reais e frases que começam a fechar. |
Durante o treino a saída mostra passo, loss_treino, loss_val e tempo, e a cada 500 passos gera uma amostra de 100 caracteres, que é como se vê o texto sair do ruído.
O comando falha logo no começo dizendo o caminho que tentou. Confira se está rodando da raiz do repositório, ou passe --corpus com um caminho absoluto.
É esperado: são cerca de 25 minutos para 2000 passos numa CPU comum. Para experimentar, use --steps 200 ou --context 16, já que a atenção é quadrática no contexto.
Se a de treino continua caindo e a de validação não, o modelo passou a decorar. Corpus maior é a primeira resposta; --embed menor é a segunda.
Todo sorteio passa por --seed. Fixe a semente para comparar dois experimentos; sem isso, você está medindo o ruído do sorteio junto com o efeito da mudança.