Saltar al contenido principal

Barridos de Hiperparámetros

Busca automáticamente los mejores hiperparámetros.

Inicio Rápido

aitraining llm --train \
  --model google/gemma-3-270m \
  --data-path ./data.jsonl \
  --project-name sweep-experiment \
  --use-sweep \
  --sweep-backend optuna \
  --sweep-n-trials 20

Python API

from autotrain.trainers.clm.params import LLMTrainingParams

params = LLMTrainingParams(
    model="google/gemma-3-270m",
    data_path="./data.jsonl",
    project_name="sweep-experiment",

    # Enable sweep
    use_sweep=True,
    sweep_backend="optuna",
    sweep_n_trials=20,
    sweep_metric="eval_loss",
    sweep_direction="minimize",

    # Base parameters (sweep will vary some)
    trainer="sft",
    epochs=3,
    batch_size=4,
    lr=2e-5,
)

Parámetros

ParámetroDescripciónPor Defecto
use_sweepHabilitar barridoFalse
sweep_backendBackend (optuna, grid, random)optuna
sweep_n_trialsNúmero de intentos10
sweep_metricMétrica a optimizareval_loss
sweep_directionminimizar o maximizarminimize
sweep_paramsEspacio de búsqueda personalizado (cadena JSON)None (automático)
post_trial_scriptScript shell a ejecutar después de cada trialNone
wandb_sweepHabilitar dashboard nativo de sweeps W&BFalse
wandb_sweep_projectProyecto W&B para sweepproject_name
wandb_sweep_entityEntidad W&B (equipo/usuario)None (usa default)
wandb_sweep_idID de sweep existente para continuarNone (crea nuevo)
wandb_run_idID de run W&B a reanudar (para agentes de sweep externos)None

Espacios de Búsqueda

Espacio de Búsqueda Por Defecto

Por defecto, los barridos buscan sobre:
  • Tasa de aprendizaje: 1e-5 a 1e-3 (uniforme log)
  • Tamaño de batch: 2, 4, 8, 16 (categórico)
  • Ratio de warmup: 0.0 a 0.2 (uniforme)
El rango LoRA NO está incluido en el barrido por defecto. Añádelo manualmente vía sweep_params si es necesario.

Espacio de Búsqueda Personalizado

El parámetro sweep_params espera una cadena JSON. Se soportan formatos de lista y diccionario:
import json

# Formato dict (recomendado) - especificación explícita de tipo
sweep_params = json.dumps({
    "lr": {"type": "loguniform", "low": 1e-6, "high": 1e-3},
    "batch_size": {"type": "categorical", "values": [2, 4, 8]},
    "lora_r": {"type": "categorical", "values": [8, 16, 32, 64]},
    "warmup_ratio": {"type": "uniform", "low": 0.0, "high": 0.2},
    "epochs": {"type": "int", "low": 1, "high": 5},
})

# Formato lista (abreviado) - solo para valores categóricos
sweep_params = json.dumps({
    "batch_size": [2, 4, 8],
    "lora_r": [8, 16, 32, 64],
})

params = LLMTrainingParams(
    ...
    use_sweep=True,
    sweep_params=sweep_params,  # JSON string
)
Tipos dict soportados:
TipoDescripciónParámetros
categoricalElegir de listavalues: lista de opciones
loguniformDistribución log-uniformelow, high
uniformDistribución uniformelow, high
intRango enterolow, high

Backends de Barrido

Optuna

Optimización bayesiana eficiente:
params = LLMTrainingParams(
    ...
    use_sweep=True,
    sweep_backend="optuna",
)

Búsqueda en Rejilla

Búsqueda exhaustiva sobre todas las combinaciones:
params = LLMTrainingParams(
    ...
    use_sweep=True,
    sweep_backend="grid",
)

Búsqueda Aleatoria

Muestreo aleatorio del espacio de búsqueda:
params = LLMTrainingParams(
    ...
    use_sweep=True,
    sweep_backend="random",
)

Métricas

Métricas Estándar

MétricaDescripción
eval_lossPérdida de validación
train_lossPérdida de entrenamiento
accuracyPrecisión de clasificación
perplexityPerplejidad del modelo de lenguaje

Métricas de Evaluación Mejoradas

