Pular para o conteúdo principal

Varreduras de Hiperparâmetros

Pesquise automaticamente os melhores hiperparâmetros.

Início 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âmetroDescriçãoPadrão
use_sweepHabilitar varreduraFalse
sweep_backendBackend (optuna, grid, random)optuna
sweep_n_trialsNúmero de tentativas10
sweep_metricMétrica para otimizareval_loss
sweep_directionminimizar ou maximizarminimize
sweep_paramsEspaço de busca personalizado (string JSON)None (automático)
post_trial_scriptScript shell a executar após cada trialNone
wandb_sweepHabilitar dashboard nativo de sweeps W&BFalse
wandb_sweep_projectProjeto W&B para sweepproject_name
wandb_sweep_entityEntidade W&B (equipe/usuário)None (usa padrão)
wandb_sweep_idID de sweep existente para continuarNone (cria novo)
wandb_run_idID de run W&B para retomar (para agentes de sweep externos)None

Espaços de Busca

Espaço de Busca Padrão

Por padrão, as varreduras pesquisam sobre:
  • Taxa de aprendizado: 1e-5 a 1e-3 (uniforme log)
  • Tamanho do batch: 2, 4, 8, 16 (categórico)
  • Razão de warmup: 0.0 a 0.2 (uniforme)
O rank LoRA NÃO está incluído na varredura padrão. Adicione manualmente via sweep_params se necessário.

Espaço de Busca Personalizado

O parâmetro sweep_params espera uma string JSON. Formatos de lista e dicionário são suportados:
import json

# Formato dict (recomendado) - especificação 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) - apenas 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 suportados:
TipoDescriçãoParâmetros
categoricalEscolher da listavalues: lista de opções
loguniformDistribuição log-uniformelow, high
uniformDistribuição uniformelow, high
intIntervalo inteirolow, high

Backends de Varredura

Optuna

Otimização bayesiana eficiente:
params = LLMTrainingParams(
    ...
    use_sweep=True,
    sweep_backend="optuna",
)

Busca em Grade

Busca exaustiva sobre todas as combinações:
params = LLMTrainingParams(
    ...
    use_sweep=True,
    sweep_backend="grid",
)

Busca Aleatória

Amostragem aleatória do espaço de busca:
params = LLMTrainingParams(
    ...
    use_sweep=True,
    sweep_backend="random",
)

Métricas

Métricas Padrão

MétricaDescrição
eval_lossPerda de validação
train_lossPerda de treinamento
accuracyPrecisão de classificação
perplexityPerplexidade do modelo de linguagem

Métricas de Avaliação Aprimoradas

Habilite use_enhanced_eval para acessar métricas adicionais:
MétricaDescrição
perplexityPerplexidade do modelo de linguagem (padrão)
bleuPontuação BLEU para tradução/geração
rougePontuação ROUGE para sumarização
bertscoreBERTScore para similaridade semântica
accuracyPrecisão de classificação
f1Pontuação F1
exact_matchPrecisão de correspondência exata
meteorPontuação METEOR

Parâmetros de Avaliação Aprimorada

ParâmetroDescriçãoPadrão
use_enhanced_evalHabilitar métricas aprimoradasFalse
eval_metricsMétricas separadas por vírgula"perplexity"
eval_strategyQuando avaliar (epoch, steps, no)"epoch"
eval_batch_sizeTamanho do batch para avaliação8
eval_dataset_pathCaminho para dataset de avaliação (se diferente)None
eval_save_predictionsSalvar predições durante avaliaçãoFalse
eval_benchmarkExecutar benchmark padrãoNone

Benchmarks Padrão

Use eval_benchmark para executar benchmarks padrão de LLM:
BenchmarkDescrição
mmluMassive Multitask Language Understanding
hellaswagRaciocínio de senso comum HellaSwag
arcAI2 Reasoning Challenge
truthfulqaVeracidade TruthfulQA

Exemplo 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,
)

Exemplo: Encontrar Melhor 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 padrão, sweeps rodam localmente e apenas registram execuções individuais no W&B. Habilite a integração nativa de sweeps W&B para obter visualizações agregadas, gráficos de coordenadas paralelas e análise de importância de parâmetros em um dashboard de sweep dedicado.
Local vs W&B Sweeps: Sem wandb_sweep=True, cada trial é registrado como uma execução separada no W&B. Com wandb_sweep=True, todos os trials são agrupados em um único dashboard de sweep com visualizações 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 um Sweep Existente

