- O nanochat de Andrej karpathy é um projeto open source para construir você mesmo um LLM conversacional parecido com o ChatGPT com um orçamento de US$ 100
- Todo o pipeline (tokenização, pré-treinamento, midtraining, fine-tuning, avaliação, inferência e serviço web) foi implementado de forma concisa e hackeável
- Em um único nó com 8 GPUs H100, o treinamento termina em menos de 4 horas com um único script; o modelo d26, que mira desempenho em nível de GPT-2, leva cerca de 12 horas por aproximadamente US$ 300, e o tier de US$ 1.000 leva 41,6 horas
- Com um codebase extremamente enxuto de 8.300 linhas e 44 arquivos, totalizando 330 KB, ele oferece uma baseline poderosa, fácil de ler e fácil de dar fork, sem objetos de configuração complexos nem model factories
- Está sendo desenvolvido como projeto capstone do curso LLM101n da Eureka Labs, com o objetivo de melhorar o estado da arte de micromodelos acessíveis com orçamento abaixo de US$ 1.000
Visão geral do projeto nanochat
- O nanochat é um projeto open source criado para desenvolvedores que querem implementar um LLM conversacional semelhante ao ChatGPT por US$ 100
- Todo o codebase foi escrito de forma única, legível, com poucas dependências e concisa, facilitando modificações e experimentos
- Oferece um ambiente para gerenciar de uma vez só todo o processo, de pretraining, finetuning, avaliação, inferência até a web UI
- Com o script speedrun.sh, é possível executar automaticamente todo o pipeline, permitindo que até iniciantes comecem com facilidade
- Foi projetado com dependências mínimas e uma estrutura hackeável, ideal para fins educacionais por ser fácil de entender e modificar
- O projeto será usado como capstone do curso LLM101n em desenvolvimento na Eureka Labs
Início rápido (Quick Start)
- Em um ambiente com GPU, especialmente um nó 8XH100, executar o speedrun.sh configura o processo de treinamento e inferência em cerca de 4 horas
- Considerando US$ 24 por hora em um nó 8XH100, o tempo total é de 4 horas
- Recomenda-se executar dentro de uma sessão screen para monitoramento estável mesmo durante treinamentos longos
- Use o comando
screen -L -Logfile speedrun.log -S speedrun bash speedrun.sh
- Depois, desanexe com
Ctrl-a d e acompanhe o progresso com tail speedrun.log
- Quando o treinamento termina, é possível fazer perguntas livremente ao LLM em uma web UI simples e ver os resultados na janela de conversa
python -m scripts.chat_web
- Um modelo no nível de 4e19 FLOPs oferece capacidade de conversa equivalente à de uma criança pequena
- Pode receber pedidos para criar histórias ou poemas
- É possível observar fenômenos de alucinação
- Consegue responder perguntas básicas, como por que o céu é azul
- Os resultados do treinamento e vários indicadores de desempenho são salvos em
report.md
Relatório de resultados de treinamento
- O arquivo
report.md inclui o "boletim" da execução de treinamento
- Fornece vários indicadores e métricas de avaliação
- A tabela de resumo final mostra o desempenho por etapa: BASE, MID, SFT e RL
- Estatísticas do codebase
- Número de caracteres: 333.989
- Número de linhas: 8.304
- Número de arquivos: 44
- Número de tokens (aprox.): 83.497
- Dependências (linhas de
uv.lock): 2.004
- Exemplos de desempenho em benchmarks
- CORE: 0.2219 (BASE)
- ARC-Challenge: 0.2875 (MID), 0.2807 (SFT)
- GSM8K: 0.0250 (MID), 0.0455 (SFT), 0.0758 (RL)
- HumanEval: 0.0671 (MID), 0.0854 (SFT)
- Tempo total gasto: 3 horas e 51 minutos
- O desempenho do modelo é inferior ao do ChatGPT, mas a ênfase está na experiência de implementar um LLM com baixo orçamento
Modelos maiores (Bigger Models)
- Não é possível treinar um clone de ChatGPT de alto desempenho por US$ 100, e LLMs reais são conhecidos por exigir gastos de capital na casa dos milhões de dólares
- Existem duas escalas adicionais de interesse
- Tier de cerca de US$ 300 para o modelo d26 (
depth=26): cerca de 12 horas de treinamento, superando ligeiramente a pontuação CORE do GPT-2
- Tier de US$ 1.000: cerca de 41,6 horas, um número redondo e limpo
- Ajustes no
speedrun.sh para treinar o modelo d26
- É necessário baixar mais shards de dados
- Calcular o número de tokens multiplicando o número de parâmetros por 20
- Calcular o número de caracteres multiplicando por 4,8
- Calcular o número de shards dividindo por 250 milhões (são necessários cerca de 450)
- Usar a opção
--depth=26 e reduzir o device_batch_size pela metade, de 32 para 16, para evitar OOM
- Na etapa de midtraining, também é preciso usar o mesmo
device_batch_size
Requisitos do ambiente de computação
- Também pode rodar em um nó 8XA100 GPU, embora seja um pouco mais lento
- Também pode rodar em uma única GPU
- Ao omitir o
torchrun, os resultados ficam praticamente iguais
- Troca automaticamente para gradient accumulation
- Leva 8 vezes mais tempo
- Para GPUs com menos de 80 GB de VRAM, é preciso ajustar os hiperparâmetros
- Reduzir
--device_batch_size de 32 (padrão) para 16, 8, 4, 2 ou 1 para liberar memória
- Para definir abaixo de 1, será preciso uma abordagem mais criativa
- Por ser baseado em PyTorch puro, pode suportar vários ambientes, como xpu e mps
- Isso não vem pronto por padrão, então são necessárias pequenas modificações
Utilidade e acessibilidade
- A maior vantagem do nanochat é que é fácil empacotar todos os arquivos de uma vez e fazer perguntas sobre eles em outros LLMs, serviços de busca documental etc.
- Exemplo de uso do utilitário files-to-prompt
- Inclui arquivos py, md, rs, html, toml e sh
- Exclui a pasta
rustbpe/target
- Seleciona o formato de saída cxml
- Empacota cerca de 330 KB (aprox. menos de 100 mil tokens), 45 arquivos e 8 mil linhas de código
- Recomenda-se usar o DeepWiki
- Basta trocar
github.com por deepwiki.com na URL do GitHub para fazer perguntas sobre o repositório
- Fornecido pela Devin/Cognition
Contribuição e direção do projeto
- O nanochat é um projeto ainda inacabado
- O objetivo é melhorar o estado da arte de micromodelos que podem ser construídos de ponta a ponta com orçamento abaixo de US$ 1.000
- A acessibilidade não envolve só custo, mas também complexidade cognitiva
- Não há objetos gigantes de configuração, model factories nem código-monstro de if-then-else
- Não é um "framework" de LLM totalmente configurável
- Um codebase único, consistente, mínimo, legível, hackeável e o mais fácil possível de dar fork, servindo como uma baseline poderosa
- Projetado para rodar do início ao fim e gerar um clone concreto de ChatGPT com seu respectivo boletim
1 comentários
Comentários do Hacker News
É um relato interessante de experiência usando ferramentas de IA para programação
Em certo momento, alguém perguntou ao Karpathy quanto código ele realmente escreveu por conta própria
Karpathy: obrigado pela pergunta; na prática, escrevi a maior parte do código à mão (usando autocompletar com tab)
Testei agentes do claude/codex algumas vezes, mas não ajudaram muito porque a precisão deixava a desejar
Talvez isso aconteça porque o repositório que criei está distante demais da distribuição dos dados
Link para a conversa original
A frase “o repositório está muito distante da distribuição dos dados” explica por que usar modelos de IA quase nunca me ajudou
Tudo o que faço é único demais e fica longe da distribuição
Fico feliz de ouvir isso de alguém confiável como o Karpathy
Quem acha que a AGI está logo ali talvez devesse moderar um pouco as expectativas
Eu também gosto do Claude Code
De vez em quando preciso escrever código web, e nessa área a cobertura dos dados de treino é tão boa que o Claude é muito melhor desenvolvedor web do que eu
Mas, quando vou mexer no núcleo algorítmico das minhas ferramentas de automação, o Claude tem muito menos com o que trabalhar e acaba cometendo mais erros
Ainda assim, no geral o saldo é positivo, então pago com prazer para usar
Mesmo que servisse só como assistente de desenvolvimento web, já seria uma grande ajuda
Acho que isso é, na verdade, algo natural
Estamos falando de uma situação em que se escreve código novo e original
Muita gente está criticando a resposta do Karpathy, mas o fato de ele ter tentado claude/codex sugere justamente que essas ferramentas já foram úteis para ele no passado
Outro link espelho do tweet do Karpathy aqui
É impressionante como o nanochat se inspirou no modded-nanoGPT
A linhagem é nano-GPT do Karpathy → modded-nanoGPT do Keller Jordan (uma versão para treinar modelos rapidamente) → NanoChat
O mais notável no modded-nanoGPT é treinar modelos GPT pequenos em velocidade extremamente alta
Em especial, ele usa o otimizador Muon (criado pelo próprio autor) nas camadas lineares em vez de AdamW
modded-nanoGPT, introdução ao Muon optimizer
O Muon é um otimizador criado pelo Keller Jordan para essa competição de treino rápido, com melhorias feitas por outras pessoas também
Em menos de um ano, ele já está sendo amplamente usado como SOTA em treinamento de modelos
É bem chocante rodar um único nó de inferência com 8xH100
Fico curioso se LLMs de fronteira usados em produção também rodam mais ou menos assim, ou se consomem ainda mais VRAM e computação
Dá cerca de US$ 8 por hora e, assumindo 5 segundos por requisição, seria possível atender algo em torno de 700 requisições
Ou seja, algo como 1 centavo por requisição
Queria saber se errei nas contas
O treinamento está realmente acontecendo agora mesmo (começou há 20 minutos)
Log público da execução
Daqui a 4 horas, quando o modelo estiver pronto, ele será compartilhado para que qualquer pessoa possa testar a inferência
O modelo final foi enviado para o Hugging Face
Não consegui resultados tão bons quanto os do Karpathy (azar no seed, talvez?)
Ainda assim, é divertido de testar
Por exemplo, perguntei: “quantas pernas um cachorro tem?”
Assistente: “Essa é uma pergunta realmente interessante, debatida há séculos entre amantes de cães. Não existe uma ‘resposta correta’ (...)”
No comentário ao lado do primeiro gráfico,
“A principal métrica de progresso. Bits per byte é, como o Karpathy disse, ‘uma métrica muito melhor do que a cross-entropy loss convencional. Ela normaliza a loss pelo número de bytes de cada token, o que permite comparações independentemente do tokenizer’”
A explicação foi tão clara que fiquei até com vergonha de não ter pensado nisso quando fiz meus experimentos de tokenizer no tinystories
Quero reanalisar o quão bom meu tokenizer realmente era
Seria ótimo ter um pequeno 'howto' explicando como rodar esse repositório treinando com W&B
Queria saber se alguém poderia compartilhar um passo a passo para um programador que nunca passou por um fluxo de treinamento de modelos
Muito legal!
O gerador de Shakespeare do Karpathy foi o primeiro projeto com que experimentei depois do ollama
Eu queria entender os princípios por trás dos LLMs
Desde a semana passada estou obcecado por LLMs e criando, do zero, um sistema de treinamento/inferência com dois backends
Tenho uma forte rejeição a rocm/pytorch por serem trabalhosos
Vulkan é bom. O llama-cpp também usa dessa forma
Na semana passada consegui fazer os backends de CPU/GPU funcionarem, e foquei em corrigir bugs no backend de GPU
Refatorei o código WGSL e melhorei a eficiência
Usei LLMs intensamente nesse processo, e foi uma virada surpreendentemente grande
Com prompts de refatoração, consegui corrigir erros passo a passo e no fim chegar a um código que até passa na checagem de tipos com astral ty
Acho difícil fazer uma escolha mais ineficiente do que essa
Testei o nanoGPT (link) neste fim de semana
É um projeto já meio antigo, mas uma prática excelente para criar e treinar você mesmo um pequeno GPT de Shakespeare
Rodei na CPU com cerca de 0,8M de parâmetros
O resultado ficou, mais ou menos como esperado, “ruim”
Ainda assim, deu para sentir um pouco de magia
Para quem não é especialista em deep learning e só gosta de experimentar e hackear coisas, é uma introdução perfeita
Ainda não consegui terminar de escrever no blog sobre minha experiência de fim de semana com nanoGPT... se tivesse terminado, teria postado aqui
É uma prática útil porque boas pesquisas de ML podem ser validadas em pequena escala
Este novo exemplo é mais avançado e cobre instruction following, tool use SFT e até RLVR
Isso acaba produzindo um baseline mais útil
Com um pequeno ajuste no código de Shakespeare e treinamento em outros dados, ele funciona surpreendentemente bem para gerar decks Commander de Magic The Gathering
“recebi conselhos do chief LLM whisperer Alec Radford”
Se algum dia existir um podcast com Alec e Andrej, acho que isso abalaria o mundo
Desde os tempos gloriosos do GPT1 até agora, em que se chega ao GPT3 em apenas 4 horas
Eureka Labs: link do Github
O Andrej é incrivelmente produtivo e impressionante
Só acompanhar o trabalho dele já é uma experiência e tanto
Sempre achei que a melhor forma de contribuir com a humanidade
é o produto de quantas pessoas eu consigo ajudar e o quão profundamente consigo ajudar cada uma delas
O trabalho open source do Karpathy, nesse sentido, é uma abordagem de alavancagem máxima
O mundo de hoje também foi construído sobre projetos open source
Graças à liberdade de qualquer pessoa no mundo poder aprender a programar de graça e criar software
Espero que a área de IA/LLMs siga essa direção positiva
Eu realmente gosto dessa tradição de gratuidade e compartilhamento no software
Mas, no caso dos LLMs, parece difícil manter isso por causa do custo altíssimo de treinamento e do hardware de alto desempenho necessário
Talvez, no futuro, o desenvolvimento de software também passe a pagar uma “renda” a hosts de LLM
Pode ser que surjam formas de tornar a inferência on-prem/local novamente acessível a todos
Mas, por enquanto, isso parece incerto por causa do alto custo de treinamento
E, quanto mais dependência houver de LLMs,
mais me preocupo que a produção de conteúdo “feito à mão”, como tutoriais para iniciantes em programação, acabe diminuindo aos poucos
(É um pouco longo, mas tudo vem de um desejo sincero por um mundo melhor)
Essa visão é um pouco diferente do sentimento “anti-IA” mais comum
A ideia de propriedade intelectual é, em certa medida, uma estrutura em que certas pessoas acumulam a posse da informação e a alugam para o restante da humanidade, em vez de contribuir diretamente com ela
Mas também é indispensável que criadores individuais consigam sustentar sua subsistência
Acho que não só o trabalho que o Karpathy faz, mas também o de milhares de criadores no YouTube, contribui enormemente para a sociedade em suas respectivas áreas
Ainda assim, é um pouco triste que tanta gente precise depender de patrocínios
Existe o Patreon, mas não é o ideal
Concordo que tudo isso é uma forma de contribuir muito para a sociedade
Recentemente, no Daily Show, Jon Stewart disse que o treinamento de IA é uma espécie de strip mining do conhecimento humano
Às vezes o treinamento de IA é tratado de forma unilateral como se fosse roubo, mas na realidade existem opiniões muito diversas
Essa tendência pode acabar consolidando uma estrutura hipercapitalista de propriedade do conhecimento,
em que a posse das ideias fica cada vez mais concentrada em poucas mãos
Esse fenômeno não ajuda muito o mundo como um todo e beneficia apenas alguns grupos
Até a negociação de propriedade intelectual tende, com o tempo, a se concentrar cada vez mais em menos atores
Acho que precisamos muito de debate e de novas interpretações adequadas à sociedade moderna
É uma pena que o derrotismo do tipo “os de cima vão bloquear isso, então discutir não adianta” acabe impedindo o debate
É importante discutir livremente como podemos chegar a soluções melhores
Costumo recomendar bastante a série de vídeos dele sobre ANN/LLM from scratch
As aulas são muito claras, e o estilo de código também é pythonic, conciso e fácil de ler
(a parte de vetorização em pytorch é complexa, mas isso é simplesmente um tema difícil)
Só de assistir aos vídeos e absorver o estilo, já ajuda muito todo mundo
Fico me perguntando se seria possível treinar um modelo com todos os livros, materiais, relatórios e artigos de psicologia que eu realmente possuo
e depois fazer inferência para perguntas especializadas quando necessário em um nó 1xH100 (link)
Na prática até dá para fazer, mas o desempenho seria extremamente ruim
Nesse caso, faz muito mais sentido pegar um modelo pequeno pré-treinado e fazer fine-tuning com os meus dados,
usar um fluxo de trabalho RAG (Retrieval Augmented Generation), ou combinar os dois
Dá para fazer
Mas usar um modelo generalista e inserir meus documentos no contexto de trabalho por vários meios diferentes (por exemplo: RAG, hierarchical memories da Apple etc. link para o artigo) pode dar resultados ainda melhores
Pode fazer, mas seu dataset em si é tão pequeno que o desempenho ficaria muito abaixo de um modelo pré-treinado com fine-tuning, ou de um modelo pequeno com RAG
Não
Esse projeto é realmente inspirador!
Seria bom conhecer exemplos reais de desempenho de prompts ou resultados de testes
foi mencionado que aqui há capturas de tela de prompts reais