Habilita use_enhanced_eval para acceder a métricas adicionales:
MétricaDescripción
perplexityPerplejidad del modelo de lenguaje (por defecto)
bleuPuntuación BLEU para traducción/generación
rougePuntuación ROUGE para resumen
bertscoreBERTScore para similitud semántica
accuracyPrecisión de clasificación
f1Puntuación F1
exact_matchPrecisión de coincidencia exacta
meteorPuntuación METEOR

Parámetros de Evaluación Mejorada

ParámetroDescripciónPor Defecto
use_enhanced_evalHabilitar métricas mejoradasFalse
eval_metricsMétricas separadas por comas"perplexity"
eval_strategyCuándo evaluar (epoch, steps, no)"epoch"
eval_batch_sizeTamaño de batch para evaluación8
eval_dataset_pathRuta al dataset de evaluación (si diferente)None
eval_save_predictionsGuardar predicciones durante evaluaciónFalse
eval_benchmarkEjecutar benchmark estándarNone

Benchmarks Estándar

Usa eval_benchmark para ejecutar benchmarks estándar de LLM:
BenchmarkDescripción
mmluMassive Multitask Language Understanding
hellaswagRazonamiento de sentido común HellaSwag
arcAI2 Reasoning Challenge
truthfulqaVeracidad TruthfulQA

Ejemplo de Métricas Personalizadas

params = LLMTrainingParams(
    ...
    use_sweep=True,
    sweep_metric="bleu",
    use_enhanced_eval=True,
    eval_metrics="bleu,rouge,bertscore",
    eval_batch_size=8,
)

Ejemplo: Encontrar Mejor LR

import json

params = LLMTrainingParams(
    model="google/gemma-3-270m",
    data_path="./data.jsonl",
    project_name="lr-sweep",

    use_sweep=True,
    sweep_n_trials=10,
    sweep_params=json.dumps({
        "lr": {"type": "loguniform", "low": 1e-6, "high": 1e-3},
    }),

    # Fixed parameters
    trainer="sft",
    epochs=1,
    batch_size=4,
)

Visualizando Resultados

Dashboard Optuna

pip install optuna-dashboard
optuna-dashboard sqlite:///optuna.db

Dashboard Nativo de Sweeps W&B

Por defecto, los sweeps se ejecutan localmente y solo registran ejecuciones individuales en W&B. Habilita la integración nativa de sweeps W&B para obtener vistas agregadas, gráficos de coordenadas paralelas y análisis de importancia de parámetros en un dashboard de sweep dedicado.
Local vs W&B Sweeps: Sin wandb_sweep=True, cada trial se registra como una ejecución separada de W&B. Con wandb_sweep=True, todos los trials se agrupan bajo un único dashboard de sweep con visualizaciones unificadas.

Habilitando W&B Sweeps

aitraining llm --train \
  --model google/gemma-3-270m \
  --data-path ./data.jsonl \
  --project-name sweep-experiment \
  --use-sweep \
  --sweep-backend optuna \
  --sweep-n-trials 20 \
  --log wandb \
  --wandb-sweep \
  --wandb-sweep-project my-sweep-project \
  --wandb-sweep-entity my-team

Continuando un Sweep Existente

Para agregar más trials a un sweep existente en lugar de crear uno nuevo, pasa el ID del sweep:
# Primera ejecución crea sweep (imprime "Created W&B sweep: abc123xyz")
aitraining llm --train \
  --use-sweep --sweep-n-trials 10 \
  --wandb-sweep --wandb-sweep-project my-project

# Después, continúa el mismo sweep con más trials
aitraining llm --train \
  --use-sweep --sweep-n-trials 10 \
  --wandb-sweep --wandb-sweep-project my-project \
  --wandb-sweep-id abc123xyz
Si no pasas wandb_sweep_id, se crea un nuevo sweep cada vez. El ID del sweep se imprime en los logs cuando comienza el sweep (busca “Created W&B sweep: ”).

Accediendo al Dashboard de Sweep

  1. Ve a wandb.ai y abre tu proyecto
  2. Haz clic en el icono de Sweep (escoba) en el panel izquierdo
  3. Selecciona tu sweep de la lista

Visualizaciones Integradas

W&B genera automáticamente tres visualizaciones:
VisualizaciónDescripción
Gráfico de Coordenadas ParalelasMuestra relaciones entre hiperparámetros y métricas de un vistazo
Gráfico de DispersiónCompara todas las ejecuciones para identificar patrones
Importancia de ParámetrosClasifica qué hiperparámetros más afectan tu métrica
El gráfico de coordenadas paralelas es especialmente útil para identificar qué combinaciones de hiperparámetros llevan a los mejores resultados. Puedes arrastrar en cualquier eje para filtrar ejecuciones.