Para adicionar mais trials a um sweep existente em vez de criar um novo, passe o ID do sweep:
# Primeira execução cria sweep (imprime "Created W&B sweep: abc123xyz")
aitraining llm --train \
  --use-sweep --sweep-n-trials 10 \
  --wandb-sweep --wandb-sweep-project my-project

# Depois, continue o mesmo sweep com mais trials
aitraining llm --train \
  --use-sweep --sweep-n-trials 10 \
  --wandb-sweep --wandb-sweep-project my-project \
  --wandb-sweep-id abc123xyz
Se você não passar wandb_sweep_id, um novo sweep é criado toda vez. O ID do sweep é impresso nos logs quando o sweep começa (procure por “Created W&B sweep: ”).

Acessando o Dashboard de Sweep

  1. Acesse wandb.ai e abra seu projeto
  2. Clique no ícone de Sweep (vassoura) no painel esquerdo
  3. Selecione seu sweep da lista

Visualizações Integradas

O W&B gera automaticamente três visualizações:
VisualizaçãoDescrição
Gráfico de Coordenadas ParalelasMostra relações entre hiperparâmetros e métricas de relance
Gráfico de DispersãoCompara todas as execuções para identificar padrões
Importância de ParâmetrosClassifica quais hiperparâmetros mais afetam sua métrica
O gráfico de coordenadas paralelas é especialmente útil para identificar quais combinações de hiperparâmetros levam aos melhores resultados. Você pode arrastar em qualquer eixo para filtrar execuções.

Usando com Agentes de Sweep W&B Externos

Se você está executando AITraining a partir de um agente de sweep W&B externo (não o sweep integrado do AITraining), use --wandb-run-id para retomar o run do agente em vez de criar um duplicado:
# Agente de sweep W&B externo chama AITraining com ID do 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
Quando --wandb-run-id é definido, AITraining automaticamente configura WANDB_RESUME=allow para que o trainer retome o run especificado em vez de criar um novo.

Notas Importantes

  • Requer login no W&B: Execute wandb login antes de usar W&B sweeps
  • O ID do sweep é registrado: Procure “Created W&B sweep: ” nos logs
  • Trials são agrupados: Cada trial aparece como uma execução com group={sweep_id} para agregação
  • Optuna ainda gerencia a busca: W&B é apenas para visualização; Optuna/grid/random gerencia a busca real de hiperparâmetros

Ações Pós-Trial

Execute ações personalizadas após cada trial completar, como fazer commit de checkpoints no git, enviar notificações ou sincronizar com armazenamento remoto.

Uso no 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 com métrica $TRIAL_METRIC_VALUE"'

Variáveis de Ambiente

O script pós-trial recebe estas variáveis de ambiente:
VariávelDescriçãoExemplo
TRIAL_NUMBERÍndice do trial (baseado em 0)0, 1, 2
TRIAL_METRIC_VALUEValor da métrica para este trial0.234
TRIAL_IS_BESTSe este é o melhor trial até agoratrue ou false
TRIAL_OUTPUT_DIRDiretório de saída do trial/path/to/sweep/trial_0
TRIAL_PARAMSParâmetros do trial como string{'lr': 0.0001, 'batch_size': 8}

Exemplo: Git Commit para Melhores Modelos

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

Python API com Callback

Para maior controle, use o Python API com uma função callback:
from autotrain.utils import HyperparameterSweep, SweepConfig, TrialInfo

def on_trial_complete(trial_info: TrialInfo):
    """Chamado após cada trial completar."""
    print(f"Trial {trial_info.trial_number} completado")
    print(f"  Params: {trial_info.params}")
    print(f"  Métrica: {trial_info.metric_value}")
    print(f"  É melhor: {trial_info.is_best}")

    if trial_info.is_best:
        # Fazer algo especial para melhores 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()
Ações pós-trial são não bloqueantes. Se um callback ou script falhar, um aviso é registrado mas o sweep continua. Isso garante que o progresso do sweep não seja perdido devido a erros de callback.

Melhores Práticas

  1. Comece pequeno - 10-20 tentativas para exploração inicial
  2. Use early stopping - Pare tentativas ruins cedo
  3. Fix o que você sabe - Varre apenas parâmetros incertos
  4. Use dados de validação - Sempre tenha divisão de avaliação
  5. Use scripts pós-trial - Automatize checkpointing ou notificações

Próximos Passos