O Que um Modelo de Linguagem Prevé
Um Motor de Continuação Probabilística
Um modelo de linguagem recebe uma sequência de tokens & atribui uma distribuição de probabilidade sobre qual token vem em seguida. Alimente-o com the cat sat on the & ele gera probabilidades em todo o vocabulário: alta massa em mat, floor, couch; baixa massa em xylophone, Tuesday.
Amostrando essa distribuição, anexando um token, & alimentando de volta: esse loop gera texto um token por vez. Geração autoregressiva, nomeada porque cada passo regride sobre sua própria saída anterior.
Três Números Definem um Modelo de Linguagem
Tamanho do vocabulário (V). Quantos tokens distintos um modelo pode produzir. ANDREA-12M usou 4.353 tokens; ANDREA-120M usa 8.449.
Janela de contexto (T). Quantos tokens cabem em uma passada forward. Modelos ANDREA usam T = 1.024.
Contagem de parâmetros (P). Quantos pesos aprendidos vivem dentro. 12M, 120M e 480M nomeiam uma família por P.
Uma Família de Três
| Variante | d_model | Cabeças | Camadas | Contexto | Parâms |
|---|---|---|---|---|---|
| ANDREA-12M | 384 | 12 | 6 | 1024 | 12.8M |
| ANDREA-120M | 768 | 12 | 12 | 1024 | ~120M |
| ANDREA-480M | 1536 | 24 | 16 | 1024 | ~480M |
Três knobs de escala: d_model (largura de cada vetor interno), n_layer (profundidade dos blocos transformer empilhados), n_head (projeções de atenção paralelas). Vocabulário & contexto permanecem fixos na família.
Lendo a Tabela da Família
Por Que o Pequeno Importa
Restrição como Libertação
Modelos de linguagem grandes com centenas de bilhões de parâmetros exigem milhares de GPUs, conjuntos de dados proprietários e orçamentos corporativos. Poucas pessoas conseguem treinar um. Poucas pessoas conseguem reparar um.
Um pequeno modelo de linguagem em uma única GPU inverte isso. Qualquer pessoa com uma 4090 (ou uma 3060) pode reproduzir ANDREA a partir de dados abertos. A receita de treinamento serve também como cartão do modelo. Código aberto, pesos abertos, dados abertos; proveniência completa em 72 horas de computação.
Capacidade vs Qualidade
Modelos menores não conseguem memorizar seu corpus de treinamento. ANDREA-12M, com 12,8M parâmetros, não tem capacidade para armazenar conteúdo factual; ele aprende estrutura de turnos, distribuição de vocabulário e forma de resposta. ANDREA-120M, com capacidade 10× maior, aprende recall factual, coerência multi-parágrafo e amplitude de domínio (verificado por avaliação externa com nota 9,5/10 em amostras de biologia e processamento de sinais).
A lição principal: a capacidade define um teto. O currículo decide se o teto é atingido. As Atividades 14-23 cobrem o currículo. [TITLE decoder_only/]
Três Sabores de Transformer
Encoder, Decoder, Ambos
O Transformer original (Vaswani et al., 2017) trouxe um encoder & um decoder, colados juntos para tradução. Três linhagens arquiteturais descendem desse paper:
Apenas Encoder (linhagem BERT). Atenção bidirecional, sem máscara causal. Otimizado para classificação, não geração. Um token vê tanto seu passado quanto seu futuro durante o treinamento.
Encoder-decoder (T5, BART). O encoder lê a entrada; o decoder gera a saída, atendendo ao encoder via cross-attention. Usado para tradução, sumarização.
Decoder-only (GPT, ANDREA). Máscara causal: cada token vê apenas seu passado. Treinado para prever o próximo token. Geração é gratuita; treinamento & inferência compartilham o mesmo forward pass.
Por que Decoder-Only Vence em Uma GPU
Três razões:
1. Objetivo único. Previsão do próximo token funciona em qualquer texto. Não precisa de par fonte/alvo.
2. Simetria entre treinamento & inferência. Mesmo forward pass, sem lógica especial de geração.
3. Simplicidade de memória. Sem cross-attention; uma pilha de camadas; um fluxo de ativações.
ANDREA herda a escolha decoder-only do microGPT, que herdou do nanoGPT, que herdou do GPT-2. A linhagem permanece padrão; o que muda está na tokenização, infraestrutura de treinamento & currículo.
Por que Decoder-Only para ANDREA
O Que Cabe em 24 GB
Bytes Por Parâmetro
Uma RTX 4090 vem com 24 GB de VRAM. O treinamento do ANDREA-12M usou 1,4 GB. O ANDREA-120M usou substancialmente mais. A diferença remete a um simples exercício de contabilidade: cada parâmetro aparece várias vezes na memória durante o treinamento.
Para cada parâmetro, o treinamento mantém:
- O peso em si (1× peso)
- Primeiro momento de Adam (m): mesmo formato que o peso (1× peso)
- Segundo momento de Adam (v): mesmo formato que o peso (1× peso)
- Gradientes: mesmo formato que o peso (1× peso)
- Ativações & temporárias: ~2-4× peso (varia com lote & contexto)
Total: ~6-8× a contagem de pesos, em bytes determinada pela precisão.
Precisão Multiplica Tudo
| Precisão | Bytes/parâmetro | Total para 120M pesos | Notas |
|---|---|---|---|
| FP32 | 4 | 480 MB | Base; mais seguro, mais lento |
| FP16 | 2 | 240 MB | cuBLAS, metade da memória |
| FP8 E4M3 | 1 | 120 MB | Tensor cores, risco de NaN |
Multiplique por 6-8× para a pegada completa no tempo de treinamento. ANDREA-120M treina confortavelmente em FP16 (~2 GB para pesos + otimizador + grads); FP8 E4M3 reduz pela metade o tempo de treinamento nos tensor cores da RTX 4090.
A Atividade 13 (grow_a_language_model_precision) explora em detalhes os tradeoffs de precisão FP.
Dimensionando o Estado do Otimizador do ANDREA-120M
Vinte e Cinco Atividades
Duas Metades
Este curso se divide de forma clara. A primeira metade cobre o que o microGPT ensinou ao campo: um transformer que roda em uma única GPU. A segunda metade cobre a contribuição real da ANDREA: um currículo que aprende.
Metade 1: Um Transformer em Uma GPU (atividades 2-13)
| # | Atividade | Batida |
|---|---|---|
| 2 | Tokenizador de morfemas Harris | segmentação distribucional, vocabulário 256+N+1 |
| 3 | Alinhamento tokenizer-diet | ponto de saturação, por que 12M desperdiçaram 63,6% |
| 4 | Embeddings & posição | token aprendido + consulta de posição |
| 5 | Atenção de produto escalar | Q·Kᵀ/√d, máscara causal, softmax |
| 6 | Atenção multi-cabeça | divisões de cabeças, projeções paralelas |
| 7 | Bloco Transformer | MLP, resíduos, normalização de camada |
| 8 | Entropia cruzada & perplexidade | log-verossimilhança, perda SMMA |
| 9 | Backprop em CUDA personalizado | regra da cadeia através de microgpt_cuda.cu |
| 10 | AdamW | decaimento de peso desacoplado; por que o Adam vanilla morreu |
| 11 | Aquecimento de LR + decaimento cosseno | rampa de 2000 passos; por que pico instantâneo destrói 120M |
| 12 | Clipagem de gradiente | norma L2 global; 3 kernels CUDA |
| 13 | FP32 / FP16 / FP8 E4M3 | tradeoffs de precisão; tensor cores |
Metade 2: Um Currículo Que Aprende (atividades 14-24)
| # | Atividade | Destaque |
|---|---|---|
| 14 | Multi-armed bandits | UCB1, exploração vs exploração |
| 15 | Controle de dados baseado em fases | fases 7/14/21/28/42, dados 1d3/1d4 |
| 16 | Atribuição de recompensas & EMA | EMA de perda por fonte, escalonamento 1000× |
| 17 | Pisos de fontes & penalidade de época | 1/(1+epochs) previne memorização |
| 18 | Bônus de cobertura | rastreamento em nível de doc, 1.3× frescor |
| 19 | Aquecimento curricular | 7 fontes de chat/prosa nos primeiros 20K passos |
| 20 | Filtragem por forma, não por caracteres | has_system_prompt_shape() |
| 21 | Parada antecipada com porta de coerência | bigram/trigram/word/char auto-halt |
| 22 | Checkpoint, retomada, sinais | format, SIGTERM/SIGUSR1, continuidade loss.json |
| 23 | Auditoria de amostra & avaliação externa | leitura de uma execução, território 9.5/10 |
| 24 | De microGPT a ANDREA-120M | colapso v1, correções v2, patch v2.5, polimento v3 |
Além disso, um companheiro: geometry_of_andrea vê cada camada como geometria (espaço de embedding, atenção como projeção, superfície de perda, bandit como uma caminhada em um simplex discreto).
Ordem Sugerida
As atividades 2-13 constroem um transformer funcional. Pule para a metade 2 se você já treinou transformers antes; volte quando a curiosidade bater.
Cada atividade é independente onde possível. Referências matemáticas citam atividades anteriores pelo nome (veja atividade 5: atenção de produto escalar normalizado). Referências de código apontam para microgpt/microgpt_cuda.cu & microgpt/training_proxy.py em ~/git/uncloseai-cli/.