Trainer APIλ₯Ό μ¬μ©ν νμ΄νΌνλΌλ―Έν° νμ [[hyperparameter-search-using-trainer-api]]
π€ Transformersμμλ π€ Transformers λͺ¨λΈμ νμ΅μν€λλ° μ΅μ νλ [Trainer] ν΄λμ€λ₯Ό μ 곡νκΈ° λλ¬Έμ, μ¬μ©μλ μ§μ νλ ¨ 루νλ₯Ό μμ±ν νμ μμ΄ λμ± κ°νΈνκ² νμ΅μ μν¬ μ μμ΅λλ€. λν, [Trainer]λ νμ΄νΌνλΌλ―Έν° νμμ μν APIλ₯Ό μ 곡ν©λλ€. μ΄ λ¬Έμμμ μ΄ APIλ₯Ό νμ©νλ λ°©λ²μ μμμ ν¨κ» 보μ¬λλ¦¬κ² μ΅λλ€.
νμ΄νΌνλΌλ―Έν° νμ λ°±μλ [[hyperparameter-search-backend]]
[Trainer]λ νμ¬ μλ 4κ°μ§ νμ΄νΌνλΌλ―Έν° νμ λ°±μλλ₯Ό μ§μν©λλ€:
optunaμ, raytune, wandb μ
λλ€.
νμ΄νΌνλΌλ―Έν° νμ λ°±μλλ‘ μ¬μ©νκΈ° μ μ μλμ λͺ λ Ήμ΄λ₯Ό μ¬μ©νμ¬ λΌμ΄λΈλ¬λ¦¬λ€μ μ€μΉνμΈμ.
pip install optuna/wandb/ray[tune]
μμ μμ νμ΄νΌνλΌλ―Έν° νμμ νμ±ννλ λ°©λ² [[how-to-enable-hyperparameter-search-in-example]]
νμ΄νΌνλΌλ―Έν° νμ 곡κ°μ μ μνμΈμ. νμ΄νΌνλΌλ―Έν° νμ λ°±μλλ§λ€ μλ‘ λ€λ₯Έ νμμ΄ νμν©λλ€.
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]),
... }
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μ κ²½μ°, ν΄λΉ 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,
... )
μλμ κ°μ΄ model_init ν¨μ, νλ ¨ μΈμ, νλ ¨ λ° ν
μ€νΈ λ°μ΄ν°μ
, κ·Έλ¦¬κ³ νκ° ν¨μλ₯Ό μ¬μ©νμ¬ [Trainer]λ₯Ό μμ±νμΈμ:
>>> trainer = Trainer(
... model=None,
... args=training_args,
... train_dataset=small_train_dataset,
... eval_dataset=small_eval_dataset,
... compute_metrics=compute_metrics,
... processing_class=tokenizer,
... model_init=model_init,
... data_collator=data_collator,
... )
νμ΄νΌνλΌλ―Έν° νμμ νΈμΆνκ³ , μ΅μ μ μν λ§€κ°λ³μλ₯Ό κ°μ Έμ€μΈμ. λ°±μλλ "optuna"/"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,
... )
DDP λ―ΈμΈ μ‘°μ μ μν νμ΄νΌνλΌλ―Έν° νμ [[hyperparameter-search-for-ddp-finetune]]
νμ¬, DDP(Distributed Data Parallelism; λΆμ° λ°μ΄ν° λ³λ ¬μ²λ¦¬)λ₯Ό μν νμ΄νΌνλΌλ―Έν° νμμ optuna κ°λ₯ν©λλ€. μ΅μμ νλ‘μΈμ€κ° νμ΄νΌνλΌλ―Έν° νμ κ³Όμ μ μμνκ³ κ·Έ κ²°κ³Όλ₯Ό λ€λ₯Έ νλ‘μΈμ€μ μ λ¬ν©λλ€.