Cómo construir y entrenar tu propio GPT en un portátil normal
La mayoría de los tutoriales de redes neuronales hoy se reducen a dos escenarios. Te piden que llames a la API de OpenAI con un par de líneas de Python, o que descargues un modelo listo de Hugging Face y llames al método .generate(). En ambos casos, todos los detalles internos permanecen ocultos. Obtienes un resultado, pero apenas entiendes cómo las multiplicaciones de matrices convierten texto sin procesar en frases con sentido.
Hace poco descubrí el repositorio llm-from-scratch del desarrollador angelos-p. Es un taller interactivo donde escribes cada componente de un modelo de lenguaje desde cero. Sin abstracciones pesadas: solo PyTorch puro, matemáticas claras, y el entrenamiento de un modelo de 10 millones de parámetros en tu portátil en menos de una hora.
Входной текст
│
▼
┌─────────────────┐
│ Tokenizer │ "hello" → [20, 43, 50, 50, 53]
└────────┬────────┘
▼
┌─────────────────┐
│ Token Embed + │ Векторы токенов + позиция
│ Position Embed │ (размерность n_embd)
└────────┬────────┘
▼
┌─────────────────┐
│ Transformer │ × n_layer слоев
│ Block: │
│ ┌────────────┐ │
│ │ LayerNorm │ │
│ │ Self-Attn │ │ n_head параллельных голов внимания
│ │ + Residual │ │
│ ├────────────┤ │
│ │ LayerNorm │ │
│ │ MLP (FFN) │ │ расширение 4x, GELU, проекция назад
│ │ + Residual │ │
│ └────────────┘ │
└────────┬────────┘
▼
┌─────────────────┐
│ LayerNorm │
│ Linear → logits│ вероятности следующего символа
└─────────────────┘
Dónde empezó todo
Muchos han oído hablar del proyecto nanoGPT de Andrej Karpathy. Karpathy demostró que una arquitectura GPT-2 completa con 124 millones de parámetros cabe en solo un par de cientos de líneas de código. Sin embargo, reproducir el GPT-2 original todavía requiere una cantidad considerable de computación y tiempo.
El autor de llm-from-scratch fue más allá. Eliminó todas las optimizaciones innecesarias del clúster y adaptó el código para que se pueda escribir a mano en una sola noche. El modelo final se entrena en Apple Silicon (MPS), GPUs Nvidia a través de CUDA, o incluso en una CPU normal. Si no tienes hardware local, todo funciona en Google Colab gratis.
Qué contiene el taller
El material está dividido en módulos paso a paso en la carpeta docs/. Secuencialmente creas tres archivos funcionales: model.py, train.py y generate.py.
1. Tokenización a nivel de caracteres
Cuando trabajas con corpus de texto masivos, la solución estándar es el algoritmo BPE (Byte Pair Encoding) con un vocabulario de 50.000 tokens. Pero si estás entrenando una red pequeña en un conjunto de datos de 1 megabyte, BPE te fastidiará el entrenamiento. La mayoría de los pares de tokens aparecerán solo un par de veces en todo el texto, y los pesos simplemente no convergirán para ellos.
Por eso el autor usa un tokenizador a nivel de caracteres para entrenar con las obras de Shakespeare. El alfabeto consiste en solo 65 caracteres únicos. Este vocabulario es compacto, se codifica rápidamente, y le da a un modelo pequeño la oportunidad de capturar la gramática y la estructura del diálogo.
2. Construyendo el Transformer
Aquí ensamblas a mano la arquitectura del decodificador GPT:
- Tablas de embedding para caracteres y posiciones en el texto.
- Bloque de Auto-Atención Multi-Cabeza, donde el vector de cada carácter interactúa con el contexto a través de consultas, claves y valores (Q, K, V).
- Mecanismo de máscara causal que evita que el modelo mire tokens futuros durante la generación.
- Capas completamente conectadas (MLP) con activación GELU y normalización LayerNorm.
La arquitectura se ensambla sin magia de frameworks de terceros. Puedes ver claramente por dónde fluye cada tensor y en qué etapa se añaden las conexiones residuales.
3. Ciclo de entrenamiento
En la tercera etapa, escribes el pipeline de entrenamiento. Incluye:
- Cálculo de la pérdida de entropía cruzada entre los logits predichos y los caracteres reales siguientes.
- Optimizador AdamW con ajuste de weight decay.
- Recorte de gradientes para evitar explosiones de pesos durante el entrenamiento.
- Programador de tasa de aprendizaje con warmup y decaimiento cosoidal.
4. Generación de texto y muestreo
El modelo terminado necesita hablar. Implementas un bucle autorregresivo: tomas una semilla de texto, la pasas por el transformer, extraes la distribución de probabilidad para el siguiente token, y lo seleccionas usando temperatura con búsqueda codiciosa o muestreo top-k.
Configuraciones para experimentos
El repositorio ofrece tres perfiles de modelo. Puedes elegir según cuánto tiempo libre tengas.
| Perfil | Parámetros | Capas (n_ layer) | Cabezas (n_head) | Dimensión (n_embd) | Tiempo de entrenamiento (M3 Pro) | |---|---|---|---|---|---| | Tiny | ~0,5M | 2 | 2 | 128 | ~5 minutos | | Small | ~4M | 4 | 4 | 256 | ~20 minutos | | Medium | ~10M | 6 | 6 | 384 | ~45 minutos |
Todos los perfiles funcionan con una longitud de contexto de 256 caracteres. El perfil Tiny es genial para depuración rápida cuando necesitas verificar que el código funciona sin errores shape mismatch. El perfil Medium ya produce prosa shakespeariana bastante legible con divisiones de diálogo de personajes.
Cómo ejecutar el proyecto
Para la gestión del entorno, el autor recomienda el gestor de paquetes rápido uv.
Instalar dependencias y crear una carpeta de trabajo:
# Установка uv (если еще не установлен)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Клонируем репозиторий и синхронизируем окружение
git clone https://github.com/angelos-p/llm-from-scratch
cd llm-from-scratch
uv sync
mkdir scratchpad && cd scratchpad
Si prefieres Google Colab, instalar un conjunto mínimo de librerías es suficiente:
!pip install torch numpy tqdm tiktoken
Luego tomas el archivo data/shakespeare.txt, abres la primera guía docs/01-tokenization.md, y empiezas a escribir código paso a paso.
Para quién es este taller
El proyecto atraerá a quienes están hartos de artículos abstractos con gráficos de atención y quieren ver código real. No se requiere conocimiento profundo de aprendizaje automático para completarlo. Es suficiente sentirse cómodo leyendo sintaxis de Python y entendiendo operaciones básicas con arrays.
Después de completar las seis guías, te desharás de la sensación de magia alrededor de los LLMs. Entenderás en la práctica por qué los modelos necesitan warmup de la tasa de aprendizaje, cómo la temperatura afecta la aleatoriedad de las respuestas, y por qué los modelos pequeños son tan sensibles al tamaño del vocabulario. Es una gran manera de pasar un fin de semana de forma productiva para tu conocimiento de ingeniería.
Proyectos relacionados