Guía de Fine-tuning de LLMs con AstrApp
Aprende todos los conceptos, técnicas y mejores prácticas del fine-tuning. Desde la generación de datos sintéticos hasta el despliegue en producción.
Selección de Modelo
Llama, Qwen, Mistral, Phi
Datasets
Formatos y templates
Hyperparameters
LoRA rank, alpha, epochs
¿Qué es el Fine-tuning?
El fine-tuning de un LLM (Large Language Model) te permite personalizar su comportamiento, mejorar e inyectar conocimiento, y optimizar su rendimiento para dominios o tareas específicas.
Con AstrApp, al hacer fine-tuning de un modelo pre-entrenado puedes:
Actualizar + Aprender Nuevo Conocimiento
Inyectar y aprender información específica de tu dominio o industria.
Personalizar Comportamiento
Ajustar el tono, personalidad o estilo de respuesta del modelo.
Optimizar para Tareas
Mejorar la precisión y relevancia para casos de uso específicos.
LoRA y QLoRA: Métodos de Entrenamiento
LoRA (Low-Rank Adaptation) y QLoRA (Quantized LoRA) son técnicas de fine-tuning eficiente que permiten entrenar modelos grandes con recursos limitados.
LoRA (Low-Rank Adaptation)
LoRA congela los pesos originales del modelo y añade pequeñas matrices de "adaptación" entrenables en capas específicas (típicamente attention layers).
# Configuración típica de LoRA
lora_config = {
"r": 16, # Rank (8-64 típico)
"lora_alpha": 32, # Alpha (usualmente 2x rank)
"lora_dropout": 0.05, # Dropout para regularización
"target_modules": [ # Capas a adaptar
"q_proj", "v_proj", "k_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"
]
}Ventajas
- - Reduce parámetros entrenables ~1000x
- - Adapters pequeños y portables
- - Permite múltiples adapters por modelo
- - Calidad cercana a full fine-tuning
Consideraciones
- - Requiere modelo en FP16/BF16
- - VRAM: ~16GB para 7B params
- - Rank muy bajo puede limitar calidad
QLoRA (Quantized LoRA)
QLoRA combina LoRA con cuantización de 4-bit, permitiendo entrenar modelos mucho más grandes con la misma cantidad de memoria GPU.
# Configuración de QLoRA con bitsandbytes
bnb_config = {
"load_in_4bit": True,
"bnb_4bit_quant_type": "nf4", # Normal Float 4
"bnb_4bit_compute_dtype": "bfloat16",
"bnb_4bit_use_double_quant": True # Nested quantization
}
# El modelo se carga en 4-bit
# Solo los LoRA adapters se entrenan en FP16Ventajas
- - 75% menos VRAM que LoRA estándar
- - Entrena 70B en una sola GPU de 48GB
- - Calidad comparable a LoRA FP16
- - Democratiza el fine-tuning de LLMs
Consideraciones
- - ~10-20% más lento que LoRA
- - Requiere bitsandbytes
- - Paging to CPU puede ayudar aún más
| Característica | LoRA | QLoRA |
|---|---|---|
| VRAM para 7B | ~16GB | ~6GB |
| VRAM para 70B | ~140GB (multi-GPU) | ~48GB |
| Velocidad | Más rápido | 10-20% más lento |
| Calidad | Excelente | Excelente |
| Recomendado para | GPUs grandes, velocidad crítica | La mayoría de casos |
Generación de Datos Sintéticos
La generación de datos sintéticos utiliza LLMs potentes ("maestros") para crear datasets de entrenamiento de alta calidad a partir de documentos existentes.
Proceso de Generación en AstrApp
Ingesta de Documentos
Sube tus documentos (PDF, DOCX, TXT). AstrApp extrae y estructura el contenido automáticamente usando Docling.
# Formatos soportados PDF, DOCX, TXT, Markdown, HTML # Procesamiento automático - Extracción de texto - Preservación de estructura - Chunking inteligente (512-2048 tokens)
Generación de Pares Q&A
Un LLM maestro (GPT-4, Claude, Llama 70B) genera preguntas y respuestas basadas en el contenido.
# Prompt de generación
system: "Genera preguntas y respuestas precisas
basadas en el siguiente contexto. Las respuestas
deben ser informativas y usar solo información
del contexto proporcionado."
user: "Contexto: {chunk}"
# Output esperado
{
"question": "¿Cuál es...?",
"answer": "Según el documento...",
"context": "fragmento relevante"
}Validación de Calidad
Filtrado automático de pares de baja calidad usando métricas de coherencia y relevancia.
# Criterios de validación - Relevancia: ¿La respuesta usa el contexto? - Coherencia: ¿La respuesta es coherente? - Completitud: ¿La respuesta está completa? - Factualidad: ¿Los datos son correctos? # Métricas automáticas - Faithfulness score > 0.8 - Relevance score > 0.7
Formateo para Entrenamiento
Conversión al formato requerido (Alpaca, ShareGPT, ChatML) para el entrenamiento.
# Formato Alpaca
{
"instruction": "pregunta",
"input": "",
"output": "respuesta"
}
# Formato ChatML
<|im_start|>user
pregunta<|im_end|>
<|im_start|>assistant
respuesta<|im_end|>Mejores Prácticas para Datos Sintéticos
- -Usa múltiples LLMs maestros para diversidad
- -Genera más datos de los necesarios, luego filtra
- -Incluye variedad en longitud de respuestas
- -Revisa manualmente una muestra (~5%)
- -Balancea tipos de preguntas (qué, cómo, por qué)
- -Incluye ejemplos de conversación multi-turno
Arquitectura y Configuración del Servidor
AstrApp utiliza una arquitectura distribuida optimizada para entrenamiento eficiente. Aquí están los componentes clave y sus requisitos.
Arquitectura de Entrenamiento
┌─────────────────────────────────────────────────────────────────┐ │ AstrApp Platform │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Frontend │───►│ API │───►│ Redis Queue │ │ │ │ Next.js │ │ FastAPI │ │ (Celery Broker) │ │ │ └─────────────┘ └─────────────┘ └──────────┬──────────┘ │ │ │ │ │ ┌────────────────────────────────────────────────▼───────────┐ │ │ │ ML Worker Pool │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ Worker 1 │ │ Worker 2 │ │ Worker 3 │ │ Worker N │ │ │ │ │ │ GPU: A100│ │ GPU: A100│ │ GPU: T4 │ │ GPU: ... │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ └────────────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────┐ ┌─────────────────────────────────┐│ │ │ Supabase/Postgres │ │ Object Storage (S3/MinIO) ││ │ │ - Jobs, Users │ │ - Datasets, Models, Logs ││ │ └─────────────────────┘ └─────────────────────────────────┘│ └─────────────────────────────────────────────────────────────────┘
| Modelo | Full FT | LoRA | QLoRA |
|---|---|---|---|
| 7B (Llama 3.1, Qwen 2.5) | ~60GB | ~16GB | ~6GB |
| 13B (Llama 2, CodeLlama) | ~120GB | ~28GB | ~10GB |
| 70B (Llama 3.1, Qwen 2.5) | ~600GB | ~140GB | ~48GB |
Optimización con Unsloth (AstrApp Default)
AstrApp utiliza Unsloth por defecto, que proporciona hasta 2-5x más velocidad y 80% menos uso de memoria comparado con implementaciones estándar de HuggingFace.
# Beneficios de Unsloth en AstrApp - 2-5x más rápido que HuggingFace Transformers - 80% menos uso de VRAM - Kernels optimizados para Ampere GPUs (RTX 30xx, A100) - Compatible con LoRA y QLoRA - Soporte para Llama, Mistral, Gemma, Phi # Modelos de 7B entrenan en: - Sin Unsloth: ~4 horas en A100 - Con Unsloth: ~1.5 horas en A100
Contenido Completo de la Guía
¿Qué es el Fine-tuning?
Personaliza el comportamiento de LLMs, inyecta conocimiento y optimiza para tareas específicas.
LoRA y QLoRA: Métodos de Entrenamiento
Comprende las diferencias entre LoRA y QLoRA, cuándo usar cada uno y cómo configurarlos.
Generación de Datos Sintéticos
Crea datasets de entrenamiento de alta calidad usando LLMs como "maestros".
Arquitectura y Configuración del Servidor
Requisitos de hardware, GPU, y configuración óptima para entrenamiento.
Tu Dataset
Estructura, formatos y mejores prácticas para preparar tus datos.
Hyperparameters de Entrenamiento
Learning rate, epochs, batch size, gradient accumulation y más.
Entrenamiento y Evaluación
Interpreta el training loss, configura evaluación y detecta problemas.
Exportar y Desplegar
Guarda tu modelo y despliégalo para producción.
Mitos y Conceptos Erróneos
¿Listo para empezar?
Continúa con la siguiente guía para elegir el modelo correcto para tu caso de uso.