使用Trainer API进行超参数搜索
🤗 Transformers提供了一个Trainer类,它针对训练🤗 Transformers模型进行了优化,使您无需手动编写自己的训练循环即可轻松开始训练。 Trainer 提供了用于超参数搜索的 API。 本文档展示了如何在示例中启用它。
超参数搜索后端
Trainer 当前支持四种超参数搜索后端:optuna、sigopt、raytune 和 wandb.
您应该在将它们用作超参数搜索后端之前安装它们。
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 上更新