TL;DR
nanochat es el framework open source de Andrej Karpathy para entrenar un LLM tipo GPT-2 por menos de $50 y en 2 horas, usando un solo nodo GPU 8xH100. El código es mínimo (~500 líneas), la configuración se reduce a un solo parámetro (--depth) y la optimización de hiperparámetros es automática. El entrenamiento más reciente terminó en 1.65 horas y puntuó 0.2626 en CORE, superando el GPT-2 original de OpenAI (2019), que costó $43,000 y tomó 168 horas.
Introducción
Entrenar un LLM antes era solo para empresas con millones y equipos de investigación con PhD. Eso se acabó.
Karpathy publica nanochat: IA conversacional de código abierto que entrenas por menos de lo que cuesta una buena cena. Corre todo en un nodo GPU 8xH100, completando el flujo en menos de 2 horas.
Por Qué Esto Importa Ahora
En 2026, entrenar LLM es 100 veces más rápido y barato que en 2019. Lo que costaba $43,000 y 168 horas ahora toma 1.65 horas y $48 gracias a optimización algorítmica y hardware moderno.
Para devs de APIs y equipos IA, esto permite experimentar, ajustar modelos y entender los fundamentos de los LLM sin infraestructuras prohibitivas.
💡 Combina esto con plataformas de desarrollo de API como Apidog para testear y documentar tus servicios IA y tendrás un stack completo para producción.
Lo Que Aprenderás
- Cómo nanochat logra 100x reducción de costo vs entrenamiento tradicional de LLM
- Arquitectura completa: modelo GPT, optimizador Muon, data loader
- Instrucciones paso a paso para entrenar tu propio modelo
- Cómo usar nanochat para experimentar rápido con LLM
- Limitaciones y el alcance real de la capacidad GPT-2
¿Qué es nanochat?
nanochat es un entorno mínimo para entrenar LLM: tokenización, preentrenamiento, ajuste fino, evaluación, inferencia y una interfaz web tipo ChatGPT.
El código es un solo repo, sin configuraciones monstruosas ni frameworks complejos. Karpathy lo plantea como "línea base sólida" para leer, modificar y bifurcar.
La Afirmación Principal
Entrena un modelo GPT-2 (1.6B parámetros) por:
- $48 on-demand (2h a ~$24/hora en 8xH100)
- ~$15 usando instancias spot
El GPT-2 original de OpenAI costó $43,000 y 7 días en 32 TPU v3.
Lo que nanochat cubre
| Etapa | Script | Descripción |
|---|---|---|
| Tokenización | scripts.tok_train |
Entrenar tokenizador BPE (vocab 32,768) |
| Preentrenamiento | scripts.base_train |
Entrenar modelo GPT base |
| Ajuste fino | scripts.chat_sft |
SFT para chat supervisado |
| Evaluación | scripts.base_eval |
Métrica CORE, bits-por-byte |
| Inferencia | scripts.chat_cli |
Chat CLI |
| Interfaz web | scripts.chat_web |
Interfaz web tipo ChatGPT |
La Filosofía: Un Solo Selector para Controlar Todo
La mayoría de frameworks LLM requieren múltiples archivos de configuración. nanochat lo reduce todo a un parámetro: --depth (capas del transformador).
# Modelo tipo GPT-1
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=12
# Modelo capacidad GPT-2
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=24
# Más grande aún
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=26
Al ajustar la profundidad, nanochat calcula automáticamente:
- Ancho del transformador
- Nº de cabezas de atención
- Tasas de aprendizaje por grupo de parámetros
- Pasos totales de entrenamiento
- Decaimiento de peso
- Tamaños de lote
Esto habilita la "miniserie nanochat": modelos de diferentes tamaños, todos óptimos y fáciles de comparar.
Por Qué Funciona
Karpathy midió leyes de escalado en múltiples entrenamientos y codificó esas relaciones en el script. Así puedes entrenar de forma óptima sin ser experto en deep learning.
La Clasificación: Compitiendo para Vencer al GPT-2
nanochat mantiene una clasificación pública ("race to GPT-2") para superar la puntuación CORE de OpenAI (0.256525) en 22 tareas.
Récords Actuales
| Ejecución | Modelo | Tiempo | Puntuación CORE | Innovación Clave |
|---|---|---|---|---|
| GPT-2 Original | 1.6B | 168 hrs | 0.2565 | Línea base OpenAI 2019 |
| Ejecución 1 | d24 | 3.04 hrs | 0.2585 | Línea base inicial |
| Ejecución 2 | d26 | 2.91 hrs | 0.2578 | Entrenamiento FP8 |
| Ejecución 3 | d26 | 2.76 hrs | 0.2602 | Lote de 1M tokens |
| Ejecución 4 | d24 | 2.02 hrs | 0.2571 | Dataset ClimbMix |
| Ejecución 5 | d24 | 1.80 hrs | 0.2690 | Optimizaciones por IA |
| Ejecución 6 | d24 | 1.65 hrs | 0.2626 | Mejora en smear/backout |
Cómo la IA Descubrió Optimizaciones
Las ejecuciones 5 y 6 incluyen mejoras de un sistema de "autoinvestigación" (IA prueba cambios arquitectónicos en modelos pequeños y los aplica a d24). Ejemplo:
- Retroceso: mejor resta residual
- Smear: mezcla bigramas más eficiente
Resultado: tiempo reducido de 2.02h a 1.65h, mejora del 19% descubierta automáticamente.
Cómo Funciona nanochat
El core tiene ~3,000 líneas en módulos clave:
1. Modelo GPT (nanochat/gpt.py)
Características principales:
- Incrustaciones rotativas (RoPE)
- Normalización QK (estabilidad)
- Pesos no ligados (token/output)
- ReLU² en MLP
- Atención GQA (más eficiente)
- Atención de ventana deslizante (ej. "SSSL")
- Flash Attention 3
Incrustaciones de valor (ResFormer):
# Value residual: mezcla value embedding por head
if ve is not None:
ve = ve.view(B, T, self.n_kv_head, self.head_dim)
gate = 3 * torch.sigmoid(self.ve_gate(x[..., :self.ve_gate_channels]))
v = v + gate.unsqueeze(-1) * ve
Trucos de eficiencia:
# 1. Escala residual por capa
x = self.resid_lambdas[i] * x + self.x0_lambdas[i] * x0
# 2. Smear: mezcla embedding del token anterior
gate = self.smear_lambda * torch.sigmoid(self.smear_gate(x[:, :, :24]))
x = x + gate * x_pre_smear
# 3. Backout: resta residuo capa intermedia
x = x - self.backout_lambda * x_backout
2. Optimizador Muon (nanochat/optim.py)
Optimización híbrida:
| Parámetro | Optimizador | Propósito |
|---|---|---|
| Embeddings, lm_head | AdamW | Optimización adaptativa |
| Parámetros escalares | AdamW | Factores de escala aprendidos |
| Matrices 2D | Muon | Actualizaciones ortogonales |
Muon (Newton-Schulz "Polar Express"):
# Coeficientes Polar Express (5 iters)
polar_express_coeffs = [
(8.156, -22.483, 15.879),
(4.043, -2.809, 0.500),
# ...
]
for a, b, c in polar_express_coeffs[:ns_steps]:
A = X.mT @ X
B = b * A + c * (A @ A)
X = a * X + X @ B
Reducción de varianza NorMuon:
v_mean = g.float().square().mean(dim=red_dim, keepdim=True)
v_norm = v_mean.sum(dim=(-2, -1), keepdim=True).sqrt()
final_scale = step_size * (v_norm / v_norm_new.clamp_min(1e-10))
g = g * final_scale.to(g.dtype)
Entrenamiento distribuido: Sharding ZeRO-2 con comunicación asíncrona.
Fase 1: reduce_scatter asíncrono
Fase 2: esperar, actualizar, all_gather
Fase 3: esperar, copiar parámetros
3. Gestión de Precisión (nanochat/common.py)
nanochat controla la precisión manualmente:
| Hardware | dtype predet. | Razón |
|---|---|---|
| CUDA SM 80+ (A100+) | bfloat16 | Soporte nativo BF16 |
| CUDA < SM80 (V100) | float32 | Sin soporte BF16 |
| CPU / MPS | float32 | Sin núcleos reducción |
class Linear(nn.Linear):
def forward(self, x):
return F.linear(x, self.weight.to(dtype=x.dtype))
FP8 disponible en H100/Blackwell con --fp8.
4. Carga de Datos (nanochat/dataloader.py)
- Cada batch comienza con BOS
- Empaquetamiento best-fit (minimiza desperdicio)
- Recorte solo si es necesario
- 100% de tokens útiles, ~35% recorte a secuencia 2048
# Best-fit document packing
best_idx = -1
best_len = 0
for i, doc in enumerate(doc_buffer):
doc_len = len(doc)
if doc_len <= remaining and doc_len > best_len:
best_idx = i
best_len = doc_len
if best_idx >= 0:
doc = doc_buffer.pop(best_idx)
# Añadir doc completo
else:
# Recortar doc más corto para llenar batch
5. Unificación Flash Attention (nanochat/flash_attention.py)
Interfaz única: selecciona FA3 o PyTorch SDPA automáticamente.
from nanochat.flash_attention import flash_attn
y = flash_attn.flash_attn_func(q, k, v, causal=True, window_size=window_size)
6. Motor de Inferencia (nanochat/engine.py)
- Caché KV: prompt caché vía FA3
- Herramientas: evalúa Python cuando toca
- Batching: clona caché para muestreo paralelo
Coordina el flujo conversacional, incluyendo herramientas activadas por tokens.
Paso a Paso: Entrena Tu Propio Modelo
El flujo está en runs/speedrun.sh. Ejecuta cada paso:
Requisitos Previos
- Nodo GPU 8xH100 (o similar)
- ~20 GB de disco
- Python 3.10+
-
uvcomo package manager
Paso 1: Configura el Entorno
# Instala uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Virtualenv
uv venv
source .venv/bin/activate
# Instala dependencias
uv sync --extra gpu
Paso 2: Descarga los Datos
# ~2B caracteres del dataset ClimbMix
python -m nanochat.dataset -n 170
Descarga ~170 archivos de ~100MB (total ~17 GB comprimidos).
Paso 3: Entrena el Tokenizador
# Tokenizador BPE vocab 32,768
python -m scripts.tok_train
# Evalúa compresión
python -m scripts.tok_eval
Paso 4: Preentrena el Modelo
# Modelo d24 (GPT-2)
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
--depth=24 \
--target-param-data-ratio=8 \
--device-batch-size=16 \
--fp8 \
--run=my-first-model
Parámetros clave:
-
--depth=24: tamaño GPT-2 -
--target-param-data-ratio=8: subentrenado para velocidad -
--device-batch-size=16: batch por GPU -
--fp8: FP8 activado (solo H100+)
Tiempo estimado: ~2h.
Paso 5: Ajuste Fino Supervisado
# Descarga conversaciones de identidad
curl -L -o ~/.cache/nanochat/identity_conversations.jsonl \
https://karpathy-public.s3.us-west-2.amazonaws.com/identity_conversations.jsonl
# Ejecuta SFT
torchrun --standalone --nproc_per_node=8 -m scripts.chat_sft -- \
--device-batch-size=16 \
--run=my-sft
Esto entrena el formato conversacional, tokens especiales y herramientas.
Paso 6: Chatea con el Modelo
# Chat CLI
python -m scripts.chat_cli -p "Why is the sky blue?"
# O interfaz web
python -m scripts.chat_web
La web corre en puerto 8000, interfaz estilo ChatGPT.
Flujo de Trabajo de Investigación: Experimentación Rápida
Para probar ideas, usa modelos pequeños.
Experimentos Rápidos (~5 minutos)
OMP_NUM_THREADS=1 torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
--depth=12 \
--run="d12-test" \
--core-metric-every=999999 \
--sample-every=-1 \
--save-every=-1
Entrena un modelo d12 (GPT-1), ideal para validar cambios arquitectónicos rápidamente.
Métricas a Monitorizar
En Weights & Biases, sigue:
- val_bpb: bits-por-byte validación
- core_metric: score DCLM CORE
- train/mfu: uso FLOPS modelo
- train/tok_per_sec: throughput entrenamiento
Requisitos de Prueba
Cualquier mejora debe funcionar de d12 a d26 para evitar overfitting a un solo tamaño.
Por Qué Importa nanochat
Accesibilidad de Costos
| Enfoque | Costo | Tiempo | Hardware |
|---|---|---|---|
| OpenAI GPT-2 | $43,000 | 168 hrs | 32 TPU v3 |
| nanochat (2026) | $48 | 2 hrs | 8xH100 |
| nanochat spot | ~$15 | 2 hrs | 8xH100 spot |
Esto permite entrenar LLM a:
- Investigadores individuales
- Startups pequeñas
- Cursos universitarios
- Aficionados
Valor Educativo
- ~500 líneas para GPT
- ~530 líneas para el optimizador
- Comentarios y decisiones explícitas
- Sin configuración oculta
Ideal para aprender y experimentar.
Velocidad de Investigación
Reducir días a horas permite:
- Probar hipótesis rápido
- Más experimentos por semana
- Coste de fallo bajo
- Colaboración comunitaria (rankings)
Transparencia
- Leyes de escalado en
dev/LOG.md - Ablaciones en GitHub Discussions
- Detalles de reproducción para la clasificación
- Contribución de IA documentada
Limitaciones y Verificación de la Realidad
nanochat es potente, pero tiene límites:
Requisitos de Hardware
La cifra de $48 asume acceso a 8xH100. Precios:
- Lambda Labs: ~$25/hora (8xH100)
- RunPod: ~$15/hora spot
- Ejecución completa: ~2h + SFT
Presupuesta ~$50-100 por ejecución real.
Techo de Capacidad
nanochat llega a nivel GPT-2 (2019):
Puede:
- Conversación básica
- Razonamiento simple
- Matemáticas básicas
- Hechos simples
No puede:
- Razonamiento complejo
- Código avanzado
- Instrucciones matizadas
- Competir con GPT-4/Claude
Piénsalo como un "niño de preescolar" IA.
Requisitos de Datos
- ~170 fragmentos
- ~17GB comprimidos
- ~2B caracteres
Necesitas almacenamiento y ancho de banda.
Limitaciones de la Métrica
CORE mide 22 tareas, pero no:
- Calidad real de conversación
- Conocimiento de nicho
- Nuances de instrucciones
- Seguridad/alineación
La varianza CORE es ~0.016. Tus resultados pueden variar.
Preguntas Frecuentes
¿Cuánto cuesta entrenar un modelo con nanochat?
~$48 bajo demanda (~$24/h × 2h) o ~$15 spot. SFT suma ~30min.
¿Qué GPU necesito?
Mínimo: una GPU moderna. Óptimo: 8xH100 u 8xA100. Escala de 1 a 8 GPUs con acumulación automática.
¿Cuánto tarda el entrenamiento?
1.65 a 3 horas según hardware/configuración. Récord: 1.65h (d24).
¿Qué es la métrica CORE?
CORE evalúa 22 tareas (ARC, MMLU, etc). GPT-2: 0.2565. nanochat: >0.26.
¿Puedo entrenar con una sola GPU?
Sí. Omite torchrun. Entrenamiento 8× más lento, pero resultados casi idénticos.
¿Qué dataset utiliza nanochat?
ClimbMix (NVIDIA). Tokenizador se entrena con ~2B caracteres (~8 fragmentos).
¿nanochat funciona en Apple Silicon?
Sí, en MPS (float32). Entrenamiento más lento que CUDA, pero útil para pruebas.
¿Puedo reanudar desde un checkpoint?
Sí, usa --resume-from-step=<step>. Loader de datos también guarda estado.
¿Diferencias con nanoGPT?
nanoGPT solo preentrenamiento. nanochat cubre: tokenización, preentrenamiento, SFT, RLHF, evaluación, inferencia, interfaz web.
Conclusión
nanochat prueba que entrenar LLM ya no requiere grandes presupuestos ni infraestructuras complejas. De $43,000 en 2019 a menos de $50 hoy.
Más allá del coste, el código mínimo y la filosofía de "un solo selector" lo hacen valioso tanto para investigación como para educación.
Puntos Clave
- 100x reducción de costos: GPT-2 por $48
- 100x aceleración: 168h a 1.65h
-
Un solo parámetro de configuración:
--depth - Flujo completo: tokenización a interfaz web
- Impulsado por la comunidad: ranking público y mejoras continuas
Próximos Pasos
¿Listo para entrenar tu modelo? Descarga el repo de nanochat y ejecuta runs/speedrun.sh.
Para devs de API, entender el entrenamiento LLM ahora está al alcance de un proyecto de fin de semana, no de una startup financiada.


Top comments (0)