Buckets:

rtrm's picture
|
download
raw
13.9 kB

Ajuste fino con SFTTrainer

El ajuste fino supervisado, o Supervised Fine-Tuning (SFT), es un proceso que se usa principalmente para adaptar modelos de lenguaje preentrenados para que sigan instrucciones, participen en diálogos y utilicen formatos de salida específicos. Aunque los modelos preentrenados tienen capacidades generales impresionantes, SFT ayuda a transformarlos en modelos con comportamiento más parecido al de un asistente, capaces de entender y responder mejor a los prompts de las personas usuarias. Esto suele hacerse entrenándolos con datasets de conversaciones e instrucciones escritas por humanos.

Esta página ofrece una guía paso a paso para ajustar el modelo deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B usando SFTTrainer. Al seguir estos pasos, puedes adaptar el modelo para que realice tareas específicas con mayor eficacia.

Cuándo usar SFT

Antes de entrar en la implementación, conviene entender cuándo SFT es la opción adecuada para tu proyecto. Como primer paso, considera si usar un modelo ya ajustado para instrucciones junto con prompts bien diseñados bastaría para tu caso de uso. SFT requiere recursos computacionales significativos y esfuerzo de ingeniería, así que solo conviene aplicarlo cuando el prompting sobre modelos existentes no sea suficiente.

Considera SFT solo si:

  • Necesitas más rendimiento del que puede lograr el prompting
  • Tienes un caso de uso específico donde el costo de usar un modelo grande de propósito general supera el costo de ajustar un modelo más pequeño
  • Requieres formatos de salida especializados o conocimiento específico del dominio

Si determinas que SFT es necesario, la decisión de seguir adelante depende principalmente de dos factores.

Control de la plantilla

SFT permite un control preciso sobre la estructura de salida del modelo. Esto resulta especialmente valioso cuando necesitas que el modelo:

  1. Genere respuestas con un formato específico de plantilla de chat
  2. Siga esquemas de salida estrictos
  3. Mantenga un estilo consistente entre respuestas

Adaptación al dominio

Al trabajar en dominios especializados, SFT ayuda a alinear el modelo con requisitos propios del dominio mediante:

  1. Enseñar terminología y conceptos específicos del dominio
  2. Reforzar estándares profesionales
  3. Tratar consultas técnicas de forma adecuada
  4. Seguir directrices específicas del sector

Antes de empezar con SFT, evalúa si tu caso de uso requiere:

  • Formato de salida preciso
  • Conocimiento específico del dominio
  • Patrones de respuesta consistentes
  • Cumplimiento de directrices concretas

Esta evaluación te ayudará a determinar si SFT es realmente el enfoque adecuado.

Preparación del dataset

El proceso de ajuste fino supervisado requiere un dataset específico de la tarea estructurado con pares de entrada-salida. Cada par debe consistir en:

  1. Un prompt de entrada
  2. La respuesta esperada del modelo
  3. Cualquier contexto o metadato adicional

La calidad de tus datos de entrenamiento es crucial para que el ajuste fino salga bien. Veamos cómo preparar y validar el dataset:

Configuración del entrenamiento

El éxito del ajuste fino depende mucho de elegir bien los parámetros de entrenamiento. Veamos cuáles son los más importantes y cómo configurarlos.

La configuración de SFTTrainer requiere considerar varios parámetros que controlan el proceso de entrenamiento:

  1. Parámetros de duración del entrenamiento:

    • num_train_epochs: controla la duración total del entrenamiento
    • max_steps: alternativa a las épocas; fija el número máximo de pasos
    • Más épocas permiten aprender mejor, pero aumentan el riesgo de sobreajuste
  2. Parámetros de tamaño de lote:

    • per_device_train_batch_size: determina el uso de memoria y la estabilidad del entrenamiento
    • gradient_accumulation_steps: permite simular tamaños de lote efectivos más grandes
    • Los lotes más grandes suelen dar gradientes más estables, pero exigen más memoria
  3. Parámetros de tasa de aprendizaje:

    • learning_rate: controla el tamaño de las actualizaciones de pesos
    • warmup_ratio: parte del entrenamiento dedicada al calentamiento de la tasa de aprendizaje
    • Una tasa demasiado alta puede causar inestabilidad; una demasiado baja ralentiza el aprendizaje
  4. Parámetros de monitorización:

    • logging_steps: frecuencia con la que se registran métricas
    • eval_steps: frecuencia con la que se evalúa sobre datos de validación
    • save_steps: frecuencia con la que se guardan checkpoints del modelo

