Transformers documentation

Callbacks

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Callbacks

TrainerCallback se integra a eventos específicos do treinamento (início de epoch, avaliação, fim do treinamento) para modificar o estado do treinamento ou o fluxo de controle. Use callbacks para registrar métricas em rastreadores de experimentos como Trackio, personalizar quando o salvamento e a avaliação ocorrem, ou adicionar outros comportamentos personalizados. Empilhe múltiplos callbacks para combinar funcionalidades.

Os callbacks não podem modificar o próprio loop de treinamento, como a passagem direta. Para alterar o que o Trainer calcula, crie uma subclasse dos seus métodos.

O diagrama abaixo mostra todos os eventos em que um callback pode se conectar.

on_train_begin
  └─ for each epoch:
      on_epoch_begin
      └─ for each step:
          on_step_begin
          ├─ for each gradient accumulation substep:
          │   on_substep_end
          on_pre_optimizer_step   ← after gradient clipping, before optimizer.step()
          on_optimizer_step       ← after optimizer.step()
          on_step_end
          └─ (conditionally):
              on_log
              on_evaluate
              on_save
      on_epoch_end
on_train_end
on_predict / on_prediction_step
on_push_begin

Criando um callback

Subclasse TrainerCallback e sobrescreva um ou mais métodos de eventos do diagrama acima. O exemplo abaixo demonstra três hooks:

  • on_epoch_begin imprime o epoch atual de TrainerState (um valor dinâmico) e a taxa de aprendizado de TrainingArguments (um valor estático).
  • on_step_end lê a taxa de aprendizado atual do lr_scheduler (passado via **kwargs) e define should_evaluate em TrainerControl (veja TrainerControl para uma lista completa dos objetos de controle) para disparar uma avaliação quando ela cair abaixo do limite.
  • on_train_end imprime a melhor métrica e o passo em que ela ocorreu.
from transformers import TrainerCallback

class EpochLoggerCallback(TrainerCallback):
    def __init__(self, lr_eval_threshold=1e-5):
        self.lr_eval_threshold = lr_eval_threshold

    def on_epoch_begin(self, args, state, control, **kwargs):
        print(f"Starting epoch {int(state.epoch) + 1}/{state.num_train_epochs} "
              f"(lr={args.learning_rate})")

    def on_step_end(self, args, state, control, **kwargs):
        lr_scheduler = kwargs.get("lr_scheduler")
        if lr_scheduler is not None:
            current_lr = lr_scheduler.get_last_lr()[0]
            if current_lr < self.lr_eval_threshold:
                control.should_evaluate = True

    def on_train_end(self, args, state, control, **kwargs):
        print(f"Training complete! Best metric: {state.best_metric} at step {state.best_global_step}")

Registre o callback no Trainer no argumento callbacks. Você também pode passar vários callbacks como uma lista.

trainer = Trainer(
    callbacks=[EpochLoggerCallback(lr_eval_threshold=1e-5)],
    ...,
)

Callbacks integrados

O Transformers inclui vários callbacks integrados que estão ativos por padrão. Callbacks integrados adicionais, como callbacks integrados, registram logs em plataformas como Trackio.

DefaultFlowCallback

DefaultFlowCallback gerencia o agendamento padrão de registro de logs, avaliação e checkpoint com base nos valores de logging_strategy, eval_strategy e save_strategy em TrainingArguments. No passo ou epoch adequado, ele define as flags correspondentes de control (should_log, should_evaluate, should_save). Ele também define should_training_stop quando global_step atinge max_steps.

A sobrescrita deste callback é a principal forma de personalizar quando o registro, a avaliação ou o salvamento ocorrem.

ProgressCallback e PrinterCallback

O Trainer escolhe automaticamente entre esses dois callbacks com base no campo disable_tqdm em TrainingArguments.

  • ProgressCallback é usado por padrão. Ele exibe uma barra de progresso tqdm durante o treinamento e uma barra separada durante a avaliação ou a predição, e imprime as métricas mais recentes a cada evento on_log. Durante o treinamento distribuído, ele é executado apenas no processo principal para evitar saída duplicada.
  • PrinterCallback é usado quando disable_tqdm=True. Ele imprime o dicionário de log no stdout a cada evento on_log, sem barra de progresso.

Você também pode trocá-los manualmente com remove_callback() e add_callback().

from transformers import PrinterCallback

trainer = Trainer(...)
trainer.remove_callback(ProgressCallback)
trainer.add_callback(PrinterCallback)

EarlyStoppingCallback

EarlyStoppingCallback interrompe o treinamento quando uma métrica de avaliação deixa de melhorar. Após cada avaliação, ele verifica se a métrica melhorou em mais de early_stopping_threshold. Se a métrica não tiver melhorado em early_stopping_patience avaliações consecutivas, o treinamento é interrompido.

EarlyStoppingCallback requer dois TrainingArguments:

  • metric_for_best_model, a métrica de avaliação a ser monitorada
  • eval_strategy, se a avaliação deve ser feita em "steps" ou "epoch"
from transformers import EarlyStoppingCallback

trainer = Trainer(
    ...,
    callbacks=[EarlyStoppingCallback(early_stopping_patience=3, early_stopping_threshold=0.001)],
)

Próximas etapas

Update on GitHub