Como Treinar Seu Próprio ChatGPT por 50 Dólares?

Ashley Innocent

Ashley Innocent

19 março 2026

Como Treinar Seu Próprio ChatGPT por 50 Dólares?

Resumo

nanochat é o framework de treinamento de LLM de código aberto de Andrej Karpathy que permite treinar um chatbot de nível GPT-2 por menos de US$50 em cerca de 2 horas. O projeto utiliza um único nó de GPU 8xH100, código mínimo (~500 linhas para o modelo central) e um único seletor de configuração (--depth) para otimizar automaticamente todos os hiperparâmetros. Registros atuais mostram a conclusão do treinamento em 1,65 horas com uma pontuação CORE de 0,2626, superando o GPT-2 da OpenAI de 2019 que custou US$43.000 e levou 168 horas.

Introdução

Treinar um grande modelo de linguagem costumava exigir milhões de dólares e uma equipe de pesquisadores com doutorado. Esses dias acabaram.

Andrej Karpathy acaba de lançar o nanochat, um projeto de código aberto que treina uma IA conversacional capaz por menos do custo de um bom jantar. Todo o pipeline roda em um único nó de GPU 8xH100 e é concluído em menos de 2 horas.

Por Que Isso Importa Agora

O cenário da IA mudou drasticamente no início de 2026. O que levou 168 horas e US$43.000 à OpenAI em 2019, agora leva 1,65 horas e US$48. Isso representa uma aceleração de 100x impulsionada por melhorias algorítmicas, hardware superior e otimização da comunidade.

Para desenvolvedores de API e equipes que constroem aplicações baseadas em IA, isso muda tudo. Agora você pode experimentar o treinamento de modelos personalizados, testar mudanças arquitetônicas e entender os internos de LLMs sem orçamentos massivos de infraestrutura.

💡
Combine isso com plataformas de desenvolvimento de API como Apidog para testar e documentar seus serviços de IA, e você terá uma stack completa para construir aplicações de IA em produção.
botão

O Que Você Aprenderá

Ao final deste artigo, você entenderá:

O Que É o nanochat?

nanochat é um sistema mínimo de treinamento de LLM que cobre todo o pipeline de desenvolvimento: tokenização, pré-treinamento, ajuste fino (finetuning), avaliação, inferência e uma UI web semelhante ao ChatGPT.

O código-base cabe em um único repositório, sem monstros de configuração ou complexidade de framework. Karpathy o projetou como uma "linha de base forte" que é legível, hackeável e forkeável.

A Principal Afirmação

Treine um modelo com capacidade de GPT-2 (1.6B parâmetros) por:

Para contextualizar, o treinamento original do GPT-2 da OpenAI em 2019 custou aproximadamente US$43.000 e levou 7 dias em 32 chips TPU v3.

O Que o nanochat Abrange

Estágio Script Descrição
Tokenização scripts.tok_train Treina o tokenizador BPE (vocabulário de 32.768)
Pré-treinamento scripts.base_train Treina o modelo GPT base
Ajuste Fino scripts.chat_sft Ajuste fino supervisionado para chat
Avaliação scripts.base_eval Métrica CORE, bits-por-byte
Inferência scripts.chat_cli Interface de chat CLI
UI Web scripts.chat_web Interface web semelhante ao ChatGPT

A Filosofia: Um Único Seletor Para Controlar Tudo

A maioria dos frameworks de LLM te afoga em arquivos de configuração. O nanochat adota a abordagem oposta.

Todo o sistema gira em torno de um parâmetro: --depth (o número de camadas do transformador).

# Modelo do tamanho do GPT-1
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=12

# Modelo com capacidade de GPT-2
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=24

# Indo além dos limites
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=26

Defina a profundidade, e o nanochat calcula todo o resto automaticamente:

