Etapa 0: entorno, configuración validada, modelo y entrenador

Base del proyecto ENLACE: un modelo de lenguaje propio entrenado desde cero,
en español, para asistencia general y familiar. El plan completo está en
docs/PLAN.md.

Esta etapa establece el andamiaje y lo verifica de punta a punta:

- Configuración por capas (hardware × model × train × data) validada con
  pydantic. Ningún hiperparámetro vive en el código y una config inválida
  falla al arrancar, no a las tres horas de entrenamiento.
- Perfiles de hardware que aíslan el salto de GPU: la RTX 2060 (Turing) no
  soporta bfloat16 ni FlashAttention-2, así que entrena en float16 con
  GradScaler y backend mem_efficient; el perfil de la 5090 ya está escrito.
  backends.py valida el perfil contra la GPU real antes de empezar.
- Transformer decoder-only estilo Llama: RMSNorm, SwiGLU, RoPE, GQA,
  embeddings atados, QK-norm y z-loss. Los dos últimos son lo que mantiene
  estable el entrenamiento en float16.
- Entrenador con schedule WSD, acumulación de gradiente, precisión mixta,
  checkpointing atómico y reanudación exacta.
- Cargadores de datos con estado serializable: bytes para el smoke test y
  shards uint16 para el corpus real.

48 tests, entre ellos el crítico: reanudar desde un checkpoint reproduce los
pesos de una corrida ininterrumpida, parámetro por parámetro.

Verificado en CPU: 300 pasos sobre texto en español, loss 3.07 -> 1.63.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-27 23:04:45 -03:00
commit 90ac2a6582
33 changed files with 2838 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
# RTX 5090 32 GB — Blackwell, compute capability 12.0.
#
# Requiere PyTorch >= 2.7 compilado con CUDA 12.8: las versiones anteriores no
# conocen sm_120 y fallan al compilar kernels. Antes de usar este perfil hay que
# correr el smoke test de la Etapa 0 y verificar el entorno entero.
#
# Con bfloat16 desaparece el GradScaler: bf16 tiene el mismo rango exponente que
# fp32, así que no hay desbordes que escalar.
name: blackwell-5090
device: cuda
dtype: bfloat16
use_grad_scaler: false
attention_backend: flash
compile: true
matmul_precision: high
# 32 GB permiten un micro-lote 4x mayor con la misma acumulación reducida,
# manteniendo un lote efectivo comparable (32 * 4 = 128 secuencias) para que
# las curvas sean comparables entre placas.
micro_batch_size: 32
grad_accum_steps: 4
min_compute_capability: [12, 0]
# Aproximado, y solo para la métrica de MFU: bfloat16 denso (sin sparsity).
# Verificar con un benchmark real al migrar y ajustar este número.
peak_tflops: 209.5
+17
View File
@@ -0,0 +1,17 @@
# CPU — solo para desarrollo y tests. No sirve para entrenar nada real.
#
# Existe para que el código se pueda verificar en la máquina de trabajo, que no
# tiene GPU NVIDIA: los tests de forma, el smoke test a nivel de caracteres y
# la validación de configs corren acá antes de tocar el servidor.
name: cpu
device: cpu
dtype: float32
use_grad_scaler: false
attention_backend: math
compile: false
matmul_precision: high
micro_batch_size: 8
grad_accum_steps: 1
min_compute_capability: null
+28
View File
@@ -0,0 +1,28 @@
# RTX 2060 12 GB — Turing, compute capability 7.5.
#
# Dos límites de la arquitectura Turing determinan este perfil:
#
# 1. No soporta bfloat16. Hay que entrenar en float16, que tiene rango
# exponente reducido y desborda: por eso use_grad_scaler=true. Los picos
# de loss se mitigan además con qk_norm y z_loss en el modelo.
# 2. FlashAttention-2 exige Ampere (sm_80) o superior. El backend
# mem_efficient de PyTorch sí corre acá y usa memoria O(n) igual.
name: turing-2060
device: cuda
dtype: float16
use_grad_scaler: true
attention_backend: mem_efficient
compile: true
matmul_precision: high
# 12 GB con seq_len 2048 y un modelo de ~50M: micro-lote chico y acumulación
# para llegar a un lote efectivo razonable (8 * 16 = 128 secuencias).
micro_batch_size: 8
grad_accum_steps: 16
min_compute_capability: [7, 5]
# Aproximado, y solo para la métrica de MFU: tensor cores en float16 con
# acumulación en float32, que es lo que hace el entrenamiento con AMP.
# Sirve para comparar corridas entre sí, no como dato de hardware.
peak_tflops: 28.0