$ cd ../
Modelos fundacionales — Fine-tuning con LoRA — bash

user@devops:~$ cat README.md

Modelos fundacionales — Fine-tuning con LoRA

# Descripción

LoRA (Low-Rank Adaptation, Hu et al. 2021) es el método estándar para fine-tuning de modelos fundacionales: en vez de actualizar los pesos W de un modelo pre-entrenado, se inyectan dos matrices de rango bajo A y B (W' = W + (α/r)·B·A) en las proyecciones de atención y solo se entrenan esas matrices. Este proyecto lo demuestra sobre distilgpt2 (82M parámetros, 6 capas) enseñándole aritmética: resolver sumas de 2 dígitos + 1 dígito (11-90 + 1-9). Con r=8, α=16 y dropout 0.05 sobre q_attn/c_attn/c_proj, solo 589,824 parámetros (0.72% del total) son entrenables: la memoria de optimización (gradientes + 2 estados de AdamW) pasa de ~984 MB en fine-tuning completo a ~4.9 MB con LoRA (~200x menos). El dataset es sintético: 1,600 problemas de entrenamiento y 300 held-out. Hallazgo clave de tokenización: el BPE de GPT-2 colapsa '68' en un único token, lo que convierte la tarea en memorización de pares (a,b)→token; separando los dígitos con espacios ('A: 6 8') el modelo aprende el algoritmo dígito a dígito. Resultados (exact-match, decode greedy): modelo base 0.0% (≈ azar 1.2%) vs LoRA 29.7% (+29.7 pp) tras 6 épocas en CPU. El análisis por tipo de operación muestra el patrón esperado: las sumas con carry son más difíciles que sin carry, y la precisión de la decena (93.7%) supera ampliamente a la de la unidad (29.7%): el cómputo local de la unidad es el cuello de botella. 6 visualizaciones: curva de pérdida + exact-match por época, comparativa base vs LoRA vs azar, dificultad por carry, precisión por dígito, desglose de parámetros/memoria y generaciones reales antes vs después.

# Características principales

$ LoRA (Low-Rank Adaptation) desde la librería PEFT: W' = W + (α/r)·B·A con r=8, α=16, dropout 0.05

$ Solo 589,824 parámetros entrenables (0.72% de los 82M de distilgpt2): el 99.5% queda congelado

$ Memoria de optimización: ~984 MB (full fine-tuning) vs ~4.9 MB (LoRA) — ~200x menos

$ Tarea: sumas de 2 dígitos + 1 dígito (11-90 + 1-9), 1,600 ejemplos sintéticos train / 300 held-out

$ Hallazgo de tokenización: el BPE colapsa '68' en un token → dígitos separados por espacios ('A: 6 8') para aprender dígito a dígito

$ Exact-match en test: base 0.0% → LoRA 29.7% (+29.7 pp), decode greedy determinista

$ Análisis de errores: sumas con carry más difíciles; dígito tens (93.7%) mucho más preciso que ones (29.7%); carry casi perfecto (93.7%)

$ Adaptador guardado (artifacts/lora_adapter, ~1.5 MB) + 6 visualizaciones + history JSON reproducible

# Galería

Terminal del proyecto
Modelos fundacionales — Fine-tuning con LoRA - Terminal del proyecto
Curva de pérdida y exact-match por época
Modelos fundacionales — Fine-tuning con LoRA - Curva de pérdida y exact-match por época
Exact-match: base vs LoRA vs azar
Modelos fundacionales — Fine-tuning con LoRA - Exact-match: base vs LoRA vs azar
Dificultad: sin carry vs con carry
Modelos fundacionales — Fine-tuning con LoRA - Dificultad: sin carry vs con carry
Precisión por dígito (ones/tens)
Modelos fundacionales — Fine-tuning con LoRA - Precisión por dígito (ones/tens)
Parámetros y memoria: full FT vs LoRA
Modelos fundacionales — Fine-tuning con LoRA - Parámetros y memoria: full FT vs LoRA
Generaciones: base vs LoRA
Modelos fundacionales — Fine-tuning con LoRA - Generaciones: base vs LoRA

# Tecnologías utilizadas

Python PyTorch HuggingFace PEFT NumPy Matplotlib