Essa filosofia de "um único seletor" possibilita o que Karpathy chama de minissérie nanochat: uma família de modelos otimizados para computação em diferentes tamanhos, todos treinados com a mesma abordagem baseada em princípios.

Por Que Isso Funciona

A equipe mediu leis de escala em dezenas de execuções de treinamento. Eles encontraram relações previsíveis entre profundidade, largura, tamanho do batch e duração do treinamento. Em vez de expor todos esses controles, o nanochat codifica essas relações diretamente no script de treinamento.

Você obtém treinamento otimizado para computação sem precisar de um doutorado em deep learning.

O Ranking: Correndo para Superar o GPT-2

O nanochat mantém um ranking público que acompanha o tempo para atingir a capacidade do "GPT-2". O objetivo é superar a pontuação CORE original da OpenAI de 0,256525 em 22 tarefas de avaliação (ARC, MMLU e outras do conjunto de benchmarks DCLM).

Recordes Atuais

Execução Modelo Tempo Pontuação CORE Inovação Chave
GPT-2 Original 1.6B 168 horas 0.2565 Linha de base OpenAI 2019
Execução 1 d24 3.04 horas 0.2585 Linha de base inicial
Execução 2 d26 2.91 horas 0.2578 Treinamento FP8
Execução 3 d26 2.76 horas 0.2602 Tamanho de batch de 1M tokens
Execução 4 d24 2.02 horas 0.2571 Dataset ClimbMix
Execução 5 d24 1.80 horas 0.2690 Otimizações descobertas por IA
Execução 6 d24 1.65 horas 0.2626 Melhora no smear/backout

Como a IA Descobriu Otimizações

As execuções 5 e 6 incorporaram mudanças do sistema de "auto-pesquisa" de Karpathy. Um agente de IA explorou modificações arquitetônicas em pequenos modelos d12 (execuções de treinamento de 5 minutos), então traduziu as mudanças vencedoras para a configuração d24 completa.

O sistema encontrou melhorias para:

Essas mudanças reduziram o tempo de treinamento de 2,02 horas para 1,65 horas, uma melhoria de 19% descoberta através de experimentação autônoma.

Como o nanochat Funciona

O código-base contém aproximadamente 3.000 linhas em seus módulos centrais. Vamos examinar cada componente.

1. O Modelo GPT (nanochat/gpt.py)

O transformador segue as melhores práticas modernas com várias otimizações:

Recursos da Arquitetura:

Embeddings de Valor (ResFormer):Camadas alternadas incluem embeddings de valor aprendíveis misturados via gating dependente da entrada:

# Resíduo de valor: mistura o embedding de valor com gate por cabeça
if ve is not None:
    ve = ve.view(B, T, self.n_kv_head, self.head_dim)
    gate = 3 * torch.sigmoid(self.ve_gate(x[..., :self.ve_gate_channels]))
    v = v + gate.unsqueeze(-1) * ve

Isso adiciona capacidade sem uma sobrecarga de computação significativa.

Truques de Eficiência:

O modelo inclui três mecanismos aprendidos que melhoram a dinâmica do treinamento:

# 1. Escalonamento residual por camada
x = self.resid_lambdas[i] * x + self.x0_lambdas[i] * x0

# 2. Smear: mistura o embedding do token anterior para informação de bigrama
gate = self.smear_lambda * torch.sigmoid(self.smear_gate(x[:, :, :24]))
x = x + gate * x_pre_smear

# 3. Backout: subtrai o resíduo da camada intermediária
x = x - self.backout_lambda * x_backout

2. O Otimizador Muon (nanochat/optim.py)

O nanochat usa uma estratégia de otimizador mista:

Tipo de Parâmetro Otimizador Propósito
Embeddings, lm_head AdamW Otimização adaptativa padrão
Parâmetros escalares AdamW Fatores de escala aprendidos
Matrizes 2D Muon Atualizações ortogonalizadas

Muon (Momento Ortogonalizado por Newton-Schulz):

