diff --git a/Home.md b/Home.md index 1c5ca28..21fa1a3 100644 --- a/Home.md +++ b/Home.md @@ -200,6 +200,47 @@ SFTTrainer( ``` This will cause no OOMs and make it somewhat faster with no upcasting to float32. +### Early Stopping +If you want to stop the finetuning / training run since the evaluation loss is not decreasing, then you can use early stopping which stops the training process. Use `EarlyStoppingCallback`. + +As usual, set up your trainer and your evaluation dataset and procedure: +```python +from trl import SFTConfig, SFTTrainer +trainer = SFTTrainer( + args = SFTConfig( + fp16_full_eval = True, + per_device_eval_batch_size = 2, + eval_accumulation_steps = 4, + output_dir = "training_checkpoints", # location of saved checkpoints for early stopping + save_strategy = "steps", # save model every N steps + save_steps = 10, # how many steps until we save the model + save_total_limit = 3, # keep ony 3 saved checkpoints to save disk space + eval_strategy = "steps", # evaluate every N steps + eval_steps = 10, # how many steps until we do evaluation + load_best_model_at_end = True, # MUST USE for early stopping + metric_for_best_model = "eval_loss", # metric we want to early stop on + greater_is_better = False, # the lower the eval loss, the better + ), + model = model, + tokenizer = tokenizer, + train_dataset = new_dataset["train"], + eval_dataset = new_dataset["test"], +) +``` +then we add a callback: +```python +from transformers import EarlyStoppingCallback +early_stopping_callback = EarlyStoppingCallback( + early_stopping_patience = 3, # How many steps we will wait if the eval loss doesn't decrease + # For example the loss might increase, but decrease after 3 steps + early_stopping_threshold = 0.0, # Can set higher - sets how much loss should decrease by until + # we consider early stopping. For eg 0.01 means if loss was + # 0.02 then 0.01, we consider to early stop the run. +) +trainer.add_callback(early_stopping_callback) +``` +Then train the model as usual: `trainer.train()` + ### Chat Templates Assuming your dataset is a list of list of dictionaries like the below: ```python