Hyperparameter Search using Trainer API
🤗 Transformersは、🤗 Transformersモデルのトレーニングを最適化するTrainerクラスを提供し、独自のトレーニングループを手動で記述せずにトレーニングを開始するのが簡単になります。Trainerはハイパーパラメーター検索のAPIも提供しています。このドキュメントでは、それを例示します。
Hyperparameter Search backend
Trainerは現在、4つのハイパーパラメーター検索バックエンドをサポートしています: optuna、sigopt、raytune、およびwandb。
これらを使用する前に、ハイパーパラメーター検索バックエンドをインストールする必要があります。
pip install optuna/sigopt/wandb/ray[tune]
How to enable Hyperparameter search in example
ハイパーパラメータの検索スペースを定義し、異なるバックエンドには異なるフォーマットが必要です。
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に関しては、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)を提供しています。 hyperparameter_search
で direction
を渡し、複数の目的関数値を返すための独自の compute_objective
を定義することができます。 Pareto Front(List[BestRun]
)は hyperparameter_search
で返され、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,
... )
Ray Tuneに関して、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については、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,
... )
Trainer を model_init
関数、トレーニング引数、トレーニングデータセット、テストデータセット、および評価関数と共に作成してください:
>>> 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"
である可能性があります。方向は "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,
... )
Hyperparameter search For DDP finetune
現在、DDP(Distributed Data Parallel)のためのハイパーパラメーター検索は、Optuna と SigOpt に対して有効になっています。ランクゼロプロセスのみが検索トライアルを生成し、他のランクに引数を渡します。
< > Update on GitHub