O otimizador Muon ortogonaliza as atualizações de peso usando uma iteração quíntica de Newton-Schulz chamada "Polar Express":

# Coeficientes Polar Express (5 iterações)
polar_express_coeffs = [
    (8.156, -22.483, 15.879),
    (4.043, -2.809, 0.500),
    # ... mais coeficientes
]

# Loop de ortogonalização
for a, b, c in polar_express_coeffs[:ns_steps]:
    A = X.mT @ X
    B = b * A + c * (A @ A)
    X = a * X + X @ B

Redução de Variância NorMuon:

Após a ortogonalização, as atualizações são normalizadas por neurônio para evitar o colapso da escala:

v_mean = g.float().square().mean(dim=red_dim, keepdim=True)
v_norm = v_mean.sum(dim=(-2, -1), keepdim=True).sqrt()
final_scale = step_size * (v_norm / v_norm_new.clamp_min(1e-10))
g = g * final_scale.to(g.dtype)

Treinamento Distribuído:

Para configurações multi-GPU, o otimizador implementa o sharding estilo ZeRO-2 com comunicação assíncrona de três fases:

Fase 1: Inicia todas as operações assíncronas reduce_scatter
Fase 2: Aguarda as reduções, calcula as atualizações, inicia os all_gathers
Fase 3: Aguarda os gathers, copia de volta os parâmetros atualizados

Isso sobrepõe a comunicação com a computação, maximizando a utilização da GPU.

3. Gerenciamento de Precisão (nanochat/common.py)

O nanochat gerencia a precisão explicitamente em vez de usar torch.amp.autocast:

Hardware dtype Padrão Razão
CUDA SM 80+ (A100, H100) bfloat16 Cores de tensor BF16 nativos
CUDA SM < 80 (V100, T4) float32 Sem suporte a BF16
CPU / MPS float32 Sem cores de precisão reduzida

A camada Linear personalizada converte os pesos para corresponder ao dtype de computação durante o forward pass:

class Linear(nn.Linear):
    def forward(self, x):
        return F.linear(x, self.weight.to(dtype=x.dtype))

Os pesos mestres permanecem em FP32 para a precisão do otimizador. Para GPUs H100 e Blackwell, o treinamento FP8 está disponível via --fp8, convertendo a maioria das camadas para Float8Linear com escalonamento por tensor.

4. Carregamento de Dados (nanochat/dataloader.py)

O dataloader usa empacotamento best-fit alinhado ao BOS:

Isso garante que cada token possa referenciar o BOS e ver o contexto completo do documento.

# Encontra o maior documento que cabe inteiramente
best_idx = -1
best_len = 0
for i, doc in enumerate(doc_buffer):
    doc_len = len(doc)
    if doc_len <= remaining and doc_len > best_len:
        best_idx = i
        best_len = doc_len

if best_idx >= 0:
    doc = doc_buffer.pop(best_idx)
    # Adiciona o documento completo
else:
    # Corta o documento mais curto para preencher o espaço restante

5. Unificação do Flash Attention (nanochat/flash_attention.py)

O projeto fornece uma interface unificada que alterna automaticamente entre FA3 e PyTorch SDPA:

from nanochat.flash_attention import flash_attn

# Funciona em qualquer hardware - seleciona automaticamente o melhor backend
y = flash_attn.flash_attn_func(q, k, v, causal=True, window_size=window_size)

Em GPUs Hopper com bfloat16, ele usa Flash Attention 3. Em todos os outros lugares, ele retorna à atenção de produto escalar escalonado do PyTorch.

6. Motor de Inferência (nanochat/engine.py)

A classe Engine lida com a geração eficiente com:

O motor coordena o fluxo da conversação, incluindo a forçagem de tokens de saída de ferramentas quando o modelo invoca a calculadora.

Passo a Passo: Treine Seu Próprio Modelo

Todo o pipeline reside em runs/speedrun.sh. Veja como executá-lo.