Empieza con valores conservadores y ajusta según lo que observes al monitorizar:

  • Empieza con entre 1 y 3 épocas
  • Usa tamaños de lote pequeños al principio
  • Vigila de cerca las métricas de validación
  • Ajusta la tasa de aprendizaje si el entrenamiento resulta inestable

Implementación con TRL

Ahora que entendemos los componentes clave, implementemos el entrenamiento con validación y monitorización adecuadas. Usaremos la clase SFTTrainer de la librería Transformers Reinforcement Learning (TRL), construida sobre transformers. Aquí tienes un ejemplo completo con TRL:

from datasets import load_dataset
from trl import SFTConfig, SFTTrainer
import torch

# Set device
device = "cuda" if torch.cuda.is_available() else "cpu"

# Load dataset
dataset = load_dataset("HuggingFaceTB/smoltalk", "all")

# Configure model and tokenizer
model_name = "HuggingFaceTB/SmolLM2-135M"
model = AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_path=model_name).to(
    device
)
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path=model_name)
# Setup chat template
model, tokenizer = setup_chat_format(model=model, tokenizer=tokenizer)

# Configure trainer
training_args = SFTConfig(
    output_dir="./sft_output",
    max_steps=1000,
    per_device_train_batch_size=4,
    learning_rate=5e-5,
    logging_steps=10,
    save_steps=100,
    eval_strategy="steps",
    eval_steps=50,
)

# Initialize trainer
trainer = SFTTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"],
    processing_class=tokenizer,
)

# Start training
trainer.train()

Cuando usas un dataset con un campo messages, como en el ejemplo anterior, SFTTrainer aplica automáticamente la plantilla de chat del modelo, obtenida desde el Hub. Eso significa que no necesitas configuración adicional para manejar conversaciones en formato chat.

Empaquetado del dataset

SFTTrainer admite example packing para optimizar la eficiencia del entrenamiento. Esta funcionalidad permite empaquetar varios ejemplos cortos dentro de una misma secuencia de entrada, maximizando el uso de la GPU durante el entrenamiento. Para activarla, basta con fijar packing=True en el constructor de SFTConfig.

Cuando usas datasets empaquetados junto con max_steps, ten en cuenta que puedes terminar entrenando durante más épocas de las que esperabas, según la configuración de empaquetado. También puedes personalizar cómo se combinan los ejemplos mediante una función de formateo, algo especialmente útil cuando trabajas con datasets que contienen varios campos, como pares de pregunta-respuesta. Para datasets de evaluación, puedes desactivar el empaquetado con eval_packing=False.

Aquí tienes un ejemplo básico:

# Configure packing
training_args = SFTConfig(packing=True)

trainer = SFTTrainer(model=model, train_dataset=dataset, args=training_args)

trainer.train()

Si el dataset tiene varios campos, puedes definir una función de formateo personalizada para combinarlos en una sola secuencia de entrada:

def formatting_func(example):
    text = f"### Question: {example['question']}\n ### Answer: {example['answer']}"
    return text

training_args = SFTConfig(packing=True)
trainer = SFTTrainer(
    "facebook/opt-350m",
    train_dataset=dataset,
    args=training_args,
    formatting_func=formatting_func,
)

Monitorizar el progreso del entrenamiento

Una buena monitorización es crucial para que el ajuste fino salga bien. Veamos qué conviene observar durante el entrenamiento.

Entender los patrones de pérdida

La pérdida de entrenamiento suele pasar por tres fases bien diferenciadas:

  1. Caída inicial brusca: adaptación rápida a la nueva distribución de datos
  2. Estabilización gradual: el ritmo de aprendizaje se ralentiza a medida que el modelo se ajusta
  3. Convergencia: los valores de pérdida se estabilizan, indicando que el entrenamiento se acerca al final

Métricas que conviene vigilar

Una monitorización eficaz combina métricas cuantitativas con evaluación cualitativa. Algunas métricas útiles son:

  • Pérdida de entrenamiento
  • Pérdida de validación
  • Evolución de la tasa de aprendizaje
  • Normas del gradiente

