← início
Guia prático

Como rodar o Mini GPT na sua máquina

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.

Pré-requisitos

  • JDK 21 ou mais novoQualquer distribuição: Temurin, Zulu, Corretto, Oracle. Confira com java -version. O build recusa JDK mais antigo, com uma mensagem dizendo isso.
  • Maven 3.9+, ou nadaConfira com 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.
  • Uns 2 GB de RAM livresO Transformer com os padrões cabe folgado. O que consome tempo é a CPU, não a memória.

Os quatro passos

1

Clone e teste

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.

2

Empacote

Gera target/mini-gpt-java.jar, que é o que todos os comandos seguintes usam.

3

Rode o nível 1

Instantâneo: conta os pares e já gera uma amostra. É o "olá, mundo" do projeto.

4

Suba os degraus

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 3000

Depois que isso funcionar

Gerar 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 5

Os 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 400

O 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

Todas as opções

OpçãoSignificadoPadrão
--modelbigram | mlp | transformerbigram
--corpuscaminho do .txtdata/corpus.txt
--prompttexto inicial da geraçãovazio
--lengthquantos caracteres gerar200
--temptemperatura de amostragem (>0)1.0
--topkmantém os k mais prováveis (0 = desliga)0
--stepspassos de treino (mlp e transformer)mlp 3000, transf. 2000
--contextcomprimento de contexto (block size)mlp 8, transf. 64
--embeddimensão do embeddingmlp 24, transf. 128
--hiddentamanho da camada oculta do MLP128
--headscabeças de atenção (transformer)4
--blocksblocos do transformer2
--batchtamanho do mini-lotemlp 32, transf. 16
--lrtaxa de aprendizado1e-3
--seedsemente 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 corpus é metade do resultado

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.

  • Um arquivo .txt em UTF-8, em português, de domínio público.
  • Alvo de tamanho: cerca de 1 MB (aproximadamente um milhão de caracteres).
  • Boas fontes: Projeto Gutenberg (filtre por Portuguese, versão "Plain Text UTF-8"), Domínio Público (MEC) e Wikisource em português.
  • Autores cujas obras costumam estar disponíveis: Machado de Assis, Eça de Queirós, José de Alencar, Aluísio Azevedo.
Acentos não são problemaO tokenizador trabalha em nível de caractere e trata cada caractere Unicode como um id. Mantenha a acentuação completa: o vocabulário fica um pouco maior e o texto gerado fica correto. Um corpus sem acento ensina o modelo a escrever sem acento.
cat parte1.txt parte2.txt parte3.txt > data/corpus.txt
wc -c data/corpus.txt # ~1000000 é um bom alvo
juntar vários arquivos e conferir o tamanho

O que esperar de cada nível

NívelPerda de validaçãoTempo de treinoO texto
Bigrama~2–3 natsinstantâneoTextura de português, sem palavras reais.
MLPabaixo do bigramasegundosSílabas e palavras curtas; a frase não fecha.
Transformermeta: < 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.

Quando algo der errado

Corpus não encontrado

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.

O Transformer está lento demais

É 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.

A perda de validação parou de cair

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.

Textos diferentes a cada execução

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.