Pré-requisitos

Passo 1: Configuração do Ambiente

# Instalar uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Criar e ativar ambiente virtual
uv venv
source .venv/bin/activate

# Instalar dependências
uv sync --extra gpu

Passo 2: Baixar Dados de Treinamento

# Baixar ~2B caracteres do dataset ClimbMix
python -m nanochat.dataset -n 170

# Isso baixa ~170 shards de ~100MB cada
# Total: ~17 GB comprimidos

O script baixa shards de dados de pré-treinamento com bloqueio de arquivo para lidar com a coordenação multi-rank.

Passo 3: Treinar o Tokenizador

# Treina o tokenizador BPE com vocabulário de 32.768
python -m scripts.tok_train

# Avalia a taxa de compressão
python -m scripts.tok_eval

O tokenizador usa um padrão de divisão estilo GPT-4 com BPE de fallback de byte. O treinamento é concluído em ~10 minutos em 2B caracteres.

Passo 4: Pré-treinar o Modelo Base

# Treina o modelo d24 (capacidade GPT-2)
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
    --depth=24 \
    --target-param-data-ratio=8 \
    --device-batch-size=16 \
    --fp8 \
    --run=my-first-model

Parâmetros chave:

Tempo de execução esperado: ~2 horas.

Passo 5: Ajuste Fino Supervisionado

# Baixar conversas de identidade
curl -L -o ~/.cache/nanochat/identity_conversations.jsonl \
    https://karpathy-public.s3.us-west-2.amazonaws.com/identity_conversations.jsonl

# Executar SFT para capacidade de chat
torchrun --standalone --nproc_per_node=8 -m scripts.chat_sft -- \
    --device-batch-size=16 \
    --run=my-sft

Isso ensina ao modelo o formato de conversação, tokens especiais e uso de ferramentas.

Passo 6: Conversar Com Seu Modelo

# Chat CLI
python -m scripts.chat_cli -p "Por que o céu é azul?"

# Ou iniciar a UI web
python -m scripts.chat_web

A UI web roda na porta 8000 e fornece uma interface semelhante ao ChatGPT.

Fluxo de Trabalho de Pesquisa: Experimentação Rápida

Para testar novas ideias, use modelos menores para uma iteração mais rápida.

Experimentos Rápidos (~5 minutos)

OMP_NUM_THREADS=1 torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
    --depth=12 \
    --run="d12-test" \
    --core-metric-every=999999 \
    --sample-every=-1 \
    --save-every=-1

Isso treina um modelo d12 (tamanho GPT-1) com log mínimo. Perfeito para testar mudanças arquitetônicas.

Métricas a Monitorar

Acompanhe estas no Weights & Biases:

  1. val_bpb: Bits-por-byte de validação (perda independente do tamanho do vocabulário)
  2. core_metric: Pontuação de avaliação DCLM CORE
  3. train/mfu: Utilização de FLOPS do modelo (eficiência de hardware)
  4. train/tok_per_sec: Vazão de treinamento

Requisitos de Teste

Qualquer melhoria deve funcionar em todas as profundidades (d12 a d26). Isso evita o overfitting a um único tamanho de modelo e garante avanços baseados em princípios.

Por Que o nanochat Importa

Acessibilidade de Custo

Abordagem Custo Tempo Hardware
OpenAI GPT-2 (2019) $43.000 168 horas 32 TPU v3
nanochat (2026) $48 2 horas 8xH100
nanochat spot ~$15 2 horas 8xH100 spot

Isso torna o treinamento de LLMs acessível a:

Valor Educacional

O código-base serve como um recurso de aprendizado:

Estudantes podem ler, modificar e experimentar um pipeline completo de LLM.

Velocidade de Pesquisa

Reduzir o treinamento de dias para horas permite:

Transparência

Cada escolha de design é documentada:

Limitações e Verificação da Realidade

