Files
enlace/pyproject.toml
T
msaldain 90ac2a6582 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>
2026-07-27 23:04:45 -03:00

46 lines
1.1 KiB
TOML

[project]
name = "enlace"
version = "0.1.0"
description = "Modelo de lenguaje propio, entrenado desde cero, para asistencia general y familiar en español."
requires-python = ">=3.11"
# Las versiones se pinean con cuidado: el salto a Blackwell (RTX 5090, sm_120)
# exige torch >= 2.7 con CUDA 12.8. Turing (RTX 2060, sm_75) funciona con
# cualquier torch reciente. Ver configs/hardware/ y docs/HARDWARE.md.
dependencies = [
"torch>=2.5",
"pydantic>=2.7",
"omegaconf>=2.3",
"numpy>=1.26",
]
[project.optional-dependencies]
data = [
"datasets>=2.20", # streaming del corpus; nunca se baja entero
"tokenizers>=0.20",
"fasttext-wheel>=0.9", # filtro de idioma
"datasketch>=1.6", # deduplicación MinHash
]
dev = [
"pytest>=8.0",
"ruff>=0.6",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["enlace"]
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-q"
[tool.ruff]
line-length = 100
target-version = "py311"
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B"]