microgpt
(karpathy.github.io)- Una arquitectura mínima de modelo de lenguaje que implementa todo el proceso de entrenamiento e inferencia de un modelo GPT en un solo archivo puro de Python de 200 líneas
- Incluye dataset, tokenizador, motor de autodiferenciación, red neuronal similar a GPT-2, optimizador Adam y bucles de entrenamiento e inferencia
- Aprende un dataset de nombres para generar nombres nuevos y revela los principios centrales de GPT mediante una implementación propia de autograd y una estructura Transformer
- A diferencia de los LLM a gran escala, funciona en Python puro sin dependencias, dejando solo la esencia algorítmica
- Entender microgpt permite comprender la estructura algorítmica fundamental de los modelos grandes como ChatGPT
Resumen de microgpt
- microgpt es una implementación mínima de GPT escrita en 200 líneas de código Python, sin dependencias de bibliotecas externas
- Incluye dataset, tokenizador, autodiferenciación, una estructura similar a GPT-2, optimizador Adam, y bucles de entrenamiento e inferencia
- Es un proyecto artístico creado por Karpathy para simplificar los LLM hasta su esencia, en la misma línea de micrograd, makemore y nanogpt
- El código completo está disponible en GitHub Gist, una página web y Google Colab
Dataset
- Usa un archivo de texto con aproximadamente 32,000 nombres, uno por línea
- Cada nombre se considera un documento, y el modelo aprende ese patrón para generar nombres nuevos
- Ejemplos generados tras el entrenamiento: kamon, ann, karai, jaire, vialan
Tokenizador
- Un tokenizador simple basado en caracteres que asigna un ID entero a cada carácter único
- Incluye las letras a–z y el token BOS (beginning of sequence), para un total de 27 tokens
- Cada documento se entrena envuelto en la forma
[BOS, e, m, m, a, BOS]
Autodiferenciación (Autograd)
- La clase
Valuerastrea valores escalares y gradientes mientras construye el grafo computacional - Guarda el gradiente local (local gradient) de operaciones básicas como suma, multiplicación, potencia, logaritmo, exponencial y ReLU
- El método
backward()realiza la retropropagación aplicando la regla de la cadena - Implementa directamente a nivel escalar el mismo algoritmo que
.backward()de PyTorch
Inicialización de parámetros
- El modelo tiene aproximadamente 4,192 parámetros
- Está compuesto por tabla de embeddings, pesos de atención, pesos del MLP, proyección de salida y más
- Cada parámetro se inicializa con números aleatorios de una distribución gaussiana
Arquitectura del modelo
- Una versión simplificada de la estructura GPT-2 que usa RMSNorm, ReLU y conexiones residuales (residual connection)
- Componentes principales:
- Etapa de embeddings: suma embeddings de token y de posición
- Atención multi-head: calcula vectores Q, K y V, y aprovecha información de tokens pasados mediante KV cache
- Bloque MLP: red feedforward de 2 capas para cálculo local
- Etapa de salida: genera logits para el tamaño del vocabulario (27)
- El KV cache también permanece activo durante el entrenamiento, por lo que la retropropagación fluye a través del caché
Bucle de entrenamiento
- En cada paso se selecciona un documento y se tokeniza como
[BOS, ... , BOS] - El modelo predice la probabilidad del siguiente token y calcula la pérdida de entropía cruzada
- Después de calcular gradientes con
loss.backward(), los parámetros se actualizan con el optimizador Adam - La tasa de aprendizaje usa un esquema de decaimiento lineal (linear decay)
- Durante 1,000 pasos, la pérdida baja aproximadamente de 3.3 → 2.37
Inferencia (Inference)
- Una vez finalizado el entrenamiento, empieza con el token BOS para generar nuevos nombres
- En cada paso, el siguiente token se muestrea según las probabilidades softmax
- El valor de temperature controla la creatividad (más bajo = más conservador, más alto = más diversidad)
- Ejemplos de salida: kamon, ann, karai, jaire, vialan, karia, yeran, anna
Cómo ejecutarlo
- Se puede ejecutar solo con Python (
python train.py) - El entrenamiento termina en aproximadamente 1 minuto y la pérdida se imprime paso a paso
- También se puede ejecutar de la misma manera en un cuaderno de Colab
Etapas de evolución del código
- Expansión por etapas desde
train0.pyhastatrain5.py- Bigram → MLP → Autograd → Attention → Multi-head → Adam
- Cada etapa puede verse en las revisiones de build_microgpt.py del Gist
Diferencias con un LLM real
- Datos: microgpt usa 32K nombres; un LLM real usa billones de tokens
- Tokenizador: a nivel de carácter vs. subwords basados en BPE
- Autograd: Python escalar vs. operaciones tensoriales en GPU
- Arquitectura: 4K parámetros vs. cientos de miles de millones de parámetros
- Entrenamiento: repetición de un solo documento vs. entrenamiento a gran escala con batches y precisión mixta
- Optimización: Adam simple vs. hiperparámetros y scheduling finamente ajustados
- Posprocesamiento: pasa por etapas de SFT y RL para evolucionar hacia una forma como ChatGPT
- Infraestructura de inferencia: GPU distribuida, gestión de KV cache, cuantización, speculative decoding, etc.
Resumen del FAQ
- El modelo es una función matemática que transforma tokens de entrada en probabilidades del siguiente token
- No hay “comprensión”; hace predicciones mediante aprendizaje de reglas estadísticas
- Implementa en versión reducida el mismo bucle de predicción de tokens que ChatGPT
- La “alucinación (hallucination)” es un resultado natural del muestreo probabilístico
- Aunque es lento, reproduce completamente el algoritmo central de los LLM
- Para mejores resultados, se pueden ajustar los pasos de entrenamiento, el tamaño del modelo y el dataset
- Si se reemplaza el dataset, puede aprender distintos patrones como nombres de ciudades, nombres de Pokémon o poemas
microgpt es un modelo educativo y experimental que implementa en su forma mínima todos los algoritmos centrales de un LLM, y sirve como ejemplo que revela por completo cómo funciona un modelo de lenguaje a gran escala.
1 comentarios
Comentarios de Hacker News
Alguien modificó microgpt para crear un pequeño GPT que genera nombres coreanos.
También hay una página web que visualiza todo el proceso; se puede explorar todo el pipeline, desde la tokenización hasta la inferencia.
Se puede probar directamente en English GPT lab.
Basta con revisar el tutorial de PyTorch char_rnn.
Explica muy bien tokenización, embeddings, atención, pérdida y gradientes, entrenamiento, inferencia y comparación con Real GPT.
El sitio en sí se parece más a una visualización generada con IA basada en la publicación original del blog.
Yo porté microgpt a C++.
Enlace al código
Tiene el doble de líneas de código, pero corre 10 veces más rápido.
La parte más difícil fue representar la clase Value en C++, y al final usé shared_ptr.
Tenía curiosidad por saber qué significa eso de la “alucinación (hallucination)”.
El modelo solo toma muestras de una distribución de probabilidad de tokens; no tiene un concepto de verdad.
Entonces surge la duda de si un LLM podría tener un puntaje de confianza sobre sus propias respuestas.
Los modelos preentrenados están calibrados, pero eso se rompe después del ajuste para seguir instrucciones (post-training).
Investigación relacionada: artículo 1, artículo 2.
Como un intervalo de confianza en estadística sin conocer la población, las probabilidades de un LLM tampoco tienen conexión con el mundo real.
Al final, un LLM es como alguien que solo ha leído libros sin experiencia del mundo.
Pero esa probabilidad no es “la probabilidad de que sea verdad”, sino “la probabilidad de que yo emita este token en esta situación”.
Yo convertí microgpt a Rust para aprender.
microgpt-rs
Lo más complicado fue representar la estructura del grafo de autograd con tipos de Rust.
Ahora lo estoy adaptando para que pueda correr en el navegador con WebAssembly, y pienso publicarlo en un blog.
El código de Karpathy tiene un diseño realmente poético y conciso.
El código es bonito y fácil de leer, pero me gustaría que tuviera una explicación con comentarios línea por línea, como backbone.js.
Ver la documentación de Backbone.
El proyecto Docco también es una gran herramienta hecha por el mismo autor.
También hay una versión HTML del código.
Blog de microgpt
Gracias al video y al código de Karpathy, sentí que por primera vez entendí bien descenso por gradiente, backpropagation y la regla de la cadena.
Cuando solo veía las matemáticas me confundía, pero al verlo junto con el código se volvió claro.
En lo personal, fue una especie de logro de vida.
Como dijo Karpathy, para entenderlo de verdad es importante intentar enseñárselo a otra persona.
Me sorprende que este proyecto apenas llegue ahora a HN.
Yo hice una versión en JS de 35 líneas llamada PicoGPT y también una versión en Python,
y se puede ejecutar directamente en la web.
Incluso es un LLM ultrapequeño que puede ejecutarse desde un código QR.
Hilos relacionados: enlace 1, enlace 2
Yo convertí el código de microgpt en una publicación de blog visual.
Enlace al blog
Muestra el flujo del código de manera interactiva a medida que lo vas siguiendo.
pero en realidad esos cuatro ya están incluidos en el dataset.
Últimamente la tendencia ‘micro’ en IA me parece interesante.
Más que simplemente agrandar modelos, la eficiencia está creciendo más en modelos pequeños y enfocados.
De hecho uso Gemini Flash para análisis de dominio, y la relación entre velocidad y costo es mucho mejor.
Solo la diferencia de latencia ya cambia el tipo de productos que se pueden construir.
Como es más pequeño que nanogpt, creo que llamarlo microgpt no encaja tanto y que picogpt sería más apropiado.
Aun así, es un gran proyecto.