O nanochat é impressionante, mas possui limites claros.

Requisitos de Hardware

O valor de US$48 assume acesso a um nó 8xH100. Os custos de aluguel em nuvem variam:

Você precisará de ~$50-100 para uma execução completa, dependendo do provedor.

Teto de Capacidade

O nanochat alcança desempenho de nível GPT-2 (tecnologia de 2019). Isso significa:

O que ele pode fazer:

O que ele não pode fazer:

Pense nele como uma criança do jardim de infância: capaz de conversação básica, mas não de trabalho de nível especialista.

Requisitos de Dados

A execução completa (speedrun) baixa:

Você precisará de armazenamento e largura de banda adequados.

Limitações da Métrica

A pontuação CORE mede 22 tarefas, mas não captura:

Diferentes sementes aleatórias produzem uma variância CORE de ~0,016. Seus resultados podem variar.

FAQ

Quanto custa para treinar um modelo com nanochat?

Aproximadamente US$48 sob demanda (US$24/hora × 2 horas) ou ~$15 em instâncias spot. Isso cobre apenas o pré-treinamento. Adicione ~30 minutos para SFT.

Qual GPU eu preciso?

Mínimo: Uma única GPU (qualquer GPU de datacenter moderna). Ótimo: 8xH100 ou 8xA100 para o treinamento mais rápido. O código escala de 1 GPU para 8 GPUs com acumulação automática de gradientes.

Quanto tempo leva o treinamento?

De 1,65 a 3 horas, dependendo da configuração e do hardware. O recorde atual no ranking é de 1,65 horas para um modelo d24.

O que é a métrica CORE?

A pontuação DCLM CORE avalia modelos em 22 tarefas, incluindo ARC (perguntas científicas), MMLU (compreensão de linguagem multi-tarefa) e outros benchmarks. O GPT-2 obteve 0,256525. O nanochat regularmente excede 0,26.

Posso treinar em uma única GPU?

Sim. Omita torchrun e o código usará automaticamente a acumulação de gradientes. O treinamento levará 8× mais tempo, mas produzirá resultados quase idênticos.

Qual dataset o nanochat usa?

O melhor atualmente usa ClimbMix (dataset web curado pela NVIDIA). Versões anteriores usavam FineWeb-EDU. O tokenizador treina em ~2B caracteres dos primeiros ~8 shards.

O nanochat funciona em Apple Silicon?

Sim. O código roda em MPS (Metal Performance Shaders) com precisão float32. O treinamento é mais lento que CUDA, mas funcional para experimentação.

Posso retomar o treinamento de um checkpoint?

Sim. Use --resume-from-step=<step> para continuar a partir de um checkpoint salvo. O estado do dataloader também é salvo para uma retomada exata.

Qual a diferença entre nanochat e nanoGPT?

nanoGPT cobria apenas o pré-treinamento. nanochat se estende a todo o pipeline: tokenização, pré-treinamento, SFT, RLHF, avaliação, inferência e UI web.

Conclusão

O nanochat prova que o treinamento de LLM não exige mais orçamentos massivos ou infraestrutura especializada. O que custava US$43.000 em 2019, agora custa menos de US$50.

O impacto do projeto se estende além da redução de custos brutos. Ao fornecer uma base de código mínima e legível com uma interface de "um único seletor", Karpathy criou tanto uma ferramenta de pesquisa quanto um recurso educacional.

Principais Conclusões

Próximos Passos

Pronto para treinar seu próprio modelo? Comece com o repositório nanochat e o script runs/speedrun.sh.

Para desenvolvedores de API que constroem aplicações baseadas em IA, entender os detalhes internos do treinamento de LLMs nunca foi tão acessível. A barreira de entrada caiu de "startup financiada por capital de risco" para "projeto de fim de semana".

botão

Pratique o design de API no Apidog

Descubra uma forma mais fácil de construir e usar APIs