microgpt
(karpathy.github.io)- Estrutura mínima de modelo de linguagem que implementa todo o processo de treinamento e inferência de um modelo GPT em um único arquivo puro de Python com 200 linhas
- Inclui dataset, tokenizer, motor de autodiferenciação, rede neural semelhante ao GPT-2, otimizador Adam e loop de treinamento e inferência
- Treina em um dataset de nomes para gerar novos nomes, revelando os princípios centrais do GPT por meio de uma implementação própria de autograd e da estrutura Transformer
- Ao contrário dos LLMs de grande escala, funciona em Python puro sem dependências, deixando apenas a essência algorítmica
- Entender o microgpt ajuda a compreender a estrutura algorítmica fundamental de modelos grandes como o ChatGPT
Visão geral do microgpt
- microgpt é uma implementação mínima de GPT escrita em 200 linhas de código Python, sem dependência de bibliotecas externas
- Inclui dataset, tokenizer, autodiferenciação, estrutura semelhante ao GPT-2, otimizador Adam e loops de treinamento e inferência
- É um projeto artístico criado por Karpathy para simplificar LLMs até o nível da essência, na mesma linha de micrograd, makemore e nanogpt
- O código completo é disponibilizado em GitHub Gist, página web e Google Colab
Dataset
- Usa um arquivo de texto com cerca de 32.000 nomes, um por linha
- Cada nome é tratado como um documento, e o modelo aprende esse padrão para gerar novos nomes
- Exemplos gerados após o treinamento: kamon, ann, karai, jaire, vialan
Tokenizer
- Um tokenizer simples baseado em caracteres, que atribui um ID inteiro a cada caractere único
- Inclui as letras a–z e o token BOS (beginning of sequence), totalizando 27 tokens
- Cada documento é envolvido no formato
[BOS, e, m, m, a, BOS]para o treinamento
Autodiferenciação (Autograd)
- A classe
Valuerastreia valores escalares e gradientes, construindo o grafo computacional - Armazena os gradientes locais (local gradient) de operações básicas como soma, multiplicação, potência, log, exponencial e ReLU
- O método
backward()executa a retropropagação aplicando a regra da cadeia - O mesmo algoritmo de
.backward()do PyTorch é implementado manualmente no nível escalar
Inicialização de parâmetros
- O modelo tem cerca de 4.192 parâmetros
- É composto por tabela de embeddings, pesos de atenção, pesos da MLP, projeção de saída etc.
- Cada parâmetro é inicializado com números aleatórios de distribuição gaussiana
Arquitetura do modelo
- Uma forma simplificada da estrutura GPT-2, usando RMSNorm, ReLU e conexões residuais (residual connection)
- Componentes principais:
- Etapa de embedding: soma embeddings de token e posição
- Atenção multi-head: calcula vetores Q, K e V e usa o cache KV para aproveitar informações de tokens anteriores
- Bloco MLP: rede feedforward de 2 camadas para computação local
- Etapa de saída: gera logits para o tamanho do vocabulário (27)
- O cache KV permanece ativo também durante o treinamento, e a retropropagação flui através do cache
Loop de treinamento
- Em cada passo, escolhe um documento e faz a tokenização como
[BOS, ... , BOS] - O modelo prevê a probabilidade do próximo token e calcula a perda de entropia cruzada
- Após calcular os gradientes com
loss.backward(), atualiza os parâmetros com o otimizador Adam - A taxa de aprendizado usa decaimento linear (linear decay)
- Ao longo de 1.000 passos, a perda cai de aproximadamente 3,3 → 2,37
Inferência (Inference)
- Após o treinamento, gera novos nomes começando com o token BOS
- Em cada etapa, amostra o próximo token com base nas probabilidades do softmax
- O valor de temperature controla a criatividade (mais baixo = mais conservador; mais alto = mais diversidade)
- Exemplo de saída: kamon, ann, karai, jaire, vialan, karia, yeran, anna
Como executar
- Pode ser executado apenas com Python (
python train.py) - O treinamento termina em cerca de 1 minuto, com o valor da perda sendo exibido a cada etapa
- Também pode ser executado da mesma forma em um notebook do Colab
Etapas de evolução do código
- Expansão gradual de
train0.pyatétrain5.py- Bigram → MLP → Autograd → Attention → Multi-head → Adam
- Cada etapa pode ser conferida nas revisões de build_microgpt.py no Gist
Diferenças em relação a LLMs reais
- Dados: microgpt usa 32K nomes; LLMs reais usam trilhões de tokens
- Tokenizer: nível de caractere vs. subwords baseadas em BPE
- Autograd: Python escalar vs. operações tensoriais em GPU
- Arquitetura: 4K parâmetros vs. centenas de bilhões de parâmetros
- Treinamento: repetição de documento único vs. treinamento em grande batch e precisão mista
- Otimização: Adam simples vs. hiperparâmetros e agendamento finamente ajustados
- Pós-processamento: evolui para a forma do ChatGPT por meio de etapas de SFT e RL
- Infraestrutura de inferência: distribuição em GPU, gerenciamento de cache KV, quantização, speculative decoding etc.
Resumo do FAQ
- O modelo é uma função matemática que transforma tokens de entrada em probabilidades do próximo token
- Não há “compreensão”; ele faz previsões por meio do aprendizado de padrões estatísticos
- Implementa em forma reduzida o mesmo loop de previsão de tokens do ChatGPT
- “Alucinação (hallucination)” é um resultado natural da amostragem probabilística
- É lento, mas reproduz completamente o algoritmo central dos LLMs
- Para resultados melhores, é possível ajustar passos de treinamento, tamanho do modelo e dataset
- Se trocar o dataset, ele pode aprender vários padrões, como nomes de cidades, nomes de Pokémon, poemas etc.
microgpt é um modelo educacional e experimental que implementa em escala mínima todos os algoritmos centrais de um LLM, servindo como exemplo que revela completamente o princípio de funcionamento de grandes modelos de linguagem.
1 comentários
Comentários do Hacker News
Alguém modificou o microgpt e criou um pequeno GPT que gera nomes coreanos
Também há uma página web que visualiza todo o processo — dá para explorar o pipeline inteiro, da tokenização à inferência
É possível testar diretamente no English GPT lab
Basta consultar o tutorial char_rnn do PyTorch
Tokenização, embeddings, atenção, perda·gradiente, treinamento, inferência e comparação com Real GPT estão muito bem explicados
O site em si está mais para uma visualização gerada por IA baseada no post original do blog
Eu fiz um port do microgpt para C++
Link do código
O código tem o dobro de linhas, mas é 10 vezes mais rápido
A parte mais difícil foi representar a classe Value em C++, e no fim usei shared_ptr
Eu estava curioso sobre o que exatamente é “alucinação (hallucination)”
O modelo apenas amostra tokens de uma distribuição de probabilidade; ele não tem noção de verdade
Isso leva à pergunta: será que um LLM poderia ter um score de confiança para a própria resposta?
Modelos pré-treinados são calibrados, mas isso se quebra depois do seguimento de instruções (post-training)
Pesquisas relacionadas: artigo1, artigo2
Como um intervalo de confiança sem conhecer a população em estatística, as probabilidades do LLM não têm conexão com o mundo real
No fim, um LLM é como alguém que só leu livros, sem experiência do mundo
Mas essa probabilidade não é “probabilidade de ser verdade”, e sim “probabilidade de eu emitir este token nesta situação”
Eu converti o microgpt para Rust para fins de estudo
microgpt-rs
A parte mais complicada foi representar a estrutura do grafo de autograd com tipos de Rust
Agora estou adaptando para rodar no navegador com WebAssembly e pretendo publicar no blog
O código do Karpathy é realmente poético e conciso no design
O código é bonito e fácil de ler, mas eu gostaria que houvesse uma explicação comentada linha por linha, como em backbone.js
Veja a documentação do Backbone
O projeto Docco também é uma ótima ferramenta feita pelo mesmo autor
Também existe uma versão HTML do código
blog do microgpt
Graças ao vídeo e ao código do Karpathy, sinto que finalmente entendi de verdade descida de gradiente, backpropagation e regra da cadeia pela primeira vez
Quando eu via só a matemática, ficava confuso, mas com o código tudo ficou claro
Pessoalmente, foi uma experiência quase como um grande senso de realização na vida
Como o Karpathy disse, para entender de verdade é importante tentar ensinar a outra pessoa
Surpreende que esse projeto só tenha aparecido no HN agora
Eu criei uma versão em JS com 35 linhas chamada PicoGPT, além de uma versão em Python,
e ela pode ser executada direto na web
É até um LLM ultracompacto que pode rodar por QR code
Threads relacionadas: link1, link2
Eu transformei o código do microgpt em um post de blog com visualizações
Link do blog
Ele mostra o fluxo do código de forma interativa enquanto você o acompanha
mas, na verdade, os quatro já estão incluídos no dataset
Ultimamente, a tendência ‘micro’ em IA tem sido interessante
Em vez de simplesmente aumentar os modelos, modelos pequenos e focados estão ganhando mais eficiência
Na prática, uso o Gemini Flash para análise de domínio, e a relação velocidade/custo é muito melhor
Só a diferença de latência já muda o tipo de produto que dá para construir
Como ele é menor que o nanogpt, chamar de microgpt talvez não faça tanto sentido; acho que picogpt combinaria mais
Ainda assim, é um projeto muito legal