Transformers 文档

使用 Trainer API 进行超参数搜索

Hugging Face's logo
加入Hugging Face社区

并获得增强版文档体验

开始使用

使用Trainer API进行超参数搜索

🤗 Transformers提供了一个Trainer类,它针对训练🤗 Transformers模型进行了优化,使您无需手动编写自己的训练循环即可轻松开始训练。 Trainer 提供了用于超参数搜索的 API。 本文档展示了如何在示例中启用它。

超参数搜索后端

Trainer 当前支持四种超参数搜索后端:optunasigoptraytunewandb.

您应该在将它们用作超参数搜索后端之前安装它们。

pip install optuna/sigopt/wandb/ray[tune] 

如何在示例中启用超参数搜索

定义超参数搜索空间,不同的后端需要不同的格式。

对于 sigopt,请参阅 sigopt object_parameter,它类似于以下内容

>>> def sigopt_hp_space(trial):
...     return [
...         {"bounds": {"min": 1e-6, "max": 1e-4}, "name": "learning_rate", "type": "double"},
...         {
...             "categorical_values": ["16", "32", "64", "128"],
...             "name": "per_device_train_batch_size",
...             "type": "categorical",
...         },
...     ]

对于 optuna,请参阅 optuna object_parameter,它类似于以下内容

>>> def optuna_hp_space(trial):
...     return {
...         "learning_rate": trial.suggest_float("learning_rate", 1e-6, 1e-4, log=True),
...         "per_device_train_batch_size": trial.suggest_categorical("per_device_train_batch_size", [16, 32, 64, 128]),
...     }

Optuna 提供多目标 HPO。 您可以将 direction 传递给 hyperparameter_search 并定义您自己的 compute_objective 以返回多个目标值。 Pareto 前沿 (List[BestRun]) 将在超参数搜索中返回,您应该参考 test_trainer 中的测试用例 TrainerHyperParameterMultiObjectOptunaIntegrationTest。 它类似于以下内容

>>> best_trials = trainer.hyperparameter_search(
...     direction=["minimize", "maximize"],
...     backend="optuna",
...     hp_space=optuna_hp_space,
...     n_trials=20,
...     compute_objective=compute_objective,
... )

对于 raytune,请参阅 raytune object_parameter,它类似于以下内容

>>> def ray_hp_space(trial):
...     return {
...         "learning_rate": tune.loguniform(1e-6, 1e-4),
...         "per_device_train_batch_size": tune.choice([16, 32, 64, 128]),
...     }

对于 wandb,请参阅 wandb object_parameter,它类似于以下内容

>>> def wandb_hp_space(trial):
...     return {
...         "method": "random",
...         "metric": {"name": "objective", "goal": "minimize"},
...         "parameters": {
...             "learning_rate": {"distribution": "uniform", "min": 1e-6, "max": 1e-4},
...             "per_device_train_batch_size": {"values": [16, 32, 64, 128]},
...         },
...     }

定义一个 model_init 函数并将其传递给 Trainer,例如

>>> def model_init(trial):
...     return AutoModelForSequenceClassification.from_pretrained(
...         model_args.model_name_or_path,
...         from_tf=bool(".ckpt" in model_args.model_name_or_path),
...         config=config,
...         cache_dir=model_args.cache_dir,
...         revision=model_args.model_revision,
...         token=True if model_args.use_auth_token else None,
...     )

使用您的 model_init 函数、训练参数、训练和测试数据集以及评估函数创建一个 Trainer

>>> trainer = Trainer(
...     model=None,
...     args=training_args,
...     train_dataset=small_train_dataset,
...     eval_dataset=small_eval_dataset,
...     compute_metrics=compute_metrics,
...     tokenizer=tokenizer,
...     model_init=model_init,
...     data_collator=data_collator,
... )

调用超参数搜索,获取最佳试验参数,后端可以是 "optuna"/"sigopt"/"wandb"/"ray"。 direction 可以是 "minimize""maximize",它指示是优化更大的目标还是更小的目标。

您可以定义您自己的 compute_objective 函数,如果未定义,将调用默认的 compute_objective,并返回 f1 等评估指标的总和作为目标值。

>>> best_trial = trainer.hyperparameter_search(
...     direction="maximize",
...     backend="optuna",
...     hp_space=optuna_hp_space,
...     n_trials=20,
...     compute_objective=compute_objective,
... )

针对 DDP 微调的超参数搜索

目前,DDP 的超参数搜索已针对 optuna 和 sigopt 启用。 只有排名为零的进程会生成搜索试验并将参数传递给其他排名。

< > 在 GitHub 上更新