Train Your Own LLM From Scratch - taller práctico para entrenar tu propio LLM desde cero
(github.com/angelos-p)- Train Your Own LLM From Scratch es un taller práctico donde escribes por tu cuenta todas las piezas del pipeline de entrenamiento de GPT para entender qué hace cada componente y por qué es necesario
- El objetivo es generar texto con estilo de Shakespeare con un modelo GPT entrenado desde cero en una laptop, y está reducido a un modelo de aproximadamente 10M parámetros para poder completarlo en una sola sesión del taller
- Mientras nanoGPT busca reproducir GPT-2 de 124M parámetros, este proyecto está diseñado dejando solo lo esencial para poder entrenarse en una laptop en menos de 1 hora
- Los componentes que se escriben directamente son el Tokenizer, la arquitectura del modelo basada en Transformer, el loop de entrenamiento y la generación de texto; al final se completan directamente
model.py,train.pyygenerate.py - Como conocimiento previo, basta con estar familiarizado con la lectura de código Python; no se requiere experiencia en machine learning y se necesita Python 3.12+
- El entorno de ejecución soporta laptops o desktops con Mac, Linux y Windows, y el entrenamiento usa automáticamente MPS en GPU de Apple Silicon, CUDA en GPU de NVIDIA, o CPU
- Para la instalación local se recomienda el flujo de ejecutar
uv synccon uv, y si no hay entorno local, se pueden subir los archivos a Google Colab y ejecutar!python train.py - El taller recorre en orden el tokenizador a nivel de carácter, embeddings, self-attention, LayerNorm, bloques MLP, función de pérdida, AdamW, gradient clipping, scheduling de tasa de aprendizaje, y muestreo con temperature y top-k
- La arquitectura base convierte el texto de entrada en IDs de token a nivel de carácter, pasa por embeddings de token y de posición, atraviesa varios bloques Transformer y luego produce logits para la probabilidad del siguiente token
- La configuración de modelos ofrecida indica Tiny con alrededor de 0.5M parámetros y unos 5 minutos en una M3 Pro, Small con cerca de 4M y unos 20 minutos, y Medium por defecto con aproximadamente 10M y unos 45 minutos de entrenamiento
- Todas las configuraciones usan tokenización a nivel de carácter con
vocab_size=65yblock_size=256, ajustadas a datasets pequeños de alrededor de 1MB como Shakespeare - La tokenización BPE tiene un vocabulario grande, como los 50,257 vocab de GPT-2, por lo que en datasets pequeños la mayoría de los bigramas de tokens son demasiado raros para aprender patrones; también se aborda cambiar a BPE en datasets más grandes
- Como materiales de referencia principales se presentan nanoGPT, build-nanogpt video lecture, Karpathy's microgpt, nanochat, Attention Is All You Need (2017), GPT-2 paper (2019) y TinyStories paper
1 comentarios
Comentarios en Hacker News
Si este material te parece interesante, también recomiendo mucho el curso CS336 de Stanford. Cubre un currículo similar pero con mucha más profundidad, y también presenta intuición teórica sobre cosas como las leyes de escalado y la perspectiva de sistemas, como optimización de kernels y perfilado
Claro, hay que hacer las tareas por cuenta propia: https://cs336.stanford.edu/
Ya que estamos promocionando cosas, hay una serie de notebooks de Jupyter que explica cómo funciona el aprendizaje automático desde cero
https://github.com/nickyreinert/DeepLearning-with-PyTorch-fr...
Y por supuesto también cubre cómo construir un LLM desde cero
https://github.com/nickyreinert/basic-llm-with-pytorch/blob/...
Justo acabo de empezar con el repositorio/libro/curso de Sebastian Raschka, Build a Large Language Model (From Scratch). Quizá tener que elegir entre varios materiales de estudio sea un buen problema para tener
[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...
Lo he estado haciendo desde el día en que nací. Empezar fue difícil, pero poco a poco voy mejorando
Lo hice en la época en que fast.ai era relativamente nuevo, con ULMFiT. Creo que era cuando BERT era el estado del arte más reciente, y tenía una estructura donde primero entrenabas el modelo base y luego lo especializabas con una head
Para el modelo base usamos toda Wikipedia, más varios GB de tuits recolectados por firehose. Teníamos acceso a un laboratorio con 20 computadoras para desarrollo de juegos, creo que más o menos del nivel de una GTX 2080. Entrenar una pasada de Wikipedia tokenizada tomaba como medio día, así que corríamos distintas configuraciones en cada máquina para hacer ajuste de hiperparámetros y al día siguiente usábamos el mejor resultado como punto de partida. Siempre era divertido llegar a la oficina por la mañana y revisar los resultados
La ingeniería fue terrible e improvisada, pero aprendí muchísimo. Los resultados fueron decentes y clasificábamos tuits, pero me dio una idea de cuánta potencia de GPU y cuántos retos de ingeniería hacen falta para tomarse esto en serio. No terminé de entender todo el potencial generativo, pero sí me reí bastante viendo los tuits que producía por curiosidad
Esto se ve como una transcripción casi textual en formato escrito de este video de Andrej Karpathy (https://youtu.be/kCc8FmEb1nY), ¿o estoy viendo mal?
Dice algo como: “nanoGPT busca reproducir GPT-2 (124 millones de parámetros) y cubre mucho contenido. Este proyecto reduce eso a lo esencial, con un modelo de unos 10 millones de parámetros que se entrena en menos de una hora en un notebook…”
Para dar más contexto, él es uno de los desarrolladores de MLX y es un investigador de aprendizaje automático muy capaz
Dice “un taller práctico donde escribes cada pieza del pipeline de entrenamiento de GPT para entender qué hace cada componente y por qué es necesario”, pero en las dependencias aparece torch, así que parece que no implementa tensores ni backpropagation por cuenta propia y simplemente los da por sentados. Aun así, no sé si eso realmente cuenta como hacerlo “desde cero”
Hice algo parecido en Rust y también recibí ayuda de IA, pero me limité a usar solo la biblioteca estándar, sin dependencias. Como resultado tuve que implementar muchas más cosas: diseño de tensores, concepto de kernels, un optimizador simple de descenso por gradiente, un parser JSON hecho a mano, una abstracción de paralelismo de datos en CPU parecida a rayon, etc. Fue bastante divertido cuando al final todo quedó conectado y funcionando. Era lentísimo, pero sí funcionaba
Ya no estoy seguro de que usar PyTorch se pueda considerar “desde cero”. No digo algo extremo como evitar hasta la biblioteca estándar, pero en cuanto traes una librería tan perfectamente adaptada al objetivo, deja de sentirse como “desde cero”
Creo que sería más correcto decir “entrenar un LM desde cero”. Dudo que tengan una máquina capaz de crear algo lo bastante grande como para llamarlo “Large”
No digo que valga la pena, pero no necesitas comprar GPUs tú mismo para aprender
¡Y además 48 núcleos de procesador! No soporta AVX512, pero puede hacer cálculos
Debería ser suficiente para entrenar un LLM. O al menos para que lo haga nuestra familia… puede que mi hijo tenga que heredar el proyecto y continuarlo
Hablando en serio, creo que o se está perdiendo el punto, o se le está buscando la quinta pata al gato innecesariamente, o simplemente está equivocado. Esto trata de aprender los conceptos y lo demás es, en gran medida, secundario
Y en cuanto a si se le está buscando la quinta pata al gato o está equivocado: ¿cuál es la línea base documentada para llamar “large” a un modelo de lenguaje? GPT-2 fue llamado un modelo de lenguaje “large” tanto en su momento como ahora, y tenía 1.5 mil millones de parámetros. Hoy en día puedes conseguir una GPU de consumo capaz de entrenar algo de ese tamaño por unos 400 dólares