Hello all, I am trying to integrate Optuna to Perform Hyperparameter Sweep using the HuggingFace Trainer. For my purposes, I am using one of the pre-trained models from HuggingFace and performing two downstream tasks with it. The first task is finetuning on the Multi-NLI dataset. Once the training for that task is finished, I save my model locally and then use that fine-tuned model to perform my second downstream task which is training on the BOOLQ dataset.
The way that I want to use Optuna is that I want it to only start pruning bad trials once I reach my second downstream task. So even though I am passing in the hyperparameters for both tasks, I don’t want it to start pruning until I reach the second task. How would I go setting this pipeline up?
This is my training function:
```def train_model(
train_dataset,
val_dataset,
num_train_epochs,
train_batch_size,
learning_rate,
lr_scheduler_type,
model_name_or_path,
num_labels=2,
hp_space=None,
load_finetuned=False,
):
if load_finetuned == False:
model = AutoModelForSequenceClassification.from_pretrained(
model_name_or_path, num_labels=num_labels
)
model.to(DEVICE)
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
training_args = TrainingArguments(
overwrite_output_dir=True,
per_device_train_batch_size=train_batch_size,
learning_rate=learning_rate,
num_train_epochs=num_train_epochs,
lr_scheduler_type=lr_scheduler_type,
report_to="none",
evaluation_strategy="epoch",
save_strategy="no",
save_total_limit=2,
load_best_model_at_end=False,
)
trainer = Trainer(
model,
training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset,
data_collator=data_collator,
tokenizer=tokenizer,
)
# trainer.train()
# trainer.save_model(f"best_model_downstream1")
return trainer
else:
model = AutoModelForSequenceClassification.from_pretrained(
model_name_or_path, num_labels=num_labels
)
model.to(DEVICE)
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
training_args = TrainingArguments(
output_dir="downstream2",
overwrite_output_dir=True,
per_device_train_batch_size=train_batch_size,
learning_rate=learning_rate,
num_train_epochs=num_train_epochs,
lr_scheduler_type=lr_scheduler_type,
evaluation_strategy="epoch",
report_to="none",
save_strategy="no",
save_total_limit=2,
load_best_model_at_end=False,
)
trainer = Trainer(
model,
training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset,
data_collator=data_collator,
tokenizer=tokenizer,
compute_metrics=compute_metrics_for_eval_during_training,
)
trainer.train()
trainer.save_model(f"best_model_downstream2")
return trainer
And this is my evaluation function:
metric = evaluate.load("f1")
logits, labels = eval_preds
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
And this is my hyperparameter_space:
epochs = trial.suggest_categorical("epochs", EPOCHS)
batch_size = trial.suggest_categorical("batch_size", BATCH_SIZE)
learning_rate = trial.suggest_categorical("learning_rate", LEARNING_RATES)
scheduler = trial.suggest_categorical("scheduler", SCHEDULERS)
model_name = trial.suggest_categorical("model_name", MODEL_NAMES)
hp_space = {
"model_name": model_name,
"batch_size": batch_size,
"learning_rate": learning_rate,
"scheduler": scheduler,
"epochs": epochs,
}
return hp_space
Please suggest! Thank you