Usando con Agentes de Sweep W&B Externos

Si estás ejecutando AITraining desde un agente de sweep W&B externo (no el sweep integrado de AITraining), usa --wandb-run-id para reanudar el run del agente en lugar de crear un duplicado:
# Agente de sweep W&B externo llama a AITraining con ID de run
aitraining llm --train \
  --model google/gemma-3-270m \
  --data-path ./data.jsonl \
  --wandb-run-id $WANDB_RUN_ID \
  --lr $SWEEP_LR \
  --batch-size $SWEEP_BATCH_SIZE
Cuando se establece --wandb-run-id, AITraining automáticamente configura WANDB_RESUME=allow para que el trainer reanude el run especificado en lugar de crear uno nuevo.

Notas Importantes

  • Requiere login de W&B: Ejecuta wandb login antes de usar W&B sweeps
  • El ID del sweep se registra: Busca “Created W&B sweep: ” en los logs
  • Los trials se agrupan: Cada trial aparece como una ejecución con group={sweep_id} para agregación
  • Optuna sigue gestionando la búsqueda: W&B es solo para visualización; Optuna/grid/random maneja la búsqueda real de hiperparámetros

Acciones Post-Trial

Ejecuta acciones personalizadas después de que cada trial complete, como hacer commit de checkpoints a git, enviar notificaciones, o sincronizar a almacenamiento remoto.

Uso en CLI

aitraining llm --train \
  --model google/gemma-3-270m \
  --data-path ./data.jsonl \
  --project-name sweep-experiment \
  --use-sweep \
  --sweep-n-trials 10 \
  --post-trial-script 'echo "Trial $TRIAL_NUMBER completado con métrica $TRIAL_METRIC_VALUE"'

Variables de Entorno

El script post-trial recibe estas variables de entorno:
VariableDescripciónEjemplo
TRIAL_NUMBERÍndice del trial (basado en 0)0, 1, 2
TRIAL_METRIC_VALUEValor de la métrica para este trial0.234
TRIAL_IS_BESTSi este es el mejor trial hasta ahoratrue o false
TRIAL_OUTPUT_DIRDirectorio de salida del trial/path/to/sweep/trial_0
TRIAL_PARAMSParámetros del trial como string{'lr': 0.0001, 'batch_size': 8}

Ejemplo: Git Commit para Mejores Modelos

aitraining llm --train \
  --use-sweep \
  --sweep-n-trials 20 \
  --post-trial-script 'if [ "$TRIAL_IS_BEST" = "true" ]; then git add . && git commit -m "Mejor modelo: trial $TRIAL_NUMBER, métrica $TRIAL_METRIC_VALUE"; fi'

Python API con Callback

Para mayor control, usa el API de Python con una función callback:
from autotrain.utils import HyperparameterSweep, SweepConfig, TrialInfo

def on_trial_complete(trial_info: TrialInfo):
    """Llamado después de que cada trial complete."""
    print(f"Trial {trial_info.trial_number} completado")
    print(f"  Params: {trial_info.params}")
    print(f"  Métrica: {trial_info.metric_value}")
    print(f"  Es mejor: {trial_info.is_best}")

    if trial_info.is_best:
        # Hacer algo especial para mejores trials
        save_best_model(trial_info.output_dir)

config = SweepConfig(
    parameters={"lr": (1e-5, 1e-3, "log_uniform")},
    n_trials=10,
    backend="optuna",
    post_trial_callback=on_trial_complete,
)

sweep = HyperparameterSweep(config, train_function)
result = sweep.run()
Las acciones post-trial son no bloqueantes. Si un callback o script falla, se registra una advertencia pero el sweep continúa. Esto asegura que el progreso del sweep no se pierda debido a errores de callback.

Mejores Prácticas

  1. Comienza pequeño - 10-20 intentos para exploración inicial
  2. Usa early stopping - Detén intentos malos temprano
  3. Fija lo que sabes - Solo barre parámetros inciertos
  4. Usa datos de validación - Siempre ten división de evaluación
  5. Usa scripts post-trial - Automatiza checkpointing o notificaciones

Próximos Pasos