Train Your Own LLM From Scratch - workshop prático para treinar seu próprio LLM do zero
(github.com/angelos-p)- Train Your Own LLM From Scratch é um workshop prático em que você escreve manualmente todas as partes do pipeline de treinamento de um GPT para entender o que cada componente faz e por que ele é necessário
- O objetivo é gerar texto no estilo de Shakespeare com um modelo GPT treinado do zero em um notebook, e ele foi reduzido para cerca de 10M de parâmetros para caber em uma única sessão do workshop
- Enquanto o nanoGPT busca reproduzir o GPT-2 de 124M de parâmetros, este projeto foi projetado para manter apenas o essencial e permitir treinamento em menos de 1 hora em um notebook
- Os componentes implementados manualmente são o Tokenizer, a arquitetura de modelo baseada em Transformer, o loop de treinamento e a geração de texto; no fim, você completa diretamente
model.py,train.pyegenerate.py - Como conhecimento prévio, basta estar confortável em ler código Python; não é necessário ter experiência em machine learning, e é preciso Python 3.12+
- O ambiente de execução oferece suporte a notebooks ou desktops Mac, Linux e Windows, e o treinamento usa automaticamente MPS em GPUs Apple Silicon, CUDA em GPUs NVIDIA ou CPU
- Para instalação local, recomenda-se o fluxo com uv executando
uv sync; se você não tiver ambiente local, também é possível enviar os arquivos para o Google Colab e executar com!python train.py - O workshop cobre em sequência tokenizer em nível de caractere, embeddings, self-attention, LayerNorm, blocos MLP, função de perda, AdamW, gradient clipping, agendamento de taxa de aprendizado, além de amostragem com temperature e top-k
- A arquitetura básica converte o texto de entrada em IDs de token em nível de caractere, passa por embeddings de token e de posição, atravessa vários blocos Transformer e então produz os logits para a probabilidade do próximo token
- As configurações de modelo oferecidas são Tiny com cerca de 0.5M de parâmetros e aproximadamente 5 minutos em um M3 Pro, Small com cerca de 4M e cerca de 20 minutos, e Medium como padrão com cerca de 10M e aproximadamente 45 minutos de treinamento
- Todas as configurações usam tokenização em nível de caractere com
vocab_size=65eblock_size=256, ajustadas para datasets pequenos de cerca de 1MB, como Shakespeare - A tokenização BPE tem vocabulário grande, como os 50.257 tokens do GPT-2, então em datasets pequenos a maioria dos bigramas de tokens é rara demais para aprender padrões; o material também aborda a migração para BPE em datasets maiores
- Como principais referências, são apresentados nanoGPT, build-nanogpt video lecture, Karpathy's microgpt, nanochat, Attention Is All You Need (2017), GPT-2 paper (2019) e TinyStories paper
1 comentários
Comentários do Hacker News
Se este material parece interessante, também recomendo fortemente a disciplina CS336 de Stanford. Ela cobre um currículo parecido com muito mais profundidade, e também apresenta intuições teóricas como leis de escala e perspectivas de sistemas como otimização de kernel e profiling
Claro, você vai ter que fazer os exercícios: https://cs336.stanford.edu/
Fazendo um pouco de propaganda, existe uma série de notebooks Jupyter que explica desde o início como o machine learning funciona
https://github.com/nickyreinert/DeepLearning-with-PyTorch-fr...
E, claro, também aborda como construir um LLM do zero
https://github.com/nickyreinert/basic-llm-with-pytorch/blob/...
Por coincidência, acabei de começar o repositório/livro/curso do Sebastian Raschka, Build a Large Language Model (From Scratch). Talvez seja um bom tipo de problema ter que escolher qual material de estudo usar
[0] https://github.com/rasbt/LLMs-from-scratch
[1] https://www.manning.com/books/build-a-large-language-model-f...
[2] https://magazine.sebastianraschka.com/p/coding-llms-from-the...
Faço isso desde o dia em que nasci. O começo foi difícil, mas estou melhorando aos poucos
Eu fiz algo parecido com ULMFiT quando o fast.ai ainda era relativamente novo. Acho que foi na época em que o BERT era o estado da arte mais recente, e a estrutura permitia treinar um modelo base e depois especializá-lo com uma head
No modelo base, usei a Wikipedia inteira e acrescentei alguns GB de tweets coletados via firehose. Eu tinha acesso a um laboratório com 20 computadores para desenvolvimento de jogos, algo mais ou menos no nível de uma GTX 2080. Treinar uma passada na Wikipedia tokenizada levava cerca de meio dia, então eu rodava configurações diferentes em cada máquina para ajuste de hiperparâmetros e, no dia seguinte, usava o melhor resultado como ponto de partida. Sempre era divertido chegar de manhã no trabalho e conferir os resultados
A engenharia foi horrível e totalmente improvisada, mas aprendi muito. O resultado foi mais ou menos, e fiz classificação de tweets, mas deu para ter noção de quanta potência de GPU e quantos desafios de engenharia seriam necessários para fazer isso a sério. Eu não tinha entendido completamente o potencial da geração, mas fiquei um bom tempo rindo dos tweets que criei por curiosidade
Isso parece quase uma transcrição em texto deste vídeo do Andrej Karpathy(https://youtu.be/kCc8FmEb1nY), ou estou vendo errado?
Algo como: “o nanoGPT busca reproduzir o GPT-2 (124 milhões de parâmetros) e cobre muita coisa. Este projeto reduz isso ao essencial, com um modelo de cerca de 10 milhões de parâmetros que pode ser treinado em menos de 1 hora em um notebook…”
Para dar contexto, ele é um dos desenvolvedores do MLX e um pesquisador de machine learning competente
Está escrito: “workshop prático em que você escreve cada peça do pipeline de treinamento de GPT com as próprias mãos para entender o que cada componente faz e por que ele é necessário”, mas vejo torch nas dependências, então parece que tensores e backpropagation não são implementados manualmente e são tratados como algo dado. Ainda assim, será que dá para chamar isso de “do zero”?
Fiz algo parecido em Rust, também com ajuda de IA, mas me restringi a usar apenas a biblioteca padrão, sem dependências. Como resultado, tive que implementar muito mais coisas: design de tensores, conceito de kernel, um otimizador simples de descida de gradiente, um parser JSON feito à mão, abstrações de paralelismo de dados em CPU parecidas com rayon etc. Quando liguei tudo e funcionou, foi bem divertido. Era muito lento, mas funcionava
Não sei se usar PyTorch ainda pode ser considerado “do zero”. Não estou defendendo um extremo tipo evitar até a biblioteca padrão, mas no momento em que você traz uma biblioteca feita exatamente para esse propósito, já não parece mais “do zero” para mim
Talvez “Treinar um LM do zero” fosse mais correto. Não sei se haverá uma máquina capaz de criar algo grande o bastante para chamar de “Large”
Não estou dizendo que vale a pena, mas não é preciso comprar GPUs para estudar treinamento
E ainda vem com 48 núcleos de processador! Não tem suporte a AVX512, mas dá para fazer contas
Deve dar para treinar um LLM o suficiente. Ou pelo menos a minha família deve conseguir… talvez meu filho tenha que herdar o projeto e continuar
Falando sério, acho que ou o ponto principal foi perdido, ou isso é implicância desnecessária, ou então está simplesmente errado. Isso é sobre aprender os conceitos, e o resto é em grande parte secundário
E, pelo lado da implicância ou do erro, qual é exatamente a linha de base documentada para um “large” language model? O GPT-2 era chamado de modelo de linguagem “large” na época e ainda é hoje, com 1,5 bilhão de parâmetros. Hoje em dia dá para encontrar GPUs de consumidor capazes de treinar algo desse tamanho por algo em torno de 400 dólares