Vigila estas señales de alerta durante el entrenamiento:

  1. La pérdida de validación sube mientras la pérdida de entrenamiento baja, lo que indica posible sobreajuste
  2. No hay mejora significativa en los valores de pérdida, lo que sugiere posible infraajuste
  3. Valores de pérdida extremadamente bajos, que pueden indicar memorización
  4. Formato de salida inconsistente, señal de problemas al aprender la plantilla

El camino hacia la convergencia

A medida que avanza el entrenamiento, la curva de pérdida debería estabilizarse gradualmente. Un indicador importante de un entrenamiento saludable es que la diferencia entre la pérdida de entrenamiento y la de validación sea pequeña, lo que sugiere que el modelo está aprendiendo patrones generalizables en vez de memorizar ejemplos concretos. Los valores absolutos de pérdida variarán según la tarea y el dataset.

Seguimiento del progreso

El gráfico anterior muestra una progresión típica de entrenamiento. Observa cómo tanto la pérdida de entrenamiento como la de validación disminuyen rápidamente al principio y luego se estabilizan de forma progresiva. Ese patrón suele indicar que el modelo está aprendiendo de forma efectiva sin perder capacidad de generalización.

Señales de alerta a vigilar

Algunos patrones en las curvas de pérdida pueden indicar problemas potenciales. A continuación se muestran ejemplos frecuentes y posibles acciones correctivas.

Si la pérdida de validación disminuye mucho más despacio que la pérdida de entrenamiento, el modelo probablemente se está sobreajustando a los datos de entrenamiento. Considera:

  • Reducir el número de pasos de entrenamiento
  • Aumentar el tamaño del dataset
  • Revisar la calidad y diversidad del dataset

Si la pérdida no mejora de forma significativa, el modelo podría:

  • Estar aprendiendo demasiado despacio, en cuyo caso conviene subir la tasa de aprendizaje
  • Tener dificultades con la tarea, en cuyo caso conviene revisar la calidad de los datos y la complejidad de la tarea
  • Haber alcanzado límites de arquitectura, en cuyo caso conviene probar otro modelo

Valores de pérdida extremadamente bajos pueden sugerir memorización en vez de aprendizaje. Esto es especialmente preocupante si:

  • El modelo rinde mal en ejemplos nuevos pero similares
  • Las salidas tienen poca diversidad
  • Las respuestas se parecen demasiado a los ejemplos de entrenamiento

Vigila tanto los valores de pérdida como las salidas reales del modelo durante el entrenamiento. A veces la pérdida puede parecer buena mientras el modelo desarrolla comportamientos no deseados. La evaluación cualitativa regular ayuda a detectar problemas que las métricas por sí solas pueden pasar por alto.

Conviene recordar que esta interpretación de la pérdida se centra en los casos más comunes. En la práctica, los valores de pérdida pueden comportarse de formas muy distintas según el modelo, el dataset y los parámetros de entrenamiento. Si quieres profundizar en estos patrones, revisa esta entrada del blog de Fast AI.

Evaluación después de SFT

En la sección 11.4 veremos cómo evaluar el modelo usando datasets de benchmark. Por ahora, nos centraremos en la evaluación cualitativa.

Después de completar SFT, considera estas acciones de seguimiento:

  1. Evaluar el modelo a fondo sobre datos de prueba reservados
  2. Validar el cumplimiento de la plantilla con entradas variadas
  3. Comprobar la retención de conocimiento específico del dominio
  4. Monitorizar métricas de rendimiento en escenarios reales

Documenta el proceso de entrenamiento, incluyendo:

  • Características del dataset
  • Parámetros de entrenamiento
  • Métricas de rendimiento
  • Limitaciones conocidas Esa documentación será útil para iteraciones futuras del modelo.

Quiz

1. ¿Qué parámetros controlan la duración del entrenamiento en SFT?

2. ¿Qué patrón en las curvas de pérdida indica posible sobreajuste?

3. ¿Para qué se usa gradient_accumulation_steps?

4. ¿Qué deberías monitorizar durante el entrenamiento con SFT?

5. ¿Qué indica una convergencia saludable durante el entrenamiento?

💐 Buen trabajo

Ya has aprendido a ajustar modelos usando SFT. Para seguir avanzando:

  1. Prueba el notebook con parámetros distintos
  2. Experimenta con otros datasets
  3. Contribuye mejoras al material del curso

Recursos adicionales

Xet Storage Details

Size:
13.9 kB
·
Xet hash:
688bc3982a180a2fb5e0a6ce0b61df2c9badd020cf4bb907d5c53d81d09a1f4d

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.