回调
回调(Callbacks)是用于自定义 PyTorch Trainer 中训练循环行为的对象。它们可以检查训练循环的状态(例如用于进度报告、在 TensorBoard 或其他 ML 平台上记录日志……),并据此做出决策(例如提前停止训练)。
回调是“只读”的代码片段,除了它们返回的 TrainerControl 对象外,无法对训练循环中的任何内容进行修改。对于需要修改训练循环的自定义需求,您应该对 Trainer 进行子类化,并覆盖所需的方法(示例请参见 trainer)。
默认情况下,TrainingArguments.report_to 被设置为 "none"。
实现回调的主要类是 TrainerCallback。它会获取用于实例化 Trainer 的 TrainingArguments,可以通过 TrainerState 访问该 Trainer 的内部状态,并可以通过 TrainerControl 对训练循环执行某些操作。
可用回调
以下是库中可用的 TrainerCallback 列表:
一个将日志发送到 Comet ML 的 TrainerCallback。
设置可选的 Comet 集成。
环境:
- COMET_MODE (
str, 可选, 默认为get_or_create): 控制是创建并记录到一个新的 Comet 实验,还是追加到现有实验。 它接受以下值:get_or_create:根据COMET_EXPERIMENT_KEY是否已设置,以及是否已存在具有该 key 的 Experiment,自动决定行为。create:始终创建一个新的 Comet Experiment。get:始终尝试追加到现有的 Comet Experiment。 需要设置COMET_EXPERIMENT_KEY。
- COMET_START_ONLINE(
bool,可选): 是否创建在线或离线 Experiment。 - COMET_PROJECT_NAME (
str, 可选): 用于实验的 Comet 项目名称。 - COMET_LOG_ASSETS(
str,可选,默认为TRUE): 是否将训练资产(检查点等)记录到 Comet。可以设置为TRUE或FALSE。
有关环境中可配置项的详细信息,请参阅此处。
一个用于处理训练循环中日志、评估和检查点默认流程的 TrainerCallback。
一个仅用于打印日志的裸 TrainerCallback。
一个用于显示训练或评估进度的 TrainerCallback。
你可以通过修改 max_str_len 来控制记录日志时字符串的截断长度。
class transformers.EarlyStoppingCallback
< source >( early_stopping_patience: int = 1early_stopping_threshold: float | None = 0.0 )
用于处理早停的 TrainerCallback。
此回调依赖于 TrainingArguments 参数 load_best_model_at_end 的功能,以在 TrainerState 中设置 best_metric。请注意,如果 TrainingArguments 参数 save_steps 与 eval_steps 不同,则早停不会发生,直到下一个保存步骤。
class transformers.integrations.TensorBoardCallback
< source >( tb_writer = None )
一个将日志发送到 TensorBoard 的 TrainerCallback。
环境:
- TENSORBOARD_LOGGING_DIR (
str,可选,默认为None): 用于记录结果的日志目录。默认值为 os.path.join(args.output_dir, default_logdir())
一个用于将指标记录到 Trackio 的 TrainerCallback。
设置可选的 Trackio 集成。
要自定义设置,您还可以在 TrainingArguments 中设置 project、trackio_space_id、trackio_bucket_id、trackio_static_space_id 和 hub_private_repo。
一个用于将指标、媒体和模型检查点记录到 Weight and Biases 的 TrainerCallback。
设置可选的 Weights & Biases(wandb)集成。
可以通过子类化并覆盖此方法来自定义设置(如有需要)。更多信息请参见此处。您还可以覆盖以下环境变量:
环境:
- WANDB_LOG_MODEL (
str,可选,默认为"false"): 是否在训练期间记录模型和检查点。可以设置为"end"、"checkpoint"或"false"。如果设置为"end",模型将在训练结束时上传。如果设置为"checkpoint",检查点将每隔args.save_steps上传一次。如果设置为"false",模型将不会被上传。请配合load_best_model_at_end()使用,以上传最佳模型。 - WANDB_WATCH(
str,可选,默认为"false"): 可以是"gradients"、"all"、"parameters"或"false"。设置为"all"以记录梯度和参数。 - WANDB_PROJECT (
str,可选,默认为"huggingface"): 将其设置为自定义字符串,可将结果存储到不同的项目中。
一个将日志发送到 MLflow 的 TrainerCallback。可通过设置环境变量 DISABLE_MLFLOW_INTEGRATION = TRUE 来禁用。
设置可选的 MLflow 集成。
环境:
- HF_MLFLOW_LOG_ARTIFACTS (
str, 可选): 是否使用 MLflow 的.log_artifact()功能来记录工件。仅在向日志记录到远程服务器(例如 s3 或 GCS)时才有意义。如果设置为True或 1,则会将 TrainingArguments 的output_dir中每次保存时生成的每个检查点副本复制到本地或远程工件存储中。在没有远程存储的情况下使用此功能,只会将文件复制到你的工件位置。 - MLFLOW_TRACKING_URI (
str, 可选): 是否将运行记录存储在特定路径或远程服务器上。默认未设置,即完全跳过设置跟踪 URI。 - MLFLOW_EXPERIMENT_NAME (
str, 可选,默认为None): 是否使用 MLflow 的 experiment_name 来启动运行。默认为None,将指向 MLflow 中的Default实验。否则,它是待激活实验的名称(区分大小写)。如果不存在具有该名称的实验,则会创建一个具有该名称的新实验。 - MLFLOW_TAGS (
str, 可选): 一个字符串形式的键值对字典,将作为标签添加到 MLflow 运行中。示例:os.environ['MLFLOW_TAGS']='{"release.candidate": "RC1", "release.version": "2.2.0"}'。 - MLFLOW_NESTED_RUN (
str, 可选): 是否使用 MLflow 嵌套运行。如果设置为True或 1,将在当前运行内创建一个嵌套运行。 - MLFLOW_RUN_ID(
str,可选): 允许重新附加到现有的 run,这在从检查点恢复训练时非常有用。当设置了MLFLOW_RUN_ID环境变量时,start_run会尝试恢复具有指定 run ID 的 run,其他参数将被忽略。 - MLFLOW_FLATTEN_PARAMS(
str,可选,默认为False): 是否在记录之前展平参数字典。 - MLFLOW_MAX_LOG_PARAMS(
int,可选): 设置要记录到运行中的最大参数数量。
一个将日志发送到 AzureML 的 TrainerCallback。
一个用于跟踪训练过程中 CO2 排放量的 TrainerCallback。
一个将日志发送到 ClearML 的 TrainerCallback。
环境:
- CLEARML_PROJECT (
str,可选,默认为HuggingFace Transformers): ClearML 项目名称。 - CLEARML_TASK (
str,可选,默认为Trainer): ClearML 任务名称。 - CLEARML_LOG_MODEL(
bool,可选,默认为False): 是否在训练过程中将模型作为工件进行记录。
一个用于向 DagsHub 记录日志的 TrainerCallback。继承自 MLflowCallback
设置 DagsHub 的日志记录集成。
环境:
- HF_DAGSHUB_LOG_ARTIFACTS (
str, 可选): 是否保存实验的数据和模型工件。默认为False。
class transformers.integrations.FlyteCallback
< source >( save_log_history: bool = Truesync_checkpoints: bool = True )
一个将日志发送到 Flyte 的 TrainerCallback。 注意:此回调仅在 Flyte 任务中有效。
一个用于向 Kubeflow Trainer 报告训练进度的 TrainerCallback。
当在启用了 TrainJobRuntimeStatus 功能门控的 Kubeflow TrainJob 中进行训练时,会自动注册此回调。Kubeflow 控制器会将所需的环境变量注入到训练 Pod 中。
环境变量(由控制器注入):
KUBEFLOW_TRAINER_SERVER_URL:用于状态更新的 HTTPS 端点KUBEFLOW_TRAINER_SERVER_CA_CERT:用于 TLS 验证的 CA 证书路径KUBEFLOW_TRAINER_SERVER_TOKEN:用于身份验证的服务账户令牌路径
报告的信息:
- 进度百分比(0-100%)
- 预计剩余时间(秒)
- 训练指标(loss、learning_rate 等)
功能:
- 自动限流(每 5 秒最多更新 1 次),以避免控制器过载
- Token 缓存(5 分钟)以最小化文件 I/O
- 在分布式训练中,仅 rank 0 报告进度
- 静默失败 - 网络问题不会中断训练
可通过设置环境变量 DISABLE_KUBEFLOW_INTEGRATION=TRUE 来禁用。
class transformers.integrations.DVCLiveCallback
< source >( live: typing.Any | None = Nonelog_model: typing.Union[typing.Literal['all'], bool, NoneType] = None**kwargs )
参数
- live (
dvclive.Live,可选,默认为None) — 可选的 Live 实例。如果为 None,将使用 **kwargs 创建一个新的实例。 - log_model (Union[Literal[“all”], bool], 可选,默认为
None) — 是否使用dvclive.Live.log_artifact()来记录由 Trainer 创建的检查点。如果设置为True, 则在训练结束时记录最终检查点。如果设置为"all",则在每个检查点处记录整个 TrainingArguments 的output_dir。
一个将日志发送到 DVCLive 的 TrainerCallback。
在 setup 中使用以下环境变量来配置集成。若要在此类环境变量之外进一步自定义该回调,请参阅 此处。
设置可选的 DVCLive 集成。若要自定义此回调(超出以下环境变量),请参阅 此处。
环境:
- HF_DVCLIVE_LOG_MODEL (
str, 可选): 是否使用dvclive.Live.log_artifact()来记录由 Trainer 创建的检查点。如果设置为True或 1,则在训练结束时记录最终检查点。如果设置为all,则在每个检查点处记录整个 TrainingArguments 的output_dir。
一个用于将指标、媒体和模型检查点记录到 SwanLab 的 TrainerCallback。
配置可选的 SwanLab (swanlab) 集成。
可以通过子类化并覆盖此方法来自定义设置(如需要)。更多信息请参见此处。
您也可以覆盖以下环境变量。有关环境变量的更多信息,请参见此处
环境:
SWANLAB_API_KEY(
str,可选,默认为None): 云端 API Key。登录时,系统会首先检查此环境变量。如果该变量不存在,系统会检查用户是否已登录。如果未登录,则启动登录流程。- 如果向登录接口传递了字符串,则此环境变量将被忽略。
- 如果用户已登录,此环境变量将优先于本地存储的登录信息。
SWANLAB_PROJECT (
str,可选,默认为None): 将其设置为自定义字符串,可将结果存储到不同的项目中。如果未指定,则使用当前运行目录的名称。SWANLAB_LOG_DIR (
str,可选,默认为swanlog): 此环境变量用于指定在本地模式下运行时日志文件的存储路径。 默认情况下,日志会保存在工作目录下名为 swanlog 的文件夹中。SWANLAB_MODE (
Literal["local", "cloud", "disabled"],可选,默认为cloud): SwanLab 的解析模式,涉及由操作员注册的回调。目前共有三种模式: local、cloud 和 disabled。注意:区分大小写。更多信息请参见 此处SWANLAB_LOG_MODEL (
str,可选,默认为None): SwanLab 目前不支持保存模式功能。此功能将在未来的版本中提供SWANLAB_WEB_HOST (
str,可选,默认为None): 私有版本使用的 SwanLab 云环境 Web 地址(免费)SWANLAB_API_HOST (
str,可选,默认为None): 私有版 SwanLab 云环境的 API 地址(免费)SWANLAB_RUN_ID (
str,可选,默认为None): 用于恢复先前运行的实验 ID。与SWANLAB_RESUME配合使用,以继续现有的实验。SWANLAB_RESUME(
str,可选,默认为None): 恢复模式("must"、"allow"、"never")。当使用resume_from_checkpoint时,默认为"allow"。
TrainerCallback
class transformers.TrainerCallback
< source >( )
参数
- args (TrainingArguments) — 用于实例化 Trainer 的训练参数。
- state (TrainerState) — Trainer 的当前状态。
- control (TrainerControl) — 返回给 Trainer 的对象,可用于做出某些决策。
- model (PreTrainedModel 或
torch.nn.Module) — 正在训练的模型。 - processing_class([
PreTrainedTokenizer或BaseImageProcessor或ProcessorMixin或FeatureExtractionMixin])— 用于对数据进行编码的处理类。可以是分词器、处理器、图像处理器或特征提取器。 - optimizer (
torch.optim.Optimizer) — 用于训练步骤的优化器。 - lr_scheduler (
torch.optim.lr_scheduler.LambdaLR) — 用于设置学习率的调度器。 - train_dataloader (
torch.utils.data.DataLoader,可选) — 当前用于训练的 dataloader。 - eval_dataloader (
torch.utils.data.DataLoader, 可选) — 当前用于评估的数据加载器。 - metrics (
dict[str, float]) — 由最近一次评估阶段计算得出的指标。这些仅在
on_evaluate事件中可访问。 - logs (
dict[str, float]) — 要记录的值。这些内容仅在
on_log事件中可访问。
一个用于检查训练循环在特定事件时的状态并做出相应决策的类。在每个此类事件中,以下参数均可用:
control 对象是唯一可以被回调修改的对象,在这种情况下,对其进行修改的事件应返回修改后的版本。
参数 args、state 和 control 是所有事件的按位置传递的参数,其余参数都包含在 kwargs 中。
你可以在事件的签名中解包所需的参数。例如,请参阅简单的 PrinterCallback 的代码。
示例:
class PrinterCallback(TrainerCallback):
def on_log(self, args, state, control, logs=None, **kwargs):
_ = logs.pop("total_flos", None)
if state.is_local_process_zero:
print(logs)on_epoch_begin
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在 epoch 开始时调用的事件。
on_epoch_end
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在 epoch 结束时调用的事件。
on_evaluate
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在评估阶段之后调用的事件。
on_init_end
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在 Trainer 初始化结束时调用的事件。
在记录完最后一条日志后触发的事件。
on_optimizer_step
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在优化器步骤之后、梯度清零之前调用的事件。适用于监控梯度。
on_pre_optimizer_step
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在梯度裁剪之后、优化器步骤之前调用的事件。适用于监控梯度。
on_predict
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControlmetrics**kwargs )
成功预测后调用的事件。
on_prediction_step
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在预测步骤之后调用的事件。
on_push_begin
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
Event called before pushing the model to the hub, at the beginning of Trainer.push_to_hub and Trainer._push_from_checkpoint.
在检查点保存后调用的事件。
on_step_begin
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在训练步骤开始时调用的事件。如果使用梯度累积,一个训练步骤可能需要处理多个输入。
on_step_end
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在训练步骤结束时调用的事件。如果使用梯度累积,一个训练步骤可能需要处理多个输入。
on_substep_end
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在梯度累积期间,子步骤结束时调用的事件。
on_train_begin
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在训练开始时调用的事件。
on_train_end
< source >( args: TrainingArgumentsstate: TrainerStatecontrol: TrainerControl**kwargs )
在训练结束时调用的事件。
以下是使用 PyTorch Trainer 注册自定义回调的示例:
class MyCallback(TrainerCallback):
"A callback that prints a message at the beginning of training"
def on_train_begin(self, args, state, control, **kwargs):
print("Starting training")
trainer = Trainer(
model,
args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
callbacks=[MyCallback], # We can either pass the callback class this way or an instance of it (MyCallback())
)注册回调的另一种方式是按如下方式调用 trainer.add_callback():
trainer = Trainer(...)
trainer.add_callback(MyCallback)
# Alternatively, we can pass an instance of the callback class
trainer.add_callback(MyCallback())TrainerState
类 transformers.TrainerState
< source >( epoch: float = 0global_step: int = 0max_steps: int = 0logging_steps: int = 500eval_steps: int = 500save_steps: int = 500train_batch_size: int | None = Nonenum_train_epochs: int = 0num_input_tokens_seen: int = 0total_flos: float = 0log_history: list = Nonebest_metric: float | None = Nonebest_global_step: int | None = Nonebest_model_checkpoint: str | None = Noneis_local_process_zero: bool = Trueis_world_process_zero: bool = Trueis_hyper_param_search: bool = Falsetrial_name: str | None = Nonetrial_params: dict[str, str | float | int | bool] | None = Nonestateful_callbacks: list['TrainerCallback'] | None = None )
参数
- epoch (
float, 可选) — 仅在训练期间设置,表示当前所处的训练轮次(小数部分表示当前轮次已完成的百分比)。 - global_step (
int,可选,默认为 0) — 在训练过程中,表示已完成的更新步数。 - max_steps (
int,可选,默认为 0) — 当前训练过程中要执行的更新步数。 - logging_steps (
int,可选,默认为 500) — 每 X 个更新步骤记录一次日志 - eval_steps (
int,可选) — 每隔 X 步执行一次评估。 - save_steps(
int,可选,默认值为 500)— 每 X 个更新步骤保存一次检查点。 - train_batch_size (
int, 可选) — 训练数据加载器的批大小。仅在已使用auto_find_batch_size时需要。 - num_input_tokens_seen (
int,可选,默认为 0) — 在跟踪输入 token 时,训练过程中已看到的 token 数量(指输入 token 的数量,而非预测 token 的数量)。 - total_flos (
float,可选,默认为 0) — 模型自训练开始以来执行的总浮点运算次数(以浮点数形式存储,以避免溢出)。 - log_history (
list[dict[str, float]],可选) — 自训练开始以来生成的日志列表。 - best_metric (
float,可选) — 在跟踪最佳模型时,迄今为止遇到的最佳指标值。 - best_global_step (
int, 可选) — 在跟踪最佳模型时,记录达到最佳指标时的步数。 用于设置best_model_checkpoint。 - best_model_checkpoint (
str, 可选) — 在跟踪最佳模型时,迄今为止遇到的最佳模型检查点的名称值。 - is_local_process_zero (
bool,可选,默认为True) — 此进程是否为本地(例如,在多台机器上以分布式方式训练时,指单台机器上的)主进程。 - is_world_process_zero (
bool,可选,默认为True) — 此进程是否为全局主进程(在多台机器上进行分布式训练时,仅有一个进程为True)。 - is_hyper_param_search (
bool,可选,默认为False) — 是否正在使用 Trainer.hyperparameter_search 进行超参数搜索。这将影响数据在 TensorBoard 中的记录方式。 - stateful_callbacks (
list[StatefulTrainerCallback],可选) — 附加到Trainer上、其状态需要被保存或恢复的回调。 相关的回调应实现state和from_state函数。
一个包含 Trainer 内部状态的类,该状态会在创建检查点时与模型和优化器一起保存,并传递给 TrainerCallback。
在本类中,一个步骤应被理解为一个更新步骤。在使用梯度累积时,一个更新步骤可能需要多次前向和反向传播:如果你使用
gradient_accumulation_steps=n,那么一个更新步骤需要遍历 n 个批次。
根据该值是否为比例,计算并存储用于日志记录、评估和保存步骤的绝对值。
在 self 中存储训练所需的初始引用
从 json_path 的内容创建实例。
以 JSON 格式将此实例的内容保存到 json_path 中。
TrainerControl
class transformers.TrainerControl
< source >( should_training_stop: bool = Falseshould_epoch_stop: bool = Falseshould_save: bool = Falseshould_evaluate: bool = Falseshould_log: bool = False )
参数
- should_training_stop (
bool, 可选, 默认为False) — 是否应中断训练。如果
True,此变量将不会被重置为False。训练将直接停止。 - should_epoch_stop (
bool, 可选, 默认为False) — 是否应中断当前 epoch。如果
True,该变量将在下一个 epoch 开始时重置为False。 - should_save (
bool, 可选, 默认为False) — 是否应在当前步骤保存模型。如果
True,该变量将在下一步开始时重置为False。 - should_evaluate (
bool, 可选, 默认为False) — 是否应在当前步骤对模型进行评估。如果
True,该变量将在下一步开始时重置为False。 - should_log (
bool, 可选, 默认为False) — 是否应在当前步骤报告日志。如果
True,该变量将在下一步开始时重置为False。
一个用于处理 Trainer 控制流的类。该类由 TrainerCallback 使用,以在训练循环中激活某些开关。