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
+31
View File
@@ -0,0 +1,31 @@
# Pretraining del modelo base (Etapa 2 del plan).
run_name: pretrain-tiny-50m
out_dir: runs
seed: 1337
# ~3B tokens con lote efectivo 128 x 2048 tokens = 262144 tokens por paso.
max_steps: 11500
optimizer:
lr: 6.0e-4
beta1: 0.9
beta2: 0.95
eps: 1.0e-8
weight_decay: 0.1
grad_clip: 1.0
# WarmupStableDecay: el LR sube, se mantiene plano la mayor parte de la
# corrida, y solo decae en el último ~10%. La fase de decay es también donde
# se sube el peso del corpus de estilo (annealing), y es lo que permite
# extender esta corrida más adelante sin recalcular el schedule.
schedule:
kind: wsd
warmup_steps: 500
decay_steps: 1150
min_lr_ratio: 0.0
log_every: 10
eval_every: 500
eval_batches: 20
checkpoint_every: 1000
sample_every: 1000
+29
View File
@@ -0,0 +1,29 @@
# Smoke test de la Etapa 0: minutos, no días.
#
# Criterio de aceptación: el loss baja por debajo de 1.5 y las muestras
# generadas son español reconocible. Si eso pasa, el stack entero está bien.
run_name: smoke-char
out_dir: runs
seed: 1337
max_steps: 2000
optimizer:
lr: 3.0e-3 # modelo diminuto: tolera y necesita un LR alto
beta1: 0.9
beta2: 0.95
eps: 1.0e-8
weight_decay: 0.1
grad_clip: 1.0
schedule:
kind: wsd
warmup_steps: 100
decay_steps: 400
min_lr_ratio: 0.0
log_every: 25
eval_every: 250
eval_batches: 10
checkpoint_every: 500
sample_every: 500