From b419e4d8298fbb31a5ae5be9730b952393b7a7be Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Thu, 18 Nov 2021 11:11:42 -0800 Subject: [PATCH 01/44] several recommended fixes for lightning_examples/finetuning-scheduler/finetuning-scheduler.py Co-authored-by: thomas chaton --- .../finetuning-scheduler/.meta.yml | 20 ++ .../finetuning-scheduler.py | 326 ++++++++++++++++++ .../text-transformers/text-transformers.py | 2 +- 3 files changed, 347 insertions(+), 1 deletion(-) create mode 100644 lightning_examples/finetuning-scheduler/.meta.yml create mode 100644 lightning_examples/finetuning-scheduler/finetuning-scheduler.py diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml new file mode 100644 index 000000000..6a2a38ce8 --- /dev/null +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -0,0 +1,20 @@ +title: Finetuning Scheduler +author: PL team +created: 2021-01-31 +updated: 2021-06-21 +license: CC BY-SA +build: 1 +tags: + - Text +description: | + This notebook will use HuggingFace's `datasets` library to get data, which will be wrapped in a `LightningDataModule`. + Then, we write a class to perform text classification on any dataset from the [GLUE Benchmark](https://gluebenchmark.com/). + (We just show CoLA and MRPC due to constraint on compute/disk) +requirements: + - transformers + - datasets + - scipy + - scikit-learn +accelerator: + - CPU + - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py new file mode 100644 index 000000000..b97a1012e --- /dev/null +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -0,0 +1,326 @@ +# %% +from datetime import datetime +from typing import Optional + +import datasets +import torch +from pytorch_lightning import LightningDataModule, LightningModule, Trainer, seed_everything +from torch.utils.data import DataLoader +from transformers import ( + AdamW, + AutoConfig, + AutoModelForSequenceClassification, + AutoTokenizer, + get_linear_schedule_with_warmup, +) + +AVAIL_GPUS = min(1, torch.cuda.device_count()) + +# %% [markdown] +# ## Training BERT with Lightning + +# %% [markdown] +# ### Lightning DataModule for GLUE + + +# %% +class GLUEDataModule(LightningDataModule): + + task_text_field_map = { + "cola": ["sentence"], + "sst2": ["sentence"], + "mrpc": ["sentence1", "sentence2"], + "qqp": ["question1", "question2"], + "stsb": ["sentence1", "sentence2"], + "mnli": ["premise", "hypothesis"], + "qnli": ["question", "sentence"], + "rte": ["sentence1", "sentence2"], + "wnli": ["sentence1", "sentence2"], + "ax": ["premise", "hypothesis"], + } + + glue_task_num_labels = { + "cola": 2, + "sst2": 2, + "mrpc": 2, + "qqp": 2, + "stsb": 1, + "mnli": 3, + "qnli": 2, + "rte": 2, + "wnli": 2, + "ax": 3, + } + + loader_columns = [ + "datasets_idx", + "input_ids", + "token_type_ids", + "attention_mask", + "start_positions", + "end_positions", + "labels", + ] + + def __init__( + self, + model_name_or_path: str, + task_name: str = "mrpc", + max_seq_length: int = 128, + train_batch_size: int = 32, + eval_batch_size: int = 32, + **kwargs, + ): + super().__init__() + self.model_name_or_path = model_name_or_path + self.task_name = task_name + self.max_seq_length = max_seq_length + self.train_batch_size = train_batch_size + self.eval_batch_size = eval_batch_size + + self.text_fields = self.task_text_field_map[task_name] + self.num_labels = self.glue_task_num_labels[task_name] + self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True) + + def setup(self, stage: str): + self.dataset = datasets.load_dataset("glue", self.task_name) + + for split in self.dataset.keys(): + self.dataset[split] = self.dataset[split].map( + self.convert_to_features, + batched=True, + remove_columns=["label"], + ) + self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns] + self.dataset[split].set_format(type="torch", columns=self.columns) + + self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] + + def prepare_data(self): + datasets.load_dataset("glue", self.task_name) + AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True) + + def train_dataloader(self): + return DataLoader(self.dataset["train"], batch_size=self.train_batch_size) + + def val_dataloader(self): + if len(self.eval_splits) == 1: + return DataLoader(self.dataset["validation"], batch_size=self.eval_batch_size) + elif len(self.eval_splits) > 1: + return [DataLoader(self.dataset[x], batch_size=self.eval_batch_size) for x in self.eval_splits] + + def test_dataloader(self): + if len(self.eval_splits) == 1: + return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size) + elif len(self.eval_splits) > 1: + return [DataLoader(self.dataset[x], batch_size=self.eval_batch_size) for x in self.eval_splits] + + def convert_to_features(self, example_batch, indices=None): + + # Either encode single sentence or sentence pairs + if len(self.text_fields) > 1: + texts_or_text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) + else: + texts_or_text_pairs = example_batch[self.text_fields[0]] + + # Tokenize the text/text pairs + features = self.tokenizer.batch_encode_plus( + texts_or_text_pairs, max_length=self.max_seq_length, pad_to_max_length=True, truncation=True + ) + + # Rename label to labels to make it easier to pass to model forward + features["labels"] = example_batch["label"] + + return features + + +# %% [markdown] +# **You could use this datamodule with standalone PyTorch if you wanted...** + +# %% +dm = GLUEDataModule("distilbert-base-uncased") +dm.prepare_data() +dm.setup("fit") +next(iter(dm.train_dataloader())) + +# %% [markdown] +# ### Transformer LightningModule + + +# %% +class GLUETransformer(LightningModule): + def __init__( + self, + model_name_or_path: str, + num_labels: int, + task_name: str, + learning_rate: float = 2e-5, + adam_epsilon: float = 1e-8, + warmup_steps: int = 0, + weight_decay: float = 0.0, + train_batch_size: int = 32, + eval_batch_size: int = 32, + eval_splits: Optional[list] = None, + **kwargs, + ): + super().__init__() + + self.save_hyperparameters() + + self.config = AutoConfig.from_pretrained(model_name_or_path, num_labels=num_labels) + self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=self.config) + self.metric = datasets.load_metric( + "glue", self.hparams.task_name, experiment_id=datetime.now().strftime("%d-%m-%Y_%H-%M-%S") + ) + + def forward(self, **inputs): + return self.model(**inputs) + + def training_step(self, batch, batch_idx): + outputs = self(**batch) + loss = outputs[0] + return loss + + def validation_step(self, batch, batch_idx, dataloader_idx=0): + outputs = self(**batch) + val_loss, logits = outputs[:2] + + if self.hparams.num_labels >= 1: + preds = torch.argmax(logits, axis=1) + elif self.hparams.num_labels == 1: + preds = logits.squeeze() + + labels = batch["labels"] + + return {"loss": val_loss, "preds": preds, "labels": labels} + + def validation_epoch_end(self, outputs): + if self.hparams.task_name == "mnli": + for i, output in enumerate(outputs): + # matched or mismatched + split = self.hparams.eval_splits[i].split("_")[-1] + preds = torch.cat([x["preds"] for x in output]).detach().cpu().numpy() + labels = torch.cat([x["labels"] for x in output]).detach().cpu().numpy() + loss = torch.stack([x["loss"] for x in output]).mean() + self.log(f"val_loss_{split}", loss, prog_bar=True) + split_metrics = { + f"{k}_{split}": v for k, v in self.metric.compute(predictions=preds, references=labels).items() + } + self.log_dict(split_metrics, prog_bar=True) + return loss + + preds = torch.cat([x["preds"] for x in outputs]).detach().cpu().numpy() + labels = torch.cat([x["labels"] for x in outputs]).detach().cpu().numpy() + loss = torch.stack([x["loss"] for x in outputs]).mean() + self.log("val_loss", loss, prog_bar=True) + self.log_dict(self.metric.compute(predictions=preds, references=labels), prog_bar=True) + return loss + + def setup(self, stage=None) -> None: + if stage != "fit": + return + # Get dataloader by calling it - train_dataloader() is called after setup() by default + # train_loader = self.train_dataloader() + train_loader = self.trainer.datamodule.train_dataloader() + # Calculate total steps + tb_size = self.hparams.train_batch_size * max(1, self.trainer.gpus) + ab_size = self.trainer.accumulate_grad_batches * float(self.trainer.max_epochs) + self.total_steps = (len(train_loader.dataset) // tb_size) // ab_size + + def configure_optimizers(self): + """Prepare optimizer and schedule (linear warmup and decay)""" + model = self.model + no_decay = ["bias", "LayerNorm.weight"] + optimizer_grouped_parameters = [ + { + "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], + "weight_decay": self.hparams.weight_decay, + }, + { + "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], + "weight_decay": 0.0, + }, + ] + optimizer = AdamW(optimizer_grouped_parameters, lr=self.hparams.learning_rate, eps=self.hparams.adam_epsilon) + + scheduler = get_linear_schedule_with_warmup( + optimizer, + num_warmup_steps=self.hparams.warmup_steps, + num_training_steps=self.total_steps, + ) + scheduler = {"scheduler": scheduler, "interval": "step", "frequency": 1} + return [optimizer], [scheduler] + + +# %% [markdown] +# ## Training + +# %% [markdown] +# ### CoLA +# +# See an interactive view of the +# CoLA dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=cola) + +# %% +seed_everything(42) + +dm = GLUEDataModule(model_name_or_path="albert-base-v2", task_name="cola") +dm.setup("fit") +model = GLUETransformer( + model_name_or_path="albert-base-v2", + num_labels=dm.num_labels, + eval_splits=dm.eval_splits, + task_name=dm.task_name, +) + +trainer = Trainer(max_epochs=1, gpus=AVAIL_GPUS) +trainer.fit(model, dm) + +# %% [markdown] +# ### MRPC +# +# See an interactive view of the +# MRPC dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=mrpc) + +# %% +seed_everything(42) + +dm = GLUEDataModule( + model_name_or_path="distilbert-base-cased", + task_name="mrpc", +) +dm.setup("fit") +model = GLUETransformer( + model_name_or_path="distilbert-base-cased", + num_labels=dm.num_labels, + eval_splits=dm.eval_splits, + task_name=dm.task_name, +) + +trainer = Trainer(max_epochs=3, gpus=AVAIL_GPUS) +trainer.fit(model, dm) + +# %% [markdown] +# ### MNLI +# +# - The MNLI dataset is huge, so we aren't going to bother trying to train on it here. +# - We will skip over training and go straight to validation. +# +# See an interactive view of the +# MRPC dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=mnli) + +# %% +dm = GLUEDataModule( + model_name_or_path="distilbert-base-cased", + task_name="mnli", +) +dm.setup("fit") +model = GLUETransformer( + model_name_or_path="distilbert-base-cased", + num_labels=dm.num_labels, + eval_splits=dm.eval_splits, + task_name=dm.task_name, +) + +trainer = Trainer(gpus=AVAIL_GPUS, progress_bar_refresh_rate=20) +trainer.validate(model, dm.val_dataloader()) diff --git a/lightning_examples/text-transformers/text-transformers.py b/lightning_examples/text-transformers/text-transformers.py index 57786f010..d14a2e397 100644 --- a/lightning_examples/text-transformers/text-transformers.py +++ b/lightning_examples/text-transformers/text-transformers.py @@ -220,7 +220,7 @@ def setup(self, stage=None) -> None: if stage != "fit": return # Get dataloader by calling it - train_dataloader() is called after setup() by default - train_loader = self.trainer.datamodule.train_dataloader() + train_loader = self.train_dataloader() # Calculate total steps tb_size = self.hparams.train_batch_size * max(1, self.trainer.gpus) From 441104ad3e3cc8fbc2d92ac835f7862ca84c93b6 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Mon, 29 Nov 2021 17:22:25 -0800 Subject: [PATCH 02/44] notebook-based fts tutorial and example --- .../finetuning-scheduler/.meta.yml | 19 +- .../finetuning-scheduler/emphasized_yaml.svg | 1176 +++++++++++++++++ .../finetuning-scheduler.py | 704 +++++++--- .../fts_explicit_loss_anim.gif | Bin 0 -> 302052 bytes .../side_by_side_yaml.svg | 754 +++++++++++ 5 files changed, 2437 insertions(+), 216 deletions(-) create mode 100644 lightning_examples/finetuning-scheduler/emphasized_yaml.svg create mode 100644 lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif create mode 100644 lightning_examples/finetuning-scheduler/side_by_side_yaml.svg diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 6a2a38ce8..33296fba5 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -1,20 +1,19 @@ title: Finetuning Scheduler -author: PL team -created: 2021-01-31 -updated: 2021-06-21 +author: Dan Dale +created: 2021-11-26 +updated: 2021-11-26 license: CC BY-SA build: 1 tags: - - Text + - finetuning description: | - This notebook will use HuggingFace's `datasets` library to get data, which will be wrapped in a `LightningDataModule`. - Then, we write a class to perform text classification on any dataset from the [GLUE Benchmark](https://gluebenchmark.com/). - (We just show CoLA and MRPC due to constraint on compute/disk) + This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune + a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task + of [SuperGLUE](https://super.gluebenchmark.com/) with iterative earlystopping defined according to a user-specified + schedule. It uses HuggingFace's `datasets` and `transformers`` libraries to retrieve the relevant benchmark data and + foundational model weights. requirements: - transformers - datasets - - scipy - - scikit-learn accelerator: - - CPU - GPU diff --git a/lightning_examples/finetuning-scheduler/emphasized_yaml.svg b/lightning_examples/finetuning-scheduler/emphasized_yaml.svg new file mode 100644 index 000000000..eda7e7891 --- /dev/null +++ b/lightning_examples/finetuning-scheduler/emphasized_yaml.svg @@ -0,0 +1,1176 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index b97a1012e..9669cb632 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,57 +1,274 @@ +# -*- coding: utf-8 -*- +# --- +# jupyter: +# jupytext: +# formats: ipynb,py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.13.1 +# kernelspec: +# display_name: 'Python 3.7.11 64-bit (''pldev_tutorials'': conda)' +# language: python +# name: python3 +# --- + +# %% [markdown] +# # Scheduled Finetuning +# +#
+# +# The ``FinetuningScheduler`` callback enables multi-phase, +# scheduled finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize +# foundational model knowledge retention while allowing (typically upper layers of) the model to +# optimally adapt to new tasks during transfer learning [1, 2, 3](#f1) +# +#
+# +# ``FinetuningScheduler`` orchestrates the gradual unfreezing +# of models via a finetuning schedule that is either implicitly generated (the default) or explicitly provided by the user +# (more computationally efficient). Finetuning phase transitions are driven by +# ``FTSEarlyStopping`` criteria (a multi-phase +# extension of ``EarlyStopping``), user-specified epoch transitions or a composition of the two (the default mode). +# A ``FinetuningScheduler`` training session completes when the +# final phase of the schedule has its stopping criteria met. See +# the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/extensions/generated/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. +# +# + +# %% [markdown] +# ## Basic Usage +# +# If no finetuning schedule is user-provided, ``FinetuningScheduler`` will generate a +# [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, using default ``FTSEarlyStopping`` and ``FTSCheckpoint`` callbacks with ``monitor=val_loss``. +# +# ```python +# from pytorch_lightning import Trainer +# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# trainer = Trainer(callbacks=[FinetuningScheduler()]) +# ``` + +# %% [markdown] +# ## The Default Finetuning Schedule +# +# Schedule definition is facilitated via the ``gen_ft_schedule`` method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as +# desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will often be less computationally efficient than a user-defined finetuning schedule but can often serve as a good baseline for subsquent explicit schedule refinement and will marginally outperform many explicit schedules. + +# %% [markdown] +# ## Specifying a Finetuning Schedule +# +# To specify a finetuning schedule, it's convenient to first generate the default schedule and then alter the thawed/unfrozen parameter groups associated with each finetuning phase as desired. Finetuning phases are zero-indexed and executed in ascending order. +# +# 1. Generate the default schedule to ``Trainer.log_dir`` with the name +# (``lightning_module.__class__.__name__``)_ft_schedule.yaml +# +# ```python +# from pytorch_lightning import Trainer +# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# trainer = Trainer(callbacks=[FinetuningScheduler(gen_ft_sched_only=True)]) +# ``` +# +# 2. Alter the schedule as desired. +# +# +# +# 3. Once the finetuning schedule has been altered as desired, pass it to +# ``FinetuningScheduler`` to commence scheduled training: +# +# ```python +# from pytorch_lightning import Trainer +# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# +# trainer = Trainer(callbacks=[FinetuningScheduler(ft_schedule="/path/to/my/schedule/my_schedule.yaml")]) +# ``` + +# %% [markdown] +# ## EarlyStopping and Epoch-Driven Phase Transition Criteria +# +# +# By default, ``FTSEarlyStopping`` and epoch-driven +# transition criteria are composed. If a ``max_transition_epoch`` is specified for a given phase, the next finetuning phase will begin at that epoch unless ``FTSEarlyStopping`` criteria are met first. +# If ``FinetuningScheduler.epoch_transitions_only`` is ``True``, ``FTSEarlyStopping`` will not be used +# and transitions will be exclusively epoch-driven. +# +# +#
+# +# **Tip:** Use of regex expressions can be convenient for specifying more complex schedules: +# +# +# +#
+# +# +# +# The end-to-end example in this notebook ([Scheduled Finetuning For SuperGLUE](#superglue)) uses ``FinetuningScheduler`` in explicit mode to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). + +# %% [markdown] +# ## Resuming Scheduled Finetuning Training Sessions +# +# Resumption of scheduled finetuning training is identical to the continuation of +# [other training sessions](https://pytorch-lightning.readthedocs.io/en/latest/common/trainer.html) with the caveat that the provided checkpoint must have been saved by a ``FinetuningScheduler`` session. +# ``FinetuningScheduler`` uses ``FTSCheckpoint`` (an extension of ``ModelCheckpoint``) to maintain schedule state with special metadata. +# +# +# ```python +# from pytorch_lightning import Trainer +# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# trainer = Trainer(callbacks=[FinetuningScheduler()], resume_from_checkpoint="some/path/to/my_checkpoint.ckpt") +# ``` +# +# Training will resume at the depth/level of the provided checkpoint according the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. +# +# By default (``FinetuningScheduler.restore_best`` is ``True``), ``FinetuningScheduler`` will attempt to restore the best available checkpoint before finetuning depth transitions. +# +# ```python +# trainer = Trainer( +# callbacks=[FinetuningScheduler(new_incarnation_mode=True)], +# resume_from_checkpoint="some/path/to/my_kth_best_checkpoint.ckpt", +# ) +# ``` +# +# To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting ``FinetuningScheduler.new_incarnation_mode`` to +# ``True`` as above will re-intialize the checkpoint state with a new best checkpoint at the resumption depth. + +# %% [markdown] +#
+# +# **Note:** Currently, _FinetuningScheduler_ only supports the following _TrainingTypePlugins_: +# +# - ``DDPPlugin`` +# - ``DDPShardedPlugin`` +# - ``DDPSpawnPlugin`` +# - ``DDPSpawnShardedPlugin`` +# - ``DataParallelPlugin`` +# - ``SingleDevicePlugin`` +# +#
+ +# %% [markdown] +#
+# +# # Scheduled Finetuning For SuperGLUE +# +# The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. +# +# ``FinetuningScheduler`` can be used to achieve non-trivial model performance improvements in both implicit and explicit scheduling contexts at an also non-trivial computational cost. + # %% +import os +import warnings from datetime import datetime -from typing import Optional +from typing import Any, Dict, List, Optional, Tuple, Union +from importlib import import_module +import logging -import datasets import torch -from pytorch_lightning import LightningDataModule, LightningModule, Trainer, seed_everything from torch.utils.data import DataLoader -from transformers import ( - AdamW, - AutoConfig, - AutoModelForSequenceClassification, - AutoTokenizer, - get_linear_schedule_with_warmup, -) -AVAIL_GPUS = min(1, torch.cuda.device_count()) +import pytorch_lightning as pl +from pytorch_lightning.utilities import rank_zero_warn +from pytorch_lightning.utilities.cli import CALLBACK_REGISTRY, _Registry +from pytorch_lightning.utilities.exceptions import MisconfigurationException +from pytorch_lightning.loggers.tensorboard import TensorBoardLogger -# %% [markdown] -# ## Training BERT with Lightning +import datasets +from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer -# %% [markdown] -# ### Lightning DataModule for GLUE + +# %% +# a couple helper functions to prepare code to work with the forthcoming hub and user module registry +MOCK_HUB_REGISTRY = _Registry() + + +def module_hub_mock(key: str, require_fqn: bool = False) -> List: + if key.lower() == "finetuningscheduler": + mod = import_module("pytorch_lightning.callbacks.finetuning_scheduler") + MOCK_HUB_REGISTRY.register_classes(mod, pl.callbacks.Callback) + else: + raise MisconfigurationException(f"user module key '{key}' not found") + registered_list = [] + # make registered class available by unqualified class name by default + if not require_fqn: + for n, c in MOCK_HUB_REGISTRY.items(): + globals()[f"{n}"] = c + registered_list = ", ".join([n for n in MOCK_HUB_REGISTRY.names]) + else: + registered_list = ", ".join( + [c.__module__ + "." + c.__name__ for c in MOCK_HUB_REGISTRY.classes] + ) + print(f"Imported and registered the following callbacks: {registered_list}") + + +def instantiate_registered_class( + init: Dict[str, Any], args: Optional[Union[Any, Tuple[Any, ...]]] = None +) -> Any: + """Instantiates a class with the given args and init. Accepts class definitions in the form + of a "class_path" or "callback_key" associated with a _Registry + + Args: + init: Dict of the form {"class_path":... or "callback_key":..., "init_args":...}. + args: Positional arguments required for instantiation. + + Returns: + The instantiated class object. + """ + kwargs = init.get("init_args", {}) + if args and not isinstance(args, tuple): + args = (args,) + shortcircuit_local = False if "." in init["class_path"] else True + class_module, class_name, args_class = None, None, None + if init.get("class_path", None): + if not shortcircuit_local: + class_module, class_name = init["class_path"].rsplit(".", 1) + else: # class is expected to be locally defined + args_class = globals()[init["class_path"]] + elif init.get("callback_key", None): + callback_path = CALLBACK_REGISTRY.get( + init["callback_key"], None + ) or MOCK_HUB_REGISTRY.get(init["callback_key"], None) + assert callback_path, MisconfigurationException( + f'specified callback_key {init["callback_key"]} has not been registered' + ) + class_module, class_name = callback_path.__module__, callback_path.__name__ + else: + raise MisconfigurationException( + "Neither a class_path nor callback_key were included in a configuration that" + "requires one" + ) + if not shortcircuit_local: + module = __import__(class_module, fromlist=[class_name]) + args_class = getattr(module, class_name) + return args_class(**kwargs) if not args else args_class(*args, **kwargs) + + +# %% +# load the pl extension module we want to use. This will import all necessary callbacks. +module_hub_mock("finetuningscheduler") +# set notebook-level variables +AVAIL_GPUS = min(1, torch.cuda.device_count()) +TASK_NUM_LABELS = {"boolq": 2, "rte": 2} +DEFAULT_TASK = "rte" + +# narrow our logging to adapt it for a notebook environment +for l_key in logging.Logger.manager.loggerDict.keys(): + if "pytorch_lightning" in l_key: + logging.getLogger(l_key).setLevel("INFO") + else: + logging.getLogger(l_key).setLevel("CRITICAL") +pl_logger = logging.getLogger("pytorch_lightning") +pl_logger.removeHandler(pl_logger.handlers[0]) +rz_logger = logging.getLogger("pytorch_lightning.utilities.distributed") +rz_logger.addHandler(logging.StreamHandler()) +rz_logger.handlers[0].setLevel("INFO") # %% -class GLUEDataModule(LightningDataModule): - - task_text_field_map = { - "cola": ["sentence"], - "sst2": ["sentence"], - "mrpc": ["sentence1", "sentence2"], - "qqp": ["question1", "question2"], - "stsb": ["sentence1", "sentence2"], - "mnli": ["premise", "hypothesis"], - "qnli": ["question", "sentence"], - "rte": ["sentence1", "sentence2"], - "wnli": ["sentence1", "sentence2"], - "ax": ["premise", "hypothesis"], - } - - glue_task_num_labels = { - "cola": 2, - "sst2": 2, - "mrpc": 2, - "qqp": 2, - "stsb": 1, - "mnli": 3, - "qnli": 2, - "rte": 2, - "wnli": 2, - "ax": 3, - } +class RteBoolqDataModule(pl.LightningDataModule): + """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets""" + task_text_field_map = {"rte": ["premise", "hypothesis"], "boolq": ["question", "passage"]} loader_columns = [ "datasets_idx", "input_ids", @@ -61,117 +278,167 @@ class GLUEDataModule(LightningDataModule): "end_positions", "labels", ] + # ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and + # expected logging behavior + for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: + warnings.filterwarnings("ignore", warnf) def __init__( self, model_name_or_path: str, - task_name: str = "mrpc", + task_name: str = DEFAULT_TASK, + prep_on_init: bool = False, max_seq_length: int = 128, train_batch_size: int = 32, eval_batch_size: int = 32, - **kwargs, + pin_memory: bool = False, + tokenizers_parallelism: bool = True, + num_workers: int = 0, ): super().__init__() self.model_name_or_path = model_name_or_path - self.task_name = task_name + self.task_name = task_name if task_name in TASK_NUM_LABELS.keys() else DEFAULT_TASK self.max_seq_length = max_seq_length self.train_batch_size = train_batch_size self.eval_batch_size = eval_batch_size - - self.text_fields = self.task_text_field_map[task_name] - self.num_labels = self.glue_task_num_labels[task_name] - self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True) - - def setup(self, stage: str): - self.dataset = datasets.load_dataset("glue", self.task_name) - + self.tokenizers_parallelism = tokenizers_parallelism + self.dataloader_kwargs = {"num_workers": num_workers, "pin_memory": pin_memory} + self.text_fields = self.task_text_field_map[self.task_name] + self.num_labels = TASK_NUM_LABELS[self.task_name] + os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.tokenizers_parallelism else "false" + self.tokenizer = AutoTokenizer.from_pretrained( + self.model_name_or_path, use_fast=True, local_files_only=False + ) + if ( + prep_on_init + ): # useful if one wants to load datasets as soon as the ``LightningDataModule`` is + # instantiated + self.prepare_data() + self.setup("fit") + + def setup(self, stage): + self.dataset = datasets.load_dataset("super_glue", self.task_name) for split in self.dataset.keys(): self.dataset[split] = self.dataset[split].map( - self.convert_to_features, - batched=True, - remove_columns=["label"], + self.convert_to_features, batched=True, remove_columns=["label"] ) - self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns] + self.columns = [ + c for c in self.dataset[split].column_names if c in self.loader_columns + ] self.dataset[split].set_format(type="torch", columns=self.columns) self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] def prepare_data(self): - datasets.load_dataset("glue", self.task_name) - AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True) + # N.B. PL calls prepare_data from a single process (rank 0) so do not use it to assign + # state (e.g. self.x=y) + datasets.load_dataset("super_glue", self.task_name) def train_dataloader(self): - return DataLoader(self.dataset["train"], batch_size=self.train_batch_size) + return DataLoader( + self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs + ) def val_dataloader(self): if len(self.eval_splits) == 1: - return DataLoader(self.dataset["validation"], batch_size=self.eval_batch_size) + return DataLoader( + self.dataset["validation"], + batch_size=self.eval_batch_size, + **self.dataloader_kwargs, + ) elif len(self.eval_splits) > 1: - return [DataLoader(self.dataset[x], batch_size=self.eval_batch_size) for x in self.eval_splits] + return [ + DataLoader( + self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs + ) + for x in self.eval_splits + ] def test_dataloader(self): if len(self.eval_splits) == 1: - return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size) + return DataLoader( + self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs + ) elif len(self.eval_splits) > 1: - return [DataLoader(self.dataset[x], batch_size=self.eval_batch_size) for x in self.eval_splits] - - def convert_to_features(self, example_batch, indices=None): - - # Either encode single sentence or sentence pairs - if len(self.text_fields) > 1: - texts_or_text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) - else: - texts_or_text_pairs = example_batch[self.text_fields[0]] - + return [ + DataLoader( + self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs + ) + for x in self.eval_splits + ] + + def convert_to_features(self, example_batch): + text_pairs = list( + zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]]) + ) # Tokenize the text/text pairs features = self.tokenizer.batch_encode_plus( - texts_or_text_pairs, max_length=self.max_seq_length, pad_to_max_length=True, truncation=True + text_pairs, max_length=self.max_seq_length, padding="longest", truncation=True ) - # Rename label to labels to make it easier to pass to model forward features["labels"] = example_batch["label"] - return features -# %% [markdown] -# **You could use this datamodule with standalone PyTorch if you wanted...** - # %% -dm = GLUEDataModule("distilbert-base-uncased") -dm.prepare_data() -dm.setup("fit") -next(iter(dm.train_dataloader())) - -# %% [markdown] -# ### Transformer LightningModule - +class RteBoolqModule(pl.LightningModule): + """A ``LightningModule`` that can be used to finetune a foundational + model on either the RTE or BoolQ SuperGLUE tasks using Hugging Face + implementations of a given model and the `SuperGLUE Hugging Face dataset. + """ -# %% -class GLUETransformer(LightningModule): def __init__( self, model_name_or_path: str, - num_labels: int, - task_name: str, - learning_rate: float = 2e-5, - adam_epsilon: float = 1e-8, - warmup_steps: int = 0, - weight_decay: float = 0.0, - train_batch_size: int = 32, - eval_batch_size: int = 32, - eval_splits: Optional[list] = None, - **kwargs, + optimizer_init: Dict[str, Any], + lr_scheduler_init: Dict[str, Any], + pl_lrs_cfg: Optional[Dict[str, Any]] = None, + model_cfg: Optional[Dict[str, Any]] = None, + task_name: str = DEFAULT_TASK, + experiment_tag: str = "default", + plot_liveloss: bool = False, ): + """ + Args: + model_name_or_path (str): Path to pretrained model or identifier from https://huggingface.co/models + optimizer_init (Dict[str, Any]): The desired optimizer configuration. + lr_scheduler_init (Dict[str, Any]): The desired learning rate scheduler config + pl_lrs_cfg (Optional[Dict[str, Any]]): Defines custom overrides of pytorch lightning lr_scheduler defaults + defined in ``_get_default_scheduler_config`` + model_cfg (Optional[Dict[str, Any]], optional): Defines overrides of the default model config. Defaults to + ``None``. + task_name (str, optional): The SuperGLUE task to execute, one of ``'rte'``, ``'boolq'``. Defaults to "rte". + experiment_tag (str, optional): The tag to use for the experiment and tensorboard logs. Defaults to + "default". + """ super().__init__() - + self.optimizer_init = optimizer_init + self.lr_scheduler_init = lr_scheduler_init + self.plot_liveloss = plot_liveloss + self.pl_lrs_cfg = pl_lrs_cfg or {} + if task_name in TASK_NUM_LABELS.keys(): + self.task_name = task_name + else: + self.task_name = DEFAULT_TASK + rank_zero_warn( + f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'" + ) + self.num_labels = TASK_NUM_LABELS[self.task_name] self.save_hyperparameters() - - self.config = AutoConfig.from_pretrained(model_name_or_path, num_labels=num_labels) - self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=self.config) + self.experiment_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}" + self.model_cfg = model_cfg or {} + conf = AutoConfig.from_pretrained( + model_name_or_path, num_labels=self.num_labels, local_files_only=False + ) + self.model = AutoModelForSequenceClassification.from_pretrained( + model_name_or_path, config=conf + ) + self.model.config.update(self.model_cfg) # apply model config overrides self.metric = datasets.load_metric( - "glue", self.hparams.task_name, experiment_id=datetime.now().strftime("%d-%m-%Y_%H-%M-%S") + "super_glue", self.task_name, experiment_id=self.experiment_id ) + self.no_decay = ["bias", "LayerNorm.weight"] + self.finetuningscheduler_callback = None def forward(self, **inputs): return self.model(**inputs) @@ -181,146 +448,171 @@ def training_step(self, batch, batch_idx): loss = outputs[0] return loss + def training_epoch_end(self, outputs: List[Any]) -> None: + loss = torch.stack([x["loss"] for x in outputs]).mean() + self.log("train_loss", loss, prog_bar=True, sync_dist=True) + if self.finetuningscheduler_callback: + self.log("finetuning_schedule_depth", self.finetuningscheduler_callback.curr_depth) + def validation_step(self, batch, batch_idx, dataloader_idx=0): outputs = self(**batch) val_loss, logits = outputs[:2] - if self.hparams.num_labels >= 1: + if self.num_labels >= 1: preds = torch.argmax(logits, axis=1) - elif self.hparams.num_labels == 1: + elif self.num_labels == 1: preds = logits.squeeze() labels = batch["labels"] - return {"loss": val_loss, "preds": preds, "labels": labels} def validation_epoch_end(self, outputs): - if self.hparams.task_name == "mnli": - for i, output in enumerate(outputs): - # matched or mismatched - split = self.hparams.eval_splits[i].split("_")[-1] - preds = torch.cat([x["preds"] for x in output]).detach().cpu().numpy() - labels = torch.cat([x["labels"] for x in output]).detach().cpu().numpy() - loss = torch.stack([x["loss"] for x in output]).mean() - self.log(f"val_loss_{split}", loss, prog_bar=True) - split_metrics = { - f"{k}_{split}": v for k, v in self.metric.compute(predictions=preds, references=labels).items() - } - self.log_dict(split_metrics, prog_bar=True) - return loss - preds = torch.cat([x["preds"] for x in outputs]).detach().cpu().numpy() labels = torch.cat([x["labels"] for x in outputs]).detach().cpu().numpy() loss = torch.stack([x["loss"] for x in outputs]).mean() - self.log("val_loss", loss, prog_bar=True) - self.log_dict(self.metric.compute(predictions=preds, references=labels), prog_bar=True) + self.log("val_loss", loss, prog_bar=True, sync_dist=True) + metric_dict = self.metric.compute(predictions=preds, references=labels) + self.log_dict(metric_dict, prog_bar=True, sync_dist=True) return loss - def setup(self, stage=None) -> None: - if stage != "fit": - return - # Get dataloader by calling it - train_dataloader() is called after setup() by default - # train_loader = self.train_dataloader() - train_loader = self.trainer.datamodule.train_dataloader() - # Calculate total steps - tb_size = self.hparams.train_batch_size * max(1, self.trainer.gpus) - ab_size = self.trainer.accumulate_grad_batches * float(self.trainer.max_epochs) - self.total_steps = (len(train_loader.dataset) // tb_size) // ab_size + def init_pgs(self) -> List[Dict]: + """Initialize the parameter groups. Used to ensure weight_decay is not applied + to our specified bias parameters when we initialize the optimizer. - def configure_optimizers(self): - """Prepare optimizer and schedule (linear warmup and decay)""" - model = self.model - no_decay = ["bias", "LayerNorm.weight"] - optimizer_grouped_parameters = [ + Returns: + List[Dict]: A list of parameter group dictionaries. + """ + pgs = [ { - "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], - "weight_decay": self.hparams.weight_decay, + "params": [ + p + for n, p in self.model.named_parameters() + if not any(nd in n for nd in self.no_decay) and p.requires_grad + ], + "weight_decay": self.optimizer_init["init_args"]["weight_decay"], }, { - "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], + "params": [ + p + for n, p in self.model.named_parameters() + if any(nd in n for nd in self.no_decay) and p.requires_grad + ], "weight_decay": 0.0, }, ] - optimizer = AdamW(optimizer_grouped_parameters, lr=self.hparams.learning_rate, eps=self.hparams.adam_epsilon) + return pgs - scheduler = get_linear_schedule_with_warmup( - optimizer, - num_warmup_steps=self.hparams.warmup_steps, - num_training_steps=self.total_steps, - ) - scheduler = {"scheduler": scheduler, "interval": "step", "frequency": 1} + def configure_optimizers(self): + # the phase 0 parameters will have been set to require gradients during setup + # you can initialize the optimizer with a simple requires.grad filter as is often done, + # but in this case we pass a list of parameter groups to ensure weight_decay is + # not applied to the bias parameter (for completeness, in this case it won't make much + # performance difference) + optimizer = instantiate_registered_class(args=self.init_pgs(), init=self.optimizer_init) + scheduler = { + "scheduler": instantiate_registered_class( + args=optimizer, init=self.lr_scheduler_init + ), + **self.pl_lrs_cfg, + } return [optimizer], [scheduler] + def configure_callbacks(self): + found_fts = [c for c in self.trainer.callbacks if isinstance(c, FinetuningScheduler)] # type: ignore # noqa + if found_fts: + self.finetuningscheduler_callback = found_fts[0] + return super().configure_callbacks() -# %% [markdown] -# ## Training - -# %% [markdown] -# ### CoLA -# -# See an interactive view of the -# CoLA dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=cola) # %% -seed_everything(42) +# let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it +# Please see the documentation for a full description of the schedule format +ft_schedule_yaml = """ +0: + params: # the parameters for each phase definition can be fully specified + - model.classifier.bias + - model.classifier.weight +1: + params: # or specified via a regex + - model.albert.pooler.* +2: + params: + - model.albert.encoder.*.ffn_output.* +""" +ft_schedule_name = "RteBoolqModule_ft_schedule_albert_base.yaml" +with open(ft_schedule_name, "w") as f: + f.write(ft_schedule_yaml) -dm = GLUEDataModule(model_name_or_path="albert-base-v2", task_name="cola") +# %% +datasets.set_progress_bar_enabled(False) +pl.seed_everything(42) +dm = RteBoolqDataModule(model_name_or_path="albert-base-v2", tokenizers_parallelism=False) dm.setup("fit") -model = GLUETransformer( +optimizer_init = { + "class_path": "torch.optim.AdamW", + "init_args": {"weight_decay": 1e-05, "eps": 1e-07, "lr": 1e-05}, +} +lr_scheduler_init = { + "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", + "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, +} +pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} + +model = RteBoolqModule( model_name_or_path="albert-base-v2", - num_labels=dm.num_labels, - eval_splits=dm.eval_splits, - task_name=dm.task_name, + optimizer_init=optimizer_init, + lr_scheduler_init=lr_scheduler_init, + pl_lrs_cfg=pl_lrs_cfg, + experiment_tag="fts_explicit", ) - -trainer = Trainer(max_epochs=1, gpus=AVAIL_GPUS) -trainer.fit(model, dm) - -# %% [markdown] -# ### MRPC -# -# See an interactive view of the -# MRPC dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=mrpc) +callbacks = [ + FinetuningScheduler(ft_schedule=ft_schedule_name, max_depth=2), # type: ignore # noqa + FTSEarlyStopping(monitor="val_loss", min_delta=0.001, patience=2), # type: ignore # noqa + FTSCheckpoint(monitor="val_loss", save_top_k=5), # type: ignore # noqa +] +example_logdir = "lightning_logs" +logger = TensorBoardLogger(example_logdir, name="fts_explicit") # %% -seed_everything(42) +# optionally start tensorboard and monitor progress graphically while viewing multi-phase finetuning specific training +# logs in the cell output below by uncommenting the next 3 lines +# # !mkdir -p $example_logdir +# # %load_ext tensorboard +# # %tensorboard --logdir example_logdir +# disable progress bar by default to focus on multi-phase training logs. Set to True to re-enable if desired +show_progress = False -dm = GLUEDataModule( - model_name_or_path="distilbert-base-cased", - task_name="mrpc", -) -dm.setup("fit") -model = GLUETransformer( - model_name_or_path="distilbert-base-cased", - num_labels=dm.num_labels, - eval_splits=dm.eval_splits, - task_name=dm.task_name, +# %% +trainer = pl.Trainer( + enable_progress_bar=show_progress, + precision=16, + gpus=AVAIL_GPUS, + callbacks=callbacks, + logger=logger, ) - -trainer = Trainer(max_epochs=3, gpus=AVAIL_GPUS) -trainer.fit(model, dm) +trainer.fit(model, datamodule=dm) # %% [markdown] -# ### MNLI +# ## Footnotes # -# - The MNLI dataset is huge, so we aren't going to bother trying to train on it here. -# - We will skip over training and go straight to validation. +#
    +#
  1. # -# See an interactive view of the -# MRPC dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=mnli) - -# %% -dm = GLUEDataModule( - model_name_or_path="distilbert-base-cased", - task_name="mnli", -) -dm.setup("fit") -model = GLUETransformer( - model_name_or_path="distilbert-base-cased", - num_labels=dm.num_labels, - eval_splits=dm.eval_splits, - task_name=dm.task_name, -) - -trainer = Trainer(gpus=AVAIL_GPUS, progress_bar_refresh_rate=20) -trainer.validate(model, dm.val_dataloader()) +# [Howard, J., & Ruder, S. (2018)](https://arxiv.org/pdf/1801.06146.pdf). Fine-tuned Language +# Models for Text Classification. ArXiv, abs/1801.06146. [↩](#a1) +# +#
  2. +#
  3. +# +# [Chronopoulou, A., Baziotis, C., & Potamianos, A. (2019)](https://arxiv.org/pdf/1902.10547.pdf). +# An embarrassingly simple approach for transfer learning from pretrained language models. arXiv +# preprint arXiv:1902.10547. [↩](#a1) +# +#
  4. +#
  5. +# +# [Peters, M. E., Ruder, S., & Smith, N. A. (2019)](https://arxiv.org/pdf/1903.05987.pdf). To tune or not to +# tune? adapting pretrained representations to diverse tasks. arXiv preprint arXiv:1903.05987. [↩](#a1) +# +#
  6. +# diff --git a/lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif b/lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7b7f8db3448e4ec73a18524be7b713c25d6acdc GIT binary patch literal 302052 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%0AWa3=4MR-MPU$zq;I(l!jKXzf*=fO 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 + + + + + + + image/svg+xml + + + + + + + + + From 2dfc99f5d4bad54205e545688a4eb74ccb8293d3 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Mon, 29 Nov 2021 19:48:08 -0800 Subject: [PATCH 03/44] tweak md format to H2 and update meta info --- lightning_examples/finetuning-scheduler/.meta.yml | 6 +++--- .../finetuning-scheduler/finetuning-scheduler.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 33296fba5..d1cfeb47d 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -1,7 +1,7 @@ title: Finetuning Scheduler author: Dan Dale -created: 2021-11-26 -updated: 2021-11-26 +created: 2021-11-29 +updated: 2021-11-29 license: CC BY-SA build: 1 tags: @@ -10,7 +10,7 @@ description: | This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/) with iterative earlystopping defined according to a user-specified - schedule. It uses HuggingFace's `datasets` and `transformers`` libraries to retrieve the relevant benchmark data and + schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and foundational model weights. requirements: - transformers diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 9669cb632..4a38f96c4 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -15,7 +15,7 @@ # --- # %% [markdown] -# # Scheduled Finetuning +# ## Scheduled Finetuning # #
    # @@ -150,7 +150,7 @@ # %% [markdown] #
    # -# # Scheduled Finetuning For SuperGLUE +# ## Scheduled Finetuning For SuperGLUE # # The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # From b6922503c2c0e70ab3c93c3834b48db4aca4c311 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Tue, 30 Nov 2021 10:57:11 -0800 Subject: [PATCH 04/44] update tutorial reqs --- docs/requirements.txt | 3 + .../finetuning-scheduler/.meta.yml | 11 +- .../finetuning-scheduler.py | 108 ++++++------------ .../fts_explicit_loss_anim.gif | Bin 302052 -> 172945 bytes 4 files changed, 44 insertions(+), 78 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index f721f461a..cd93ce2ee 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,6 +6,9 @@ docutils>=0.16 sphinx-paramlinks>=0.4.0 ipython[notebook] +# temporarily included until hub available to evaluate finetuning_scheduler +git+git://github.com/speediedan/pytorch-lightning.git@24d3e43568814ec381ac5be91627629808d62081#egg=pytorch-lightning + https://github.com/PyTorchLightning/lightning_sphinx_theme/archive/master.zip#egg=pt-lightning-sphinx-theme -r ../.actions/requirements.txt diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index d1cfeb47d..3b63b73e5 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -7,13 +7,14 @@ build: 1 tags: - finetuning description: | - This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune - a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task - of [SuperGLUE](https://super.gluebenchmark.com/) with iterative earlystopping defined according to a user-specified - schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and - foundational model weights. + This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune + a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task + of [SuperGLUE](https://super.gluebenchmark.com/) with iterative early-stopping defined according to a user-specified + schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data + and foundational model weights. requirements: - transformers - datasets + - scikit-learn accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 4a38f96c4..5aab8f6df 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # --- # jupyter: # jupytext: @@ -7,7 +6,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.13.1 +# jupytext_version: 1.13.2 # kernelspec: # display_name: 'Python 3.7.11 64-bit (''pldev_tutorials'': conda)' # language: python @@ -84,7 +83,7 @@ # ``` # %% [markdown] -# ## EarlyStopping and Epoch-Driven Phase Transition Criteria +# ## Early-Stopping and Epoch-Driven Phase Transition Criteria # # # By default, ``FTSEarlyStopping`` and epoch-driven @@ -155,28 +154,26 @@ # The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # # ``FinetuningScheduler`` can be used to achieve non-trivial model performance improvements in both implicit and explicit scheduling contexts at an also non-trivial computational cost. +# # %% +import logging import os import warnings from datetime import datetime -from typing import Any, Dict, List, Optional, Tuple, Union from importlib import import_module -import logging - -import torch -from torch.utils.data import DataLoader +from typing import Any, Dict, List, Optional, Tuple, Union +import datasets import pytorch_lightning as pl +import torch +from pytorch_lightning.loggers.tensorboard import TensorBoardLogger from pytorch_lightning.utilities import rank_zero_warn from pytorch_lightning.utilities.cli import CALLBACK_REGISTRY, _Registry from pytorch_lightning.utilities.exceptions import MisconfigurationException -from pytorch_lightning.loggers.tensorboard import TensorBoardLogger - -import datasets +from torch.utils.data import DataLoader from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer - # %% # a couple helper functions to prepare code to work with the forthcoming hub and user module registry MOCK_HUB_REGISTRY = _Registry() @@ -195,17 +192,13 @@ def module_hub_mock(key: str, require_fqn: bool = False) -> List: globals()[f"{n}"] = c registered_list = ", ".join([n for n in MOCK_HUB_REGISTRY.names]) else: - registered_list = ", ".join( - [c.__module__ + "." + c.__name__ for c in MOCK_HUB_REGISTRY.classes] - ) + registered_list = ", ".join([c.__module__ + "." + c.__name__ for c in MOCK_HUB_REGISTRY.classes]) print(f"Imported and registered the following callbacks: {registered_list}") -def instantiate_registered_class( - init: Dict[str, Any], args: Optional[Union[Any, Tuple[Any, ...]]] = None -) -> Any: - """Instantiates a class with the given args and init. Accepts class definitions in the form - of a "class_path" or "callback_key" associated with a _Registry +def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, Tuple[Any, ...]]] = None) -> Any: + """Instantiates a class with the given args and init. Accepts class definitions in the form of a "class_path" + or "callback_key" associated with a _Registry. Args: init: Dict of the form {"class_path":... or "callback_key":..., "init_args":...}. @@ -225,17 +218,16 @@ def instantiate_registered_class( else: # class is expected to be locally defined args_class = globals()[init["class_path"]] elif init.get("callback_key", None): - callback_path = CALLBACK_REGISTRY.get( + callback_path = CALLBACK_REGISTRY.get(init["callback_key"], None) or MOCK_HUB_REGISTRY.get( init["callback_key"], None - ) or MOCK_HUB_REGISTRY.get(init["callback_key"], None) + ) assert callback_path, MisconfigurationException( f'specified callback_key {init["callback_key"]} has not been registered' ) class_module, class_name = callback_path.__module__, callback_path.__name__ else: raise MisconfigurationException( - "Neither a class_path nor callback_key were included in a configuration that" - "requires one" + "Neither a class_path nor callback_key were included in a configuration that" "requires one" ) if not shortcircuit_local: module = __import__(class_module, fromlist=[class_name]) @@ -266,7 +258,7 @@ def instantiate_registered_class( # %% class RteBoolqDataModule(pl.LightningDataModule): - """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets""" + """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets.""" task_text_field_map = {"rte": ["premise", "hypothesis"], "boolq": ["question", "passage"]} loader_columns = [ @@ -306,12 +298,8 @@ def __init__( self.text_fields = self.task_text_field_map[self.task_name] self.num_labels = TASK_NUM_LABELS[self.task_name] os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.tokenizers_parallelism else "false" - self.tokenizer = AutoTokenizer.from_pretrained( - self.model_name_or_path, use_fast=True, local_files_only=False - ) - if ( - prep_on_init - ): # useful if one wants to load datasets as soon as the ``LightningDataModule`` is + self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True, local_files_only=False) + if prep_on_init: # useful if one wants to load datasets as soon as the ``LightningDataModule`` is # instantiated self.prepare_data() self.setup("fit") @@ -322,9 +310,7 @@ def setup(self, stage): self.dataset[split] = self.dataset[split].map( self.convert_to_features, batched=True, remove_columns=["label"] ) - self.columns = [ - c for c in self.dataset[split].column_names if c in self.loader_columns - ] + self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns] self.dataset[split].set_format(type="torch", columns=self.columns) self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] @@ -335,9 +321,7 @@ def prepare_data(self): datasets.load_dataset("super_glue", self.task_name) def train_dataloader(self): - return DataLoader( - self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs - ) + return DataLoader(self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs) def val_dataloader(self): if len(self.eval_splits) == 1: @@ -348,29 +332,21 @@ def val_dataloader(self): ) elif len(self.eval_splits) > 1: return [ - DataLoader( - self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs - ) + DataLoader(self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs) for x in self.eval_splits ] def test_dataloader(self): if len(self.eval_splits) == 1: - return DataLoader( - self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs - ) + return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs) elif len(self.eval_splits) > 1: return [ - DataLoader( - self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs - ) + DataLoader(self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs) for x in self.eval_splits ] def convert_to_features(self, example_batch): - text_pairs = list( - zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]]) - ) + text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) # Tokenize the text/text pairs features = self.tokenizer.batch_encode_plus( text_pairs, max_length=self.max_seq_length, padding="longest", truncation=True @@ -382,10 +358,8 @@ def convert_to_features(self, example_batch): # %% class RteBoolqModule(pl.LightningModule): - """A ``LightningModule`` that can be used to finetune a foundational - model on either the RTE or BoolQ SuperGLUE tasks using Hugging Face - implementations of a given model and the `SuperGLUE Hugging Face dataset. - """ + """A ``LightningModule`` that can be used to finetune a foundational model on either the RTE or BoolQ SuperGLUE + tasks using Hugging Face implementations of a given model and the `SuperGLUE Hugging Face dataset.""" def __init__( self, @@ -396,7 +370,6 @@ def __init__( model_cfg: Optional[Dict[str, Any]] = None, task_name: str = DEFAULT_TASK, experiment_tag: str = "default", - plot_liveloss: bool = False, ): """ Args: @@ -414,29 +387,20 @@ def __init__( super().__init__() self.optimizer_init = optimizer_init self.lr_scheduler_init = lr_scheduler_init - self.plot_liveloss = plot_liveloss self.pl_lrs_cfg = pl_lrs_cfg or {} if task_name in TASK_NUM_LABELS.keys(): self.task_name = task_name else: self.task_name = DEFAULT_TASK - rank_zero_warn( - f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'" - ) + rank_zero_warn(f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'") self.num_labels = TASK_NUM_LABELS[self.task_name] self.save_hyperparameters() self.experiment_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}" self.model_cfg = model_cfg or {} - conf = AutoConfig.from_pretrained( - model_name_or_path, num_labels=self.num_labels, local_files_only=False - ) - self.model = AutoModelForSequenceClassification.from_pretrained( - model_name_or_path, config=conf - ) + conf = AutoConfig.from_pretrained(model_name_or_path, num_labels=self.num_labels, local_files_only=False) + self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=conf) self.model.config.update(self.model_cfg) # apply model config overrides - self.metric = datasets.load_metric( - "super_glue", self.task_name, experiment_id=self.experiment_id - ) + self.metric = datasets.load_metric("super_glue", self.task_name, experiment_id=self.experiment_id) self.no_decay = ["bias", "LayerNorm.weight"] self.finetuningscheduler_callback = None @@ -476,8 +440,8 @@ def validation_epoch_end(self, outputs): return loss def init_pgs(self) -> List[Dict]: - """Initialize the parameter groups. Used to ensure weight_decay is not applied - to our specified bias parameters when we initialize the optimizer. + """Initialize the parameter groups. Used to ensure weight_decay is not applied to our specified bias + parameters when we initialize the optimizer. Returns: List[Dict]: A list of parameter group dictionaries. @@ -510,9 +474,7 @@ def configure_optimizers(self): # performance difference) optimizer = instantiate_registered_class(args=self.init_pgs(), init=self.optimizer_init) scheduler = { - "scheduler": instantiate_registered_class( - args=optimizer, init=self.lr_scheduler_init - ), + "scheduler": instantiate_registered_class(args=optimizer, init=self.lr_scheduler_init), **self.pl_lrs_cfg, } return [optimizer], [scheduler] @@ -568,7 +530,7 @@ def configure_callbacks(self): callbacks = [ FinetuningScheduler(ft_schedule=ft_schedule_name, max_depth=2), # type: ignore # noqa FTSEarlyStopping(monitor="val_loss", min_delta=0.001, patience=2), # type: ignore # noqa - FTSCheckpoint(monitor="val_loss", save_top_k=5), # type: ignore # noqa + FTSCheckpoint(monitor="val_loss", save_top_k=5), # type: ignore # noqa ] example_logdir = "lightning_logs" logger = TensorBoardLogger(example_logdir, name="fts_explicit") diff --git a/lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif b/lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif index b7b7f8db3448e4ec73a18524be7b713c25d6acdc..7451f65c0974bdab9c70da5f2c9099ad5eab1083 100644 GIT binary patch delta 142 zcmV;90CE51w-S-Z3b0p%m!Qr8_m?kI0YI~St}RoS!1)2zmoI(++_!;M0XQeOAo&4@ z1Gl)T0pTgPfcXO{0k=#30TwEkpdfNr{Q^5Hm(SA! wOt)!M1Nj)(+S6Vh%xOaK4? delta 82050 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

    p!9fWX!9>Ux18xRP$9&s>2gQ z8t-RJ4Z=`U?DG(DilO>1wWOqD1f3Ufm)3iMC1GEdNF;MM7``g{L9jQ2ltA4$4d9bB z@C}C?rd_41J@2QxDm+RWo~%c{orDHVdnB=24BO-Arc)FLbKwvJ{aoFdLgUZ&`lU_2 zrEZtO#7^C^9JAAVaNy3UOZuFkW0ULGf{X5I@@l`!xNzxPqwxHV(l z!j6wfcJ}d}-Ls^b*|ZNHk{`iQbh2OYm_IyK{pu1cdT;Yrn#WV_k5QqFR!yKn=W$^c zg0i7b^0*4Q`K~gn%J`Kd8!8EAD?hioWMhg*Td(D=2$*U=MCxm(X3)w4F@fw}>TwEM z^V-;5JS`CNC{UnfL5T#`9q&V$X4^7PfF9bv^z@K8QGO@ioIuxB`rG`4_nsWTr-~%f z@*@9^kAS3~=d4W|MU}18;X}c&`E(N+qOzMkr%L#8q%?W!Uh5tQ$?x$Wo#fp=TDYD4 zyhkjb(hR5fLbkme^oZl;0z!2yvJChDD(eyb~JTRf@k9|4Bu>Kb-{P#n=^J?yI z$)XoLk1i!Z-&tjTJOf?Di2wY>c^$*|>n$S87Xgiy8HZ#cqN`jSKFlHz^o~5zCkHG~T8fadD&}bc zK*$X0M1{=#DKN2)8!{+zs*@56K}8RxuAwHD1l^HEa0ZrgbvJR#78?~N1psur*U1Wz zX%tj_;%xXN=UG<(2ti0ML-X!gfbTQ9*k}7$T><^#HCeQN)Kmcifg%OL_b<>MMfp)H zV!PAuzhV`(ArP^p6S3nFvH#V0G9?~J0}9$`r?L%EBL`vnQUinHDuPhg(;n2E_?4Wg zW4O6cucc(K$J1VGp0>!D!im8a~DdkwhlIKQEHhzj7g$h{gr0B)HS|AN~?b+d^{`Ljboe=nqrv2i!J%SP^jB$Q(t$ZKHD_iU8ck1S$e>``KGj%0(#zfLrK5 zFaWm&NXap%fdXW4B$Rc*YTZG4k$_cz=4&!x#fwO!h!|G?w-TUP+)#38_*c%I|n z+Ji!wu=*z#?N5cE&jLGS9lJQ_87(nctazRzNvPB*tJE8)G}x;&da5+RRk+~85yg!M z&5egcjYmt3$A^u`uMTpJzf}k5<&t^iQY7S3RpinP<Lk_b zRn;1d)W(+8R#S%aONI+tfb-eI!$r%(#Ye+}%Ie$RY7=2xe7}-i-tLiv8YQ3pOo^Bg)k-SoaSoa2U^(Yb=l>WJFx3EB>$KDd7t)(;xw^^$$>)y<)0LZ<9vgvE}+dvpaV0!BQuyr#WOA^ z5VtjqhYybrVhy{`2jl0%6SRgs;DbH1#uMHKiSXfx^5Fqf-q{&bpDJENB3|65NR`5# zGNgMEiKZP1p8mu%9WJ09DWe^!IW5Nqm%oH6977c^K~k3>=}XXKwkd&WZJ}eR`V3U# z7^-;;ea<#xayes)J!?iWYtA-nAv|j-H*2LcONb5;$_5JNC`wx?e8z<7u#DMkk6Bwe zeD7|Mvo-9M-0VAOEv0V)%+~kOe-zA`{}jxRRiLPXIpK~AvUSc|C-!YB*|UD#kiQD% z(_%j-sK1on6FQJ&6d5U~)8RdcJA={q11{VN6q<@2#sD&tfuOyc!4CQix>G>*={+b$ z3Pexs_h^Clwedn6n_s-}%Xd0+A>s2(UtU_42D~%JC6g(l76UO|mPnZqEGQ-(1Hz(<9lj(oTjr%C}0{C-djeHr5!Iq0lU z$eb{g-6hq*7>hv$q|3`Y!N7pm_IoJeK>1Y73%lS1^TYS zFA37HPPn>GymS9V3;o7o9n%@g9)-Q<6GG;;er9Zb=z~j8fliiz5xV~QVZl;BhB;mD z24s1|k9z$od>yZBeXJ({d9!A|z3dJ}VyUp|<*A0y^ana8`1xgE=*R>b53P=_%!!`* z(i5(`N8xbgZQ9JBKTUv&qCF7OwS<{%1wcFk3k0!`&i&+={N5xiVj|`xMz^HC>-p&g zC20azDBy_ZHSC(3%f^Yz#hFW0Kt<;7lOiz7RY8iq(Mn}sf`l!FQ@5ZU_odJ*ukOtZ z8n1o-4Ap`9yMmTE3xa+zK!2-2Z=`&Qz&J2!%inMeRL0CX7mNrT-LN)|gPMJWtpC+9 zp95UmUutFY3TFFin*ydly<;i@a4mYG-WQYJSANSo?q(ao>lC>2zA|o5SLxkQ&Fx?m z*9I80ZCidumjbvJ>AM`fjzwA-1hd;j&4{1QcTzxaZae0aaZ|Ac8}widD_f&KsZ%se zVCa2Zm^#!j1F~0ByL=lmV=l^>czOq${@jaF2gx$+o6>+n0I#jE4RcPLQc4B9Ho;`m zU4UVF0WJA1;I)Bze|asaKLE`>lifaB9UA;G^^?r?tztex%qggRD8Y!5+n^RL)t&>*F|;AGAOPE0paoJVXOMzT>GX` zm)>K;&*hb$0G5ixQ8&`Q(8)1i9s|oQgt~#+w$`ELd*$AWV+gek(hmrk5r-OP{zt%! zI5a7M`gl^>$wcXRMg-LO5w}8Qx#Pa$y^px{(z<#;#~fuCB7g~@+0*lL33l`Gqsknj zuXx!odkm;)b?Wv{z-zDUH)lWlea4)f=pwS61HATl$2mYT^&}3nm2w@mBYtW&v5!+V zj9}F~VXc5V_`EjwZ2Gef{kqKf5SS6yI|1Iv$2d+vdps(CSZf?8Qt8)$OwmECURt~0 zQhfoHI~_3r*DqIq3^iYW|M+#!WEMYSOw zmAM^+>XkK-=WI6T?53_f89|Kku9ckr-1X-?eXcz1P@q@l_;Jn-^vVh63^wOLuj~i( z%4X-`SLY%c{-K)Z!9cHU3l(GhM$iB4AtXe|^liAyH~x@sq8cC|R~DzbkZ6A+A$k$s ze=gs5E~5Z_-v9~V26|-~ketE=ZQq5;<9A`4=NcTYijSf1^+K39-m8yY(3QKw^xlV~ zUA~-q3#<6{!X0F=cA*`4#uN`So&zcTxMTreD#wGAsGx>@mzIyAkAIxY0J*ZjH{;t} z*;3)V{Yy6v8#kNC%Rt4qcKN{5Hzuz^Zy=-+RNo;6?Ew}i?_6G=>AnWJ^SeLEzYGqm zxCGdg;?H;Yes}fu?`%}>1DM{wsK2nP|KX)^=Dp_bfAS-+{k>BDg`X%iP}GBD?5)tt zw~%yldmvWUyMWo8!PmZp#(SJ*xVbb01I4lBpZ5ywP>#LxpqH)y*2XHh>ET|omSZHm zJZIvDx+eYjnT~s%L3N$Uah)Z4ovm=4^YS{^<~q;a)0(KBi3Q!2u$~tieS-_)iZ9Pmf9(jmYfWlD#V2&&q*6cKW@Q` z0e{?8E(ZMZ@H##-0G<54OA+pqbRs`3=oK1DgEcWd_ltfff{|P>G&mT;9)^|l9~4}0 zdkgV+5yK!-laU)-EMI}0jGp=d966sJodAxZ&NzpG;}t7$?7<)dFupyQ&=X87&WYCS z-SLh%m#G?y0G+}Y2lS?zFu593Sq)yQ#yzVBJ+FM~QF$-EQn8^@nJ1^89js1Ji)Dyz zpjk^03MMM9zLV^3-7!maY!ohqU&)g>v0$B<*(|AXdAp9 zG~oMb&AMO%Qz*3S7{zGTnTHMUK#d-pjrSBAEo~d)pEl$9X%Qz70>k6ewea|4=8a>hlOPphGh?gX)IO0z>e_l=EI)7g{dn@v7o`4t9PV?5q$d;PoyLYAF!|hn^GvG z3QD^!)PmK`Di$83Q&5P4pjyL!nZ={-L;+SUEVg*T%$mykSLqQl;)QaL7i>f}QCU+Vcer8}Om zUzxjKRk>f?zJD*YU;0y8&Z6+iKmF(*gC2C1pa{+;+>lz_%v!h5-s!wvh-go5-(fH9 zgItWtT#P4~l(+O*LfH4w+vY7{+I!wKcge;N%e`JL%mU)zhswDk@NDs0`sDM{vHU%# zLf@|@*{@;L@4(xGw#zo#k|yMttN%BBj{i4(PVgvA0Q5<#7DFB$Lpu^fOB72Ek%}dE zilr?@#?l_gk~0)#4>IL?78RoGa~!ZwvEzT)=adY?^b;w-KBwi0rUCm@Xq~>b&uNtv zb4{n|A7V4|ty8)T(|~>IOHCUSO#}96Ix+>=rzOfhXUD+hcLmBvAA!IBb^mb`=9}{o z3&`)*YolIO?_TwkUQPP(5Xo`aQ6&=(AL|f5o7dm;8A~`C_q*>G{m_l%&>y2Af1jbi z@X!woeTw))iM&I}sza%cL+N2dE58;tmXp0l#y%d8`4Wv!@Q$x2^praG#NI5%F)SrW zEhQN*1^6skaxIj#EK%C@((Vr5#f6O6vW=ubTOyHJEtHDA11obwH*;h3^PM9L-Ny^} zlgIi~A%iQBVFuq(C;jp8%E?myM&sdGwbgm2)y0+N<(uWYaQ}f%#J_L(^JZjCm3$q` zWE~rcw{5nLuf7iOCjoN(_pu2Wxeo9rS=l9BXKh` zwiJG^s?x2|>aE`OSd~dweOR|@xwL8n-41jZ4wo2>G#rig8tq9QooX2!P#M;5n}f^| zEiLdZEvYRbucVf*jh9QL7B<5M^h*W|hX;(0222SD&FNP?rB)54*Njcp_I%b3QrE1Z zOTDE_0rwY!)E7gX7hw^Lp=FCwS^a<2q9rK9oM(@kk7n5GTiO3CwHR-_nCP>ZoVu9G zFgQ4n^7`L~IcJOWWCeEuYNx*U&T-EzY|o=)&vSThuQ2WCClT?}Y*a1UfApeY`>*EH z6NG9$KLX9?^YQuL#P$DuW$~a1c+&(tD&0D+K04_s=OwMW4hFReUTG||MK;vLgVH0HG-J+%jf0z=}h0%+Kpe0 zT|`EGS1~0>M0{61!7E1lp}>gOD)VEI5JH~SG=#xyin_0O{1|m#@q@z%;>Fd%osOZM zuEQO3+m;En5gL~APIYiX)cC*aP>ZXp-+OhVOATL_nuwQMR#)1PE7FsdjC55nADoDP z>d^6r!>>%5ZSS9^-965bKF%^Z&iQzpH`

    yykX)%|m?+;)!%#^ZvO1F>T-X<5ekN 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 Date: Wed, 1 Dec 2021 14:45:57 -0800 Subject: [PATCH 05/44] stick to markdown w/o html wherever possible, remove temporary fts requirement --- docs/requirements.txt | 3 --- .../finetuning-scheduler.py | 19 ++----------------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index cd93ce2ee..f721f461a 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,9 +6,6 @@ docutils>=0.16 sphinx-paramlinks>=0.4.0 ipython[notebook] -# temporarily included until hub available to evaluate finetuning_scheduler -git+git://github.com/speediedan/pytorch-lightning.git@24d3e43568814ec381ac5be91627629808d62081#egg=pytorch-lightning - https://github.com/PyTorchLightning/lightning_sphinx_theme/archive/master.zip#egg=pt-lightning-sphinx-theme -r ../.actions/requirements.txt diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 5aab8f6df..027275b92 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,18 +1,3 @@ -# --- -# jupyter: -# jupytext: -# formats: ipynb,py:percent -# text_representation: -# extension: .py -# format_name: percent -# format_version: '1.3' -# jupytext_version: 1.13.2 -# kernelspec: -# display_name: 'Python 3.7.11 64-bit (''pldev_tutorials'': conda)' -# language: python -# name: python3 -# --- - # %% [markdown] # ## Scheduled Finetuning # @@ -34,7 +19,7 @@ # final phase of the schedule has its stopping criteria met. See # the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/extensions/generated/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. # -# +# ![FinetuningScheduler explicit loss animation](fts_explicit_loss_anim.gif) # %% [markdown] # ## Basic Usage @@ -416,7 +401,7 @@ def training_epoch_end(self, outputs: List[Any]) -> None: loss = torch.stack([x["loss"] for x in outputs]).mean() self.log("train_loss", loss, prog_bar=True, sync_dist=True) if self.finetuningscheduler_callback: - self.log("finetuning_schedule_depth", self.finetuningscheduler_callback.curr_depth) + self.log("finetuning_schedule_depth", float(self.finetuningscheduler_callback.curr_depth)) def validation_step(self, batch, batch_idx, dataloader_idx=0): outputs = self(**batch) From 33366fe336f5fa5531d283c5eabc8e52c6e61168 Mon Sep 17 00:00:00 2001 From: Dan Dale Date: Thu, 2 Dec 2021 09:06:05 -0800 Subject: [PATCH 06/44] Update lightning_examples/finetuning-scheduler/finetuning-scheduler.py Co-authored-by: thomas chaton --- .../finetuning-scheduler.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 027275b92..9cc473742 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -24,7 +24,7 @@ # %% [markdown] # ## Basic Usage # -# If no finetuning schedule is user-provided, ``FinetuningScheduler`` will generate a +# If no finetuning schedule is provided by the user, ``FinetuningScheduler`` will generate a # [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, using default ``FTSEarlyStopping`` and ``FTSCheckpoint`` callbacks with ``monitor=val_loss``. # # ```python @@ -268,9 +268,8 @@ def __init__( max_seq_length: int = 128, train_batch_size: int = 32, eval_batch_size: int = 32, - pin_memory: bool = False, tokenizers_parallelism: bool = True, - num_workers: int = 0, + **dataloader_kwargs: Any, ): super().__init__() self.model_name_or_path = model_name_or_path @@ -399,7 +398,7 @@ def training_step(self, batch, batch_idx): def training_epoch_end(self, outputs: List[Any]) -> None: loss = torch.stack([x["loss"] for x in outputs]).mean() - self.log("train_loss", loss, prog_bar=True, sync_dist=True) + self.log("train_loss", loss, prog_bar=True) if self.finetuningscheduler_callback: self.log("finetuning_schedule_depth", float(self.finetuningscheduler_callback.curr_depth)) @@ -424,14 +423,14 @@ def validation_epoch_end(self, outputs): self.log_dict(metric_dict, prog_bar=True, sync_dist=True) return loss - def init_pgs(self) -> List[Dict]: + def _init_param_groups(self) -> List[Dict]: """Initialize the parameter groups. Used to ensure weight_decay is not applied to our specified bias parameters when we initialize the optimizer. Returns: List[Dict]: A list of parameter group dictionaries. """ - pgs = [ + return [ { "params": [ p @@ -449,7 +448,6 @@ def init_pgs(self) -> List[Dict]: "weight_decay": 0.0, }, ] - return pgs def configure_optimizers(self): # the phase 0 parameters will have been set to require gradients during setup @@ -472,7 +470,7 @@ def configure_callbacks(self): # %% -# let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it +# Let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it # Please see the documentation for a full description of the schedule format ft_schedule_yaml = """ 0: @@ -527,13 +525,14 @@ def configure_callbacks(self): # # %load_ext tensorboard # # %tensorboard --logdir example_logdir # disable progress bar by default to focus on multi-phase training logs. Set to True to re-enable if desired -show_progress = False +enable_progress_bar = False # %% trainer = pl.Trainer( - enable_progress_bar=show_progress, + enable_progress_bar=enable_progress_bar, precision=16, - gpus=AVAIL_GPUS, + accelerator="auto", + devices="auto", callbacks=callbacks, logger=logger, ) From 3d0fcfe7b844c26e794a363e75f6c6f2d11fbda9 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Thu, 2 Dec 2021 14:34:09 -0800 Subject: [PATCH 07/44] additional tuning literature references and several additional recommended improvements for finetuning_scheduler tutorial --- .../finetuning-scheduler.py | 182 +++++++++++------- 1 file changed, 115 insertions(+), 67 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 9cc473742..52a10fb23 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -100,7 +100,8 @@ # ```python # from pytorch_lightning import Trainer # from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler -# trainer = Trainer(callbacks=[FinetuningScheduler()], resume_from_checkpoint="some/path/to/my_checkpoint.ckpt") +# trainer = Trainer(callbacks=[FinetuningScheduler()]) +# trainer.fit(..., ckpt_path="some/path/to/my_checkpoint.ckpt") # ``` # # Training will resume at the depth/level of the provided checkpoint according the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. @@ -108,10 +109,8 @@ # By default (``FinetuningScheduler.restore_best`` is ``True``), ``FinetuningScheduler`` will attempt to restore the best available checkpoint before finetuning depth transitions. # # ```python -# trainer = Trainer( -# callbacks=[FinetuningScheduler(new_incarnation_mode=True)], -# resume_from_checkpoint="some/path/to/my_kth_best_checkpoint.ckpt", -# ) +# trainer = Trainer(callbacks=[FinetuningScheduler(new_incarnation_mode=True)]) +# trainer.fit(..., ckpt_path="some/path/to/my_kth_best_checkpoint.ckpt") # ``` # # To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting ``FinetuningScheduler.new_incarnation_mode`` to @@ -120,14 +119,12 @@ # %% [markdown] #

    @@ -142,7 +139,6 @@ # # %% -import logging import os import warnings from datetime import datetime @@ -160,24 +156,24 @@ from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer # %% -# a couple helper functions to prepare code to work with the forthcoming hub and user module registry -MOCK_HUB_REGISTRY = _Registry() +# a couple helper functions to prepare code to work with a user module registry +MOCK_REGISTRY = _Registry() -def module_hub_mock(key: str, require_fqn: bool = False) -> List: +def mock_register_module(key: str, require_fqn: bool = False) -> List: if key.lower() == "finetuningscheduler": mod = import_module("pytorch_lightning.callbacks.finetuning_scheduler") - MOCK_HUB_REGISTRY.register_classes(mod, pl.callbacks.Callback) + MOCK_REGISTRY.register_classes(mod, pl.callbacks.Callback) else: raise MisconfigurationException(f"user module key '{key}' not found") registered_list = [] # make registered class available by unqualified class name by default if not require_fqn: - for n, c in MOCK_HUB_REGISTRY.items(): + for n, c in MOCK_REGISTRY.items(): globals()[f"{n}"] = c - registered_list = ", ".join([n for n in MOCK_HUB_REGISTRY.names]) + registered_list = ", ".join([n for n in MOCK_REGISTRY.names]) else: - registered_list = ", ".join([c.__module__ + "." + c.__name__ for c in MOCK_HUB_REGISTRY.classes]) + registered_list = ", ".join([c.__module__ + "." + c.__name__ for c in MOCK_REGISTRY.classes]) print(f"Imported and registered the following callbacks: {registered_list}") @@ -203,7 +199,7 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, else: # class is expected to be locally defined args_class = globals()[init["class_path"]] elif init.get("callback_key", None): - callback_path = CALLBACK_REGISTRY.get(init["callback_key"], None) or MOCK_HUB_REGISTRY.get( + callback_path = CALLBACK_REGISTRY.get(init["callback_key"], None) or MOCK_REGISTRY.get( init["callback_key"], None ) assert callback_path, MisconfigurationException( @@ -222,31 +218,24 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, # %% # load the pl extension module we want to use. This will import all necessary callbacks. -module_hub_mock("finetuningscheduler") +mock_register_module("finetuningscheduler") # set notebook-level variables -AVAIL_GPUS = min(1, torch.cuda.device_count()) +AVAIL_GPUS = torch.cuda.device_count() TASK_NUM_LABELS = {"boolq": 2, "rte": 2} DEFAULT_TASK = "rte" -# narrow our logging to adapt it for a notebook environment -for l_key in logging.Logger.manager.loggerDict.keys(): - if "pytorch_lightning" in l_key: - logging.getLogger(l_key).setLevel("INFO") - else: - logging.getLogger(l_key).setLevel("CRITICAL") -pl_logger = logging.getLogger("pytorch_lightning") -pl_logger.removeHandler(pl_logger.handlers[0]) -rz_logger = logging.getLogger("pytorch_lightning.utilities.distributed") -rz_logger.addHandler(logging.StreamHandler()) -rz_logger.handlers[0].setLevel("INFO") +# ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and +# expected logging behavior +for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: + warnings.filterwarnings("ignore", warnf) # %% class RteBoolqDataModule(pl.LightningDataModule): """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets.""" - task_text_field_map = {"rte": ["premise", "hypothesis"], "boolq": ["question", "passage"]} - loader_columns = [ + TASK_TEXT_FIELD_MAP = {"rte": ("premise", "hypothesis"), "boolq": ("question", "passage")} + LOADER_COLUMNS = ( "datasets_idx", "input_ids", "token_type_ids", @@ -254,17 +243,12 @@ class RteBoolqDataModule(pl.LightningDataModule): "start_positions", "end_positions", "labels", - ] - # ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and - # expected logging behavior - for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: - warnings.filterwarnings("ignore", warnf) + ) def __init__( self, model_name_or_path: str, task_name: str = DEFAULT_TASK, - prep_on_init: bool = False, max_seq_length: int = 128, train_batch_size: int = 32, eval_batch_size: int = 32, @@ -278,23 +262,22 @@ def __init__( self.train_batch_size = train_batch_size self.eval_batch_size = eval_batch_size self.tokenizers_parallelism = tokenizers_parallelism - self.dataloader_kwargs = {"num_workers": num_workers, "pin_memory": pin_memory} - self.text_fields = self.task_text_field_map[self.task_name] + self.dataloader_kwargs = { + "num_workers": dataloader_kwargs.get("num_workers", 0), + "pin_memory": dataloader_kwargs.get("pin_memory", False), + } + self.text_fields = self.TASK_TEXT_FIELD_MAP[self.task_name] self.num_labels = TASK_NUM_LABELS[self.task_name] os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.tokenizers_parallelism else "false" self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True, local_files_only=False) - if prep_on_init: # useful if one wants to load datasets as soon as the ``LightningDataModule`` is - # instantiated - self.prepare_data() - self.setup("fit") def setup(self, stage): self.dataset = datasets.load_dataset("super_glue", self.task_name) for split in self.dataset.keys(): self.dataset[split] = self.dataset[split].map( - self.convert_to_features, batched=True, remove_columns=["label"] + self._convert_to_features, batched=True, remove_columns=["label"] ) - self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns] + self.columns = [c for c in self.dataset[split].column_names if c in self.LOADER_COLUMNS] self.dataset[split].set_format(type="torch", columns=self.columns) self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] @@ -329,7 +312,7 @@ def test_dataloader(self): for x in self.eval_splits ] - def convert_to_features(self, example_batch): + def _convert_to_features(self, example_batch): text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) # Tokenize the text/text pairs features = self.tokenizer.batch_encode_plus( @@ -412,15 +395,15 @@ def validation_step(self, batch, batch_idx, dataloader_idx=0): preds = logits.squeeze() labels = batch["labels"] + self.log("val_loss", val_loss, prog_bar=True) return {"loss": val_loss, "preds": preds, "labels": labels} def validation_epoch_end(self, outputs): preds = torch.cat([x["preds"] for x in outputs]).detach().cpu().numpy() labels = torch.cat([x["labels"] for x in outputs]).detach().cpu().numpy() loss = torch.stack([x["loss"] for x in outputs]).mean() - self.log("val_loss", loss, prog_bar=True, sync_dist=True) metric_dict = self.metric.compute(predictions=preds, references=labels) - self.log_dict(metric_dict, prog_bar=True, sync_dist=True) + self.log_dict(metric_dict, prog_bar=True) return loss def _init_param_groups(self) -> List[Dict]: @@ -455,7 +438,7 @@ def configure_optimizers(self): # but in this case we pass a list of parameter groups to ensure weight_decay is # not applied to the bias parameter (for completeness, in this case it won't make much # performance difference) - optimizer = instantiate_registered_class(args=self.init_pgs(), init=self.optimizer_init) + optimizer = instantiate_registered_class(args=self._init_param_groups(), init=self.optimizer_init) scheduler = { "scheduler": instantiate_registered_class(args=optimizer, init=self.lr_scheduler_init), **self.pl_lrs_cfg, @@ -485,6 +468,8 @@ def configure_callbacks(self): - model.albert.encoder.*.ffn_output.* """ ft_schedule_name = "RteBoolqModule_ft_schedule_albert_base.yaml" +# Let's write the schedule to a file so we can simulate loading an explicitly defined finetuning +# schedule. with open(ft_schedule_name, "w") as f: f.write(ft_schedule_yaml) @@ -492,17 +477,52 @@ def configure_callbacks(self): datasets.set_progress_bar_enabled(False) pl.seed_everything(42) dm = RteBoolqDataModule(model_name_or_path="albert-base-v2", tokenizers_parallelism=False) -dm.setup("fit") + +# %% [markdown] +# ### Optimizer Configuration +# +#
    +# +# Though other optimizers can arguably yield some marginal advantage contingent on the context, +# the Adam optimizer (and the [AdamW version](https://pytorch.org/docs/stable/_modules/torch/optim/adamw.html#AdamW) which +# implements decoupled weight decay) remains robust to hyperparameter choices and is commonly used for finetuning +# foundational language models. See [(Sivaprasad et al., 2020)](#f2) and [(Mosbach, Andriushchenko & Klakow, 2020)](#f3) for theoretical and systematic empirical justifications of Adam and its use in finetuning +# large transformer-based language models. The values used here have some justification +# in the referenced literature but have been largely empirically determined and while a good +# starting point could be could be further tuned. +# +#
    + +# %% optimizer_init = { "class_path": "torch.optim.AdamW", "init_args": {"weight_decay": 1e-05, "eps": 1e-07, "lr": 1e-05}, } + +# %% [markdown] +# ### LR Scheduler Configuration +# +#
    +# +# The [CosineAnnealingWarmRestarts scheduler](https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.CosineAnnealingWarmRestarts.html?highlight=cosineannealingwarm#torch.optim.lr_scheduler.CosineAnnealingWarmRestarts) nicely fits with our iterative finetuning since it does not depend upon a global max_epoch +# value. The importance of initial warmup is reduced due to the innate warmup effect of Adam bias correction [[5]](#f3) +# and the gradual thawing we are performing. Note that commonly used LR schedulers that depend on providing +# max_iterations/epochs (e.g. the +# [CosineWarmupScheduler](https://github.com/PyTorchLightning/lightning-tutorials/blob/0c325829101d5a6ebf32ed99bbf5b09badf04a59/course_UvA-DL/05-transformers-and-MH-attention/Transformers_MHAttention.py#L688) +# used in other pytorch-lightning tutorials) also work with FinetuningScheduler. Though the LR scheduler is theoretically +# justified [(Loshchilov & Hutter, 2016)](#f4), the particular values provided here are primarily empircally driven. +# +#
    + + +# %% lr_scheduler_init = { "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, } pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} +# %% model = RteBoolqModule( model_name_or_path="albert-base-v2", optimizer_init=optimizer_init, @@ -528,15 +548,23 @@ def configure_callbacks(self): enable_progress_bar = False # %% -trainer = pl.Trainer( - enable_progress_bar=enable_progress_bar, - precision=16, - accelerator="auto", - devices="auto", - callbacks=callbacks, - logger=logger, -) -trainer.fit(model, datamodule=dm) +def train() -> None: + trainer = pl.Trainer( + enable_progress_bar=enable_progress_bar, + precision=16, + gpus=1, + # accelerator="auto", + # devices="auto", + callbacks=callbacks, + logger=logger, + ) + trainer.fit(model, datamodule=dm) + + +if AVAIL_GPUS > 0: + train() +else: + print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") # %% [markdown] # ## Footnotes @@ -560,5 +588,25 @@ def configure_callbacks(self): # [Peters, M. E., Ruder, S., & Smith, N. A. (2019)](https://arxiv.org/pdf/1903.05987.pdf). To tune or not to # tune? adapting pretrained representations to diverse tasks. arXiv preprint arXiv:1903.05987. [↩](#a1) # -# -# +# +#
  7. +# +# [Sivaprasad, P. T., Mai, F., Vogels, T., Jaggi, M., & Fleuret, F. (2020)](https://arxiv.org/pdf/1910.11758.pdf). +# Optimizer benchmarking needs to account for hyperparameter tuning. In International Conference on Machine Learning +# (pp. 9036-9045). PMLR. [↩](#a2) +# +#
  8. +#
  9. +# +# [Mosbach, M., Andriushchenko, M., & Klakow, D. (2020)](https://arxiv.org/pdf/2006.04884.pdf). On the stability of +# fine-tuning bert: Misconceptions, explanations, and strong baselines. arXiv preprint arXiv:2006.04884. [↩](#a2) +# +#
  10. +#
  11. +# +# [Loshchilov, I., & Hutter, F. (2016)](https://arxiv.org/pdf/1608.03983.pdf). Sgdr: Stochastic gradient descent with +# warm restarts. arXiv preprint arXiv:1608.03983. [↩](#a3) +# +#
  12. +# +#
From d13d9d956bb322e1c588c0ff3940433ff73df1e7 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Sat, 4 Dec 2021 14:34:37 -0800 Subject: [PATCH 08/44] misc tutorial enhancements --- .../finetuning-scheduler.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 52a10fb23..37729e295 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,3 +1,15 @@ +# --- +# jupyter: +# jupytext: +# cell_metadata_filter: -all +# formats: ipynb,py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.13.2 +# --- + # %% [markdown] # ## Scheduled Finetuning # @@ -396,6 +408,7 @@ def validation_step(self, batch, batch_idx, dataloader_idx=0): labels = batch["labels"] self.log("val_loss", val_loss, prog_bar=True) + return {"loss": val_loss, "preds": preds, "labels": labels} def validation_epoch_end(self, outputs): @@ -518,7 +531,8 @@ def configure_callbacks(self): # %% lr_scheduler_init = { "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", - "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, + # "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, + "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 0}, } pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} @@ -551,10 +565,10 @@ def configure_callbacks(self): def train() -> None: trainer = pl.Trainer( enable_progress_bar=enable_progress_bar, + # max_epochs=1, precision=16, - gpus=1, - # accelerator="auto", - # devices="auto", + accelerator="gpu", + devices=1, callbacks=callbacks, logger=logger, ) From eb7e09516a6157010224a16147ee8a65b858d896 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Wed, 8 Dec 2021 12:33:03 -0800 Subject: [PATCH 09/44] numerous expository enhancements and switch to DeBERTav3 --- .../finetuning-scheduler/.meta.yml | 1 + ...eBoolqModule_ft_schedule_deberta_base.yaml | 18 ++ .../finetuning-scheduler.py | 233 +++++++++++++----- .../fts_explicit_accuracy.png | Bin 0 -> 24409 bytes .../implicit_training_transition.png | Bin 0 -> 22919 bytes .../nofts_baseline_accuracy.png | Bin 0 -> 24750 bytes 6 files changed, 197 insertions(+), 55 deletions(-) create mode 100644 lightning_examples/finetuning-scheduler/RteBoolqModule_ft_schedule_deberta_base.yaml create mode 100644 lightning_examples/finetuning-scheduler/fts_explicit_accuracy.png create mode 100644 lightning_examples/finetuning-scheduler/implicit_training_transition.png create mode 100644 lightning_examples/finetuning-scheduler/nofts_baseline_accuracy.png diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 3b63b73e5..6954f680c 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -16,5 +16,6 @@ requirements: - transformers - datasets - scikit-learn + - sentencepiece accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/RteBoolqModule_ft_schedule_deberta_base.yaml b/lightning_examples/finetuning-scheduler/RteBoolqModule_ft_schedule_deberta_base.yaml new file mode 100644 index 000000000..62bdbae28 --- /dev/null +++ b/lightning_examples/finetuning-scheduler/RteBoolqModule_ft_schedule_deberta_base.yaml @@ -0,0 +1,18 @@ + +0: + params: + - model.classifier.bias + - model.classifier.weight + - model.pooler.dense.bias + - model.pooler.dense.weight + - model.deberta.encoder.LayerNorm.bias + - model.deberta.encoder.LayerNorm.weight + - model.deberta.encoder.rel_embeddings.weight + - model.deberta.encoder.layer.{0,11}.(output|attention|intermediate).* +1: + params: + - model.deberta.embeddings.LayerNorm.bias + - model.deberta.embeddings.LayerNorm.weight +2: + params: + - model.deberta.embeddings.word_embeddings.weight diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 37729e295..968395d0c 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,25 +1,21 @@ -# --- -# jupyter: -# jupytext: -# cell_metadata_filter: -all -# formats: ipynb,py:percent -# text_representation: -# extension: .py -# format_name: percent -# format_version: '1.3' -# jupytext_version: 1.13.2 -# --- - # %% [markdown] # ## Scheduled Finetuning # +# Training with the ``FinetuningScheduler`` callback confers a host of benefits. It was created to meet the following +# objectives in roughly descending order of priority: +# +# - maximize finetuning flexibility +# - expedite and facilitate exploration of model tuning dynamics in research +# - allow marginal performance improvements of finetuned models +# #
# -# The ``FinetuningScheduler`` callback enables multi-phase, -# scheduled finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize +# Fundamentally, the ``FinetuningScheduler`` callback enables scheduled, multi-phase, +# finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize # foundational model knowledge retention while allowing (typically upper layers of) the model to # optimally adapt to new tasks during transfer learning [1, 2, 3](#f1) # +# #
# # ``FinetuningScheduler`` orchestrates the gradual unfreezing @@ -34,11 +30,16 @@ # ![FinetuningScheduler explicit loss animation](fts_explicit_loss_anim.gif) # %% [markdown] +# # ## Basic Usage # +#
+# # If no finetuning schedule is provided by the user, ``FinetuningScheduler`` will generate a # [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, using default ``FTSEarlyStopping`` and ``FTSCheckpoint`` callbacks with ``monitor=val_loss``. # +#
+# # ```python # from pytorch_lightning import Trainer # from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler @@ -49,7 +50,7 @@ # ## The Default Finetuning Schedule # # Schedule definition is facilitated via the ``gen_ft_schedule`` method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as -# desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will often be less computationally efficient than a user-defined finetuning schedule but can often serve as a good baseline for subsquent explicit schedule refinement and will marginally outperform many explicit schedules. +# desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will likely be less computationally efficient than a user-defined finetuning schedule but is useful for exploring a model's finetuning behavior and can serve as a good baseline for subsquent explicit schedule refinement. # %% [markdown] # ## Specifying a Finetuning Schedule @@ -147,8 +148,6 @@ # # The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # -# ``FinetuningScheduler`` can be used to achieve non-trivial model performance improvements in both implicit and explicit scheduling contexts at an also non-trivial computational cost. -# # %% import os @@ -166,6 +165,7 @@ from pytorch_lightning.utilities.exceptions import MisconfigurationException from torch.utils.data import DataLoader from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer +from transformers import logging as transformers_logging # %% # a couple helper functions to prepare code to work with a user module registry @@ -200,12 +200,14 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, Returns: The instantiated class object. """ + class_module, class_name, args_class = None, None, None + shortcircuit_local = False kwargs = init.get("init_args", {}) + class_path = init.get("class_path", None) if args and not isinstance(args, tuple): args = (args,) - shortcircuit_local = False if "." in init["class_path"] else True - class_module, class_name, args_class = None, None, None - if init.get("class_path", None): + if class_path: + shortcircuit_local = False if "." in class_path else True if not shortcircuit_local: class_module, class_name = init["class_path"].rsplit(".", 1) else: # class is expected to be locally defined @@ -236,6 +238,7 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, TASK_NUM_LABELS = {"boolq": 2, "rte": 2} DEFAULT_TASK = "rte" +transformers_logging.set_verbosity_error() # ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and # expected logging behavior for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: @@ -262,8 +265,8 @@ def __init__( model_name_or_path: str, task_name: str = DEFAULT_TASK, max_seq_length: int = 128, - train_batch_size: int = 32, - eval_batch_size: int = 32, + train_batch_size: int = 16, + eval_batch_size: int = 16, tokenizers_parallelism: bool = True, **dataloader_kwargs: Any, ): @@ -373,12 +376,21 @@ def __init__( self.task_name = DEFAULT_TASK rank_zero_warn(f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'") self.num_labels = TASK_NUM_LABELS[self.task_name] - self.save_hyperparameters() self.experiment_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}" self.model_cfg = model_cfg or {} conf = AutoConfig.from_pretrained(model_name_or_path, num_labels=self.num_labels, local_files_only=False) self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=conf) self.model.config.update(self.model_cfg) # apply model config overrides + self.init_hparams = { + "optimizer": self.optimizer_init, + "lr_scheduler": self.lr_scheduler_init, + "pl_lrs_cfg": self.pl_lrs_cfg, + "model_config": self.model.config, + "model_name_or_path": model_name_or_path, + "task_name": self.task_name, + "experiment_id": self.experiment_id, + } + self.save_hyperparameters(self.init_hparams) self.metric = datasets.load_metric("super_glue", self.task_name, experiment_id=self.experiment_id) self.no_decay = ["bias", "LayerNorm.weight"] self.finetuningscheduler_callback = None @@ -400,24 +412,14 @@ def training_epoch_end(self, outputs: List[Any]) -> None: def validation_step(self, batch, batch_idx, dataloader_idx=0): outputs = self(**batch) val_loss, logits = outputs[:2] - if self.num_labels >= 1: preds = torch.argmax(logits, axis=1) elif self.num_labels == 1: preds = logits.squeeze() - labels = batch["labels"] self.log("val_loss", val_loss, prog_bar=True) - - return {"loss": val_loss, "preds": preds, "labels": labels} - - def validation_epoch_end(self, outputs): - preds = torch.cat([x["preds"] for x in outputs]).detach().cpu().numpy() - labels = torch.cat([x["labels"] for x in outputs]).detach().cpu().numpy() - loss = torch.stack([x["loss"] for x in outputs]).mean() metric_dict = self.metric.compute(predictions=preds, references=labels) self.log_dict(metric_dict, prog_bar=True) - return loss def _init_param_groups(self) -> List[Dict]: """Initialize the parameter groups. Used to ensure weight_decay is not applied to our specified bias @@ -465,22 +467,46 @@ def configure_callbacks(self): return super().configure_callbacks() +# %% [markdown] +# ### Our Training Sessions +# +# We'll be comparing three different finetuning training configurations. Every configuration in this example depends +# upon a shared set of defaults, only differing in their respective finetuning schedules. +# +# | Experiment Tag | Training Scenario Description | +# |:-----------------:| ---------------------------------------------------------------------- | +# | ``fts_explicit`` | Training with a finetuning schedule explicitly provided by the user | +# | ``nofts_baseline``| A baseline finetuning training session (without scheduled finetuning) | +# | ``fts_implicit`` | Training with an implicitly generated finetuning schedule (the default)| +# +# Let's begin by configuring the ``fts_explicit`` scenario. We'll subsequently run the other two scenarios for +# comparison. + # %% # Let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it -# Please see the documentation for a full description of the schedule format +# Please see the ``FinetuningScheduler`` documentation for a full description of the schedule format + + ft_schedule_yaml = """ 0: - params: # the parameters for each phase definition can be fully specified + params: - model.classifier.bias - model.classifier.weight + - model.pooler.dense.bias + - model.pooler.dense.weight + - model.deberta.encoder.LayerNorm.bias + - model.deberta.encoder.LayerNorm.weight + - model.deberta.encoder.rel_embeddings.weight + - model.deberta.encoder.layer.{0,11}.(output|attention|intermediate).* 1: - params: # or specified via a regex - - model.albert.pooler.* + params: + - model.deberta.embeddings.LayerNorm.bias + - model.deberta.embeddings.LayerNorm.weight 2: params: - - model.albert.encoder.*.ffn_output.* + - model.deberta.embeddings.word_embeddings.weight """ -ft_schedule_name = "RteBoolqModule_ft_schedule_albert_base.yaml" +ft_schedule_name = "RteBoolqModule_ft_schedule_deberta_base.yaml" # Let's write the schedule to a file so we can simulate loading an explicitly defined finetuning # schedule. with open(ft_schedule_name, "w") as f: @@ -489,7 +515,7 @@ def configure_callbacks(self): # %% datasets.set_progress_bar_enabled(False) pl.seed_everything(42) -dm = RteBoolqDataModule(model_name_or_path="albert-base-v2", tokenizers_parallelism=False) +dm = RteBoolqDataModule(model_name_or_path="microsoft/deberta-v3-base", tokenizers_parallelism=False) # %% [markdown] # ### Optimizer Configuration @@ -531,28 +557,40 @@ def configure_callbacks(self): # %% lr_scheduler_init = { "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", - # "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, - "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 0}, + "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, } pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} # %% -model = RteBoolqModule( - model_name_or_path="albert-base-v2", - optimizer_init=optimizer_init, - lr_scheduler_init=lr_scheduler_init, - pl_lrs_cfg=pl_lrs_cfg, - experiment_tag="fts_explicit", -) +# Load our lightning module... +lightning_module_kwargs = { + "model_name_or_path": "microsoft/deberta-v3-base", + "optimizer_init": optimizer_init, + "lr_scheduler_init": lr_scheduler_init, + "pl_lrs_cfg": pl_lrs_cfg, +} +model = RteBoolqModule(**lightning_module_kwargs, experiment_tag="fts_explicit") + +# %% [markdown] +# ### Callback Configuration +# +# The only callback required to invoke the ``FinetuningScheduler`` is the ``FinetuningScheduler`` callback itself. +# Default versions of ``FTSCheckpoint`` and ``FTSEarlyStopping`` (if not specifying ``epoch_only_transitions``) will be +# included ([as discussed above](#basic_usage)) if not provided in the callbacks list. For demonstration purposes I'm +# including example configurations of all three callbacks below. + +# %% +earlystopping_kwargs = {"monitor": "val_loss", "min_delta": 0.001, "patience": 2} +checkpoint_kwargs = {"monitor": "val_loss", "save_top_k": 1} +fts_kwargs = {"max_depth": 1} callbacks = [ - FinetuningScheduler(ft_schedule=ft_schedule_name, max_depth=2), # type: ignore # noqa - FTSEarlyStopping(monitor="val_loss", min_delta=0.001, patience=2), # type: ignore # noqa - FTSCheckpoint(monitor="val_loss", save_top_k=5), # type: ignore # noqa + FinetuningScheduler(ft_schedule=ft_schedule_name, **fts_kwargs), # type: ignore # noqa + FTSEarlyStopping(**earlystopping_kwargs), # type: ignore # noqa + FTSCheckpoint(**checkpoint_kwargs), # type: ignore # noqa ] +# %% example_logdir = "lightning_logs" logger = TensorBoardLogger(example_logdir, name="fts_explicit") - -# %% # optionally start tensorboard and monitor progress graphically while viewing multi-phase finetuning specific training # logs in the cell output below by uncommenting the next 3 lines # # !mkdir -p $example_logdir @@ -565,7 +603,7 @@ def configure_callbacks(self): def train() -> None: trainer = pl.Trainer( enable_progress_bar=enable_progress_bar, - # max_epochs=1, + max_epochs=100, precision=16, accelerator="gpu", devices=1, @@ -580,6 +618,91 @@ def train() -> None: else: print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") +# %% [markdown] +# ### Running the Baseline and Implicit Finetuning Scenarios +# +# Let's now compare our ``nofts_baseline`` and ``fts_implicit`` scenarios with the ``fts_explicit`` one we just ran. +# We'll need to update our callbacks list, using the core PL ``EarlyStopping`` and ``ModelCheckpoint`` callbacks for the +# ``nofts_baseline`` (which operate identically to their FTS analogs apart from the recursive training support). +# For both core PyTorch Lightning and user-registered callbacks, we can define our callbacks using a dictionary as we do +# with the LightningCLI. This allows us to avoid managing imports and support more complex configuration separated from +# code. +# We'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping ``max_depth`` for the +# implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction +# of the parameters you'd want to tune for maximum performance. Since the implicit schedule is quite computationally +# intensive and most useful for exploring model behavior, leaving ``max_depth`` 1 allows us to demo implicit mode +# behavior while keeping the computational cost and runtime of this notebook reasonable. To review how a full implicit +# mode run compares to the ``nofts_baseline`` and ``fts_explicit`` scenarios, please see the the following +# [tensorboard experiment summary](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/). + + +# %% + +# reference the core callbacks using the relevant callback_key +nofts_callback_cfg = [ + {"callback_key": "EarlyStopping", "init_args": earlystopping_kwargs}, + {"callback_key": "ModelCheckpoint", "init_args": checkpoint_kwargs}, +] +# we can use class_paths, class names or fully qualified names for referencing user-registered callbacks as well +fts_implicit_cfg = [ + {"callback_key": "FinetuningScheduler", "init_args": fts_kwargs}, # use the callback_key + {"class_path": "FTSEarlyStopping", "init_args": earlystopping_kwargs}, # just the class_name + # or the fully qualified name + { + "class_path": "pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint", + "init_args": checkpoint_kwargs, + }, +] +nofts_callbacks = [instantiate_registered_class(c) for c in nofts_callback_cfg] +fts_implicit_callbacks = [instantiate_registered_class(c) for c in fts_implicit_cfg] +scenario_callbacks = {"nofts_baseline": nofts_callbacks, "fts_implicit": fts_implicit_callbacks} + +# %% +if AVAIL_GPUS > 0: + for scenario_name, scenario_callbacks in scenario_callbacks.items(): + model = RteBoolqModule(**lightning_module_kwargs, experiment_tag=scenario_name) + logger = TensorBoardLogger(example_logdir, name=scenario_name) + callbacks = scenario_callbacks + print(f"Beginning training the '{scenario_name}' scenario") + train() +else: + print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") + +# %% [markdown] +# ### Reviewing the Training Results +# +# See the [tensorboard experiment summaries](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/) to get a sense +# of the relative computational and performance tradeoffs associated with these ``FinetuningScheduler`` configurations. +# The summary compares a full ``fts_implicit`` execution to ``fts_explicit`` and ``nofts_baseline`` scenarios using DDP +# training with 2 GPUs. The full logs/schedules for all three scenarios are available +# [here](https://drive.google.com/file/d/1LrUcisRLHeJgh_BDOOD_GUBPp5iHAkoR/view?usp=sharing) and the checkpoints +# produced in the scenarios [here](https://drive.google.com/file/d/1t7myBgcqcZ9ax_IT9QVk-vFH_l_o5UXB/view?usp=sharing) +# (caution, ~3.5GB). +# +# [![fts_explicit_accuracy](fts_explicit_accuracy.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOnRydWUsIm5vZnRzX2Jhc2VsaW5lIjpmYWxzZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) +# [![nofts_baseline](nofts_baseline_accuracy.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6dHJ1ZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) +# +# Note there could be around ~1% variation in performance from the tensorboard summaries generated by this notebook +# which uses DDP_SPAWN and 1 GPU. +# +# ``FinetuningScheduler`` expands the space of possible finetuning schedules and the composition of more sophisticated schedules can +# yield mariginal finetuning performance gains. That stated, it should be emphasized the primary utility of ``FinetuningScheduler`` is to grant +# greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTav3's implicit training +# run, a critical tuning transition point is immediately apparent: +# +# [![implicit_training_transition](implicit_training_transition.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6ZmFsc2UsImZ0c19pbXBsaWNpdCI6dHJ1ZX0%3D) +# +# Our val_loss begins a precipitous decline at step 3119 which corresponds to phase 17 in the schedule. Referring to our +# schedule, in phase 17 we're beginning tuning the attention parameters of our 10th encoder layer (of 11). Interesting! +# Though beyond the scope of this tutorial, it might be worth investigating these dynamics further and +# ``FinetuningScheduler`` allows one to do just that quite easily. +# +# %% [markdown] +# +# Note that though this example is intended to capture a common usage scenario, substantial variation is expected +# among use cases and models. +# In summary, ``FinetuningScheduler`` provides increased finetuning flexibility that can be useful in a variety of +# contexts from exploring model tuning behavior to maximizing performance. # %% [markdown] # ## Footnotes # diff --git a/lightning_examples/finetuning-scheduler/fts_explicit_accuracy.png b/lightning_examples/finetuning-scheduler/fts_explicit_accuracy.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d8f554a7f7b9b87ed28c016ecfa8d0b1c36deb GIT binary patch literal 24409 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 literal 0 HcmV?d00001 diff --git a/lightning_examples/finetuning-scheduler/nofts_baseline_accuracy.png b/lightning_examples/finetuning-scheduler/nofts_baseline_accuracy.png new file mode 100644 index 0000000000000000000000000000000000000000..b78f8c6756a452156286626501cd06fad5888063 GIT binary patch literal 24750 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 literal 0 HcmV?d00001 From 542980b33ae68ee7f50073f719f754b7115076ec Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Sat, 11 Dec 2021 13:13:22 -0800 Subject: [PATCH 10/44] minor spelling and stylistic updates --- .../finetuning-scheduler/finetuning-scheduler.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 968395d0c..cb8dc2913 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -133,6 +133,7 @@ #
# diff --git a/lightning_examples/finetuning-scheduler/side_by_side_yaml.png b/lightning_examples/finetuning-scheduler/side_by_side_yaml.png new file mode 100644 index 0000000000000000000000000000000000000000..3a32a1f3f2f4e9bd5bfca6173d57114788408ebf GIT binary patch literal 77035 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 - - - - - - - image/svg+xml - - - - - - - - - From a20968341188dd061221237246a51391c72be709 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Thu, 13 Jan 2022 13:56:19 -0800 Subject: [PATCH 25/44] enabled setting base learning rates on a per-phase basis, updating current finetuning_scheduler_module release SHA --- .../finetuning-scheduler/emphasized_yaml.png | Bin 116806 -> 133269 bytes .../finetuning-scheduler.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lightning_examples/finetuning-scheduler/emphasized_yaml.png b/lightning_examples/finetuning-scheduler/emphasized_yaml.png index 5ee87ec217180ebf323c762dc5be59746a9e175c..492be1d40bf959ba990b3cafdc9665eac8e717ab 100644 GIT binary patch literal 133269 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%0AjrYx-^PcashFVzJG%?_1%PvE=7KoVM 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≀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 z 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 I1oZ;`7l{&Q+5i9m diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 6fb7ea3a3..db2b60aa8 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -92,7 +92,7 @@ # #

# -# **Tip:** Use of regex expressions can be convenient for specifying more complex schedules: +# **Tip:** Use of regex expressions can be convenient for specifying more complex schedules. Also, a per-phase base lr can be specified: # # ![emphasized_yaml](emphasized_yaml.png) # From 7b25d48774a7f159a3cb7fd49487c9bf0b38fb0a Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Thu, 13 Jan 2022 15:17:16 -0800 Subject: [PATCH 26/44] clarify finetuning schedule definition configuration options and update fts module requirement ref --- lightning_examples/finetuning-scheduler/.meta.yml | 1 + .../finetuning-scheduler/finetuning-scheduler.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 6954f680c..f2a81e2a1 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -17,5 +17,6 @@ requirements: - datasets - scikit-learn - sentencepiece + - git+git://github.com/speediedan/pytorch-lightning.git@9079069a7bb3bbc20f7c68fe7932b46bf76b21cf#egg=pytorch-lightning accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index db2b60aa8..fe6f3374d 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -51,6 +51,7 @@ # # Schedule definition is facilitated via the ``gen_ft_schedule`` method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as # desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will likely be less computationally efficient than a user-defined finetuning schedule but is useful for exploring a model's finetuning behavior and can serve as a good baseline for subsquent explicit schedule refinement. +# While the current version of ``FinetuningScheduler`` only supports single optimizer and (optional) lr_scheduler configurations, per-phase maximum learning rates can be set as demonstrated in the next section. # %% [markdown] # ## Specifying a Finetuning Schedule @@ -92,7 +93,7 @@ # #
# -# **Tip:** Use of regex expressions can be convenient for specifying more complex schedules. Also, a per-phase base lr can be specified: +# **Tip:** Use of regex expressions can be convenient for specifying more complex schedules. Also, a per-phase base maximum lr can be specified: # # ![emphasized_yaml](emphasized_yaml.png) # From 822ce2f3d23f4d9a64eeebea56cd1a1617f68a91 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Sat, 22 Jan 2022 15:52:01 -0800 Subject: [PATCH 27/44] update notebook author metadata --- lightning_examples/finetuning-scheduler/.meta.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index f2a81e2a1..8e8dbf3f5 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -1,5 +1,5 @@ title: Finetuning Scheduler -author: Dan Dale +author: "[Dan Dale](https://github.com/speediedan)" created: 2021-11-29 updated: 2021-11-29 license: CC BY-SA From 1b4a8fe287b95fd62d19cd8691b709bbd0cdbefe Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Sat, 22 Jan 2022 16:50:50 -0800 Subject: [PATCH 28/44] add links to finetuning-scheduler rtd documentation site --- .../finetuning-scheduler/.meta.yml | 7 +- .../finetuning-scheduler.py | 71 ++++++++++--------- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 8e8dbf3f5..52aa85441 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -7,9 +7,10 @@ build: 1 tags: - finetuning description: | - This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune - a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task - of [SuperGLUE](https://super.gluebenchmark.com/) with iterative early-stopping defined according to a user-specified + This notebook introduces the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) + callback and demonstrates the use of it to finetune a small foundational model on the + [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of + [SuperGLUE](https://super.gluebenchmark.com/) with iterative early-stopping defined according to a user-specified schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and foundational model weights. requirements: diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index fe6f3374d..a49a3072c 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,8 +1,9 @@ # %% [markdown] # ## Scheduled Finetuning # -# Training with the ``FinetuningScheduler`` callback confers a host of benefits. It was created to meet the following -# objectives in roughly descending order of priority: +# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) callback expedites and enhances foundational model experimentation with flexible finetuning schedules. +# +# Training with the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) confers a host of benefits: # # - maximize finetuning flexibility # - expedite and facilitate exploration of model tuning dynamics in research @@ -10,7 +11,7 @@ # #
# -# Fundamentally, the ``FinetuningScheduler`` callback enables scheduled, multi-phase, +# Fundamentally, the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) callback enables scheduled, multi-phase, # finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize # foundational model knowledge retention while allowing (typically upper layers of) the model to # optimally adapt to new tasks during transfer learning [1, 2, 3](#f1) @@ -18,12 +19,12 @@ # #
# -# ``FinetuningScheduler`` orchestrates the gradual unfreezing +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) orchestrates the gradual unfreezing # of models via a finetuning schedule that is either implicitly generated (the default) or explicitly provided by the user # (more computationally efficient). Finetuning phase transitions are driven by -# ``FTSEarlyStopping`` criteria (a multi-phase -# extension of ``EarlyStopping``), user-specified epoch transitions or a composition of the two (the default mode). -# A ``FinetuningScheduler`` training session completes when the +# [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) +# criteria (a multi-phase extension of ``EarlyStopping``), user-specified epoch transitions or a composition of the two (the default mode). +# A [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) training session completes when the # final phase of the schedule has its stopping criteria met. See # the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/extensions/generated/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. # @@ -35,8 +36,9 @@ # #
# -# If no finetuning schedule is provided by the user, ``FinetuningScheduler`` will generate a -# [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, using default ``FTSEarlyStopping`` and ``FTSCheckpoint`` callbacks with ``monitor=val_loss``. +# If no finetuning schedule is provided by the user, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) will generate a +# [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, +# using default [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) and [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint) callbacks with ``monitor=val_loss``. # #
# @@ -49,9 +51,9 @@ # %% [markdown] # ## The Default Finetuning Schedule # -# Schedule definition is facilitated via the ``gen_ft_schedule`` method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as +# Schedule definition is facilitated via the [gen_ft_schedule](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.SchedulingMixin.gen_ft_schedule) method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as # desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will likely be less computationally efficient than a user-defined finetuning schedule but is useful for exploring a model's finetuning behavior and can serve as a good baseline for subsquent explicit schedule refinement. -# While the current version of ``FinetuningScheduler`` only supports single optimizer and (optional) lr_scheduler configurations, per-phase maximum learning rates can be set as demonstrated in the next section. +# While the current version of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) only supports single optimizer and (optional) lr_scheduler configurations, per-phase maximum learning rates can be set as demonstrated in the next section. # %% [markdown] # ## Specifying a Finetuning Schedule @@ -72,7 +74,7 @@ # ![side_by_side_yaml](side_by_side_yaml.png) # # 3. Once the finetuning schedule has been altered as desired, pass it to -# ``FinetuningScheduler`` to commence scheduled training: +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) to commence scheduled training: # # ```python # from pytorch_lightning import Trainer @@ -85,9 +87,9 @@ # ## Early-Stopping and Epoch-Driven Phase Transition Criteria # # -# By default, ``FTSEarlyStopping`` and epoch-driven -# transition criteria are composed. If a ``max_transition_epoch`` is specified for a given phase, the next finetuning phase will begin at that epoch unless ``FTSEarlyStopping`` criteria are met first. -# If ``FinetuningScheduler.epoch_transitions_only`` is ``True``, ``FTSEarlyStopping`` will not be used +# By default, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) and epoch-driven +# transition criteria are composed. If a ``max_transition_epoch`` is specified for a given phase, the next finetuning phase will begin at that epoch unless [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) criteria are met first. +# If [FinetuningScheduler.epoch_transitions_only](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.epoch_transitions_only) is ``True``, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) will not be used # and transitions will be exclusively epoch-driven. # # @@ -101,14 +103,15 @@ # # # -# The end-to-end example in this notebook ([Scheduled Finetuning For SuperGLUE](#superglue)) uses ``FinetuningScheduler`` in explicit mode to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). +# The end-to-end example in this notebook ([Scheduled Finetuning For SuperGLUE](#superglue)) uses [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) in explicit mode to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). +# Please see the [official Finetuning Scheduler documentation](https://finetuning-scheduler.readthedocs.io/en/latest/advanced/finetuning_scheduler.html) if you are interested in a similar [CLI-based example](https://finetuning-scheduler.readthedocs.io/en/latest/advanced/finetuning_scheduler.html#example-scheduled-finetuning-for-superglue) using the LightningCLI. # %% [markdown] # ## Resuming Scheduled Finetuning Training Sessions # # Resumption of scheduled finetuning training is identical to the continuation of -# [other training sessions](https://pytorch-lightning.readthedocs.io/en/latest/common/trainer.html) with the caveat that the provided checkpoint must have been saved by a ``FinetuningScheduler`` session. -# ``FinetuningScheduler`` uses ``FTSCheckpoint`` (an extension of ``ModelCheckpoint``) to maintain schedule state with special metadata. +# [other training sessions](https://pytorch-lightning.readthedocs.io/en/latest/common/trainer.html) with the caveat that the provided checkpoint must have been saved by a [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) session. +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) uses [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint) (an extension of ``ModelCheckpoint``) to maintain schedule state with special metadata. # # # ```python @@ -120,20 +123,20 @@ # # Training will resume at the depth/level of the provided checkpoint according the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. # -# By default (``FinetuningScheduler.restore_best`` is ``True``), ``FinetuningScheduler`` will attempt to restore the best available checkpoint before finetuning depth transitions. +# By default ([FinetuningScheduler.restore_best](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html?highlight=restore_best#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.restore_best) is ``True``), [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) will attempt to restore the best available checkpoint before finetuning depth transitions. # # ```python # trainer = Trainer(callbacks=[FinetuningScheduler(new_incarnation_mode=True)]) # trainer.fit(..., ckpt_path="some/path/to/my_kth_best_checkpoint.ckpt") # ``` # -# To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting ``FinetuningScheduler.new_incarnation_mode`` to +# To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting [FinetuningScheduler.new_incarnation_mode](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html?highlight=new_Incarnation_mode#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.new_incarnation_mode) to # ``True`` as above will re-intialize the checkpoint state with a new best checkpoint at the resumption depth. # %% [markdown] #
# -# **Note:** Currently, _FinetuningScheduler_ only supports the following ``StrategyType``s: +# **Note:** Currently, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) only supports the following ``StrategyType``s: # # - ``DP`` # - ``DDP`` @@ -148,7 +151,7 @@ # # ## Scheduled Finetuning For SuperGLUE # -# The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. +# The following example demonstrates the use of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # # %% @@ -454,7 +457,7 @@ def configure_callbacks(self): # %% # Let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it -# Please see the ``FinetuningScheduler`` documentation for a full description of the schedule format +# Please see the [FinetuningScheduler documentation](https://finetuning-scheduler.readthedocs.io/en/latest/advanced/finetuning_scheduler.html) for a full description of the schedule format ft_schedule_yaml = """ @@ -536,10 +539,10 @@ def configure_callbacks(self): # %% [markdown] # ### Callback Configuration # -# The only callback required to invoke the ``FinetuningScheduler`` is the ``FinetuningScheduler`` callback itself. -# Default versions of ``FTSCheckpoint`` and ``FTSEarlyStopping`` (if not specifying ``epoch_only_transitions``) will be -# included ([as discussed above](#basic_usage)) if not provided in the callbacks list. For demonstration purposes I'm -# including example configurations of all three callbacks below. +# The only callback required to invoke the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) is the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) callback itself. +# Default versions of [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint) and [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) +# (if not specifying ``epoch_only_transitions``) will be included ([as discussed above](#basic_usage)) if not provided +# in the callbacks list. For demonstration purposes I'm including example configurations of all three callbacks below. # %% # let's save our callback configurations for the explicit scenario since we'll be reusing the same @@ -595,10 +598,10 @@ def train() -> None: # with the LightningCLI. This allows us to avoid managing imports and support more complex configuration separated from # code. # -# Note that we'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping ``max_depth`` for +# Note that we'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping [max_depth](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html?highlight=max_depth#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) for # the implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction # of the parameters you'd want to tune for maximum performance. Since the implicit schedule is quite computationally -# intensive and most useful for exploring model behavior, leaving ``max_depth`` 1 allows us to demo implicit mode +# intensive and most useful for exploring model behavior, leaving [max_depth](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html?highlight=max_depth#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) 1 allows us to demo implicit mode # behavior while keeping the computational cost and runtime of this notebook reasonable. To review how a full implicit # mode run compares to the ``nofts_baseline`` and ``fts_explicit`` scenarios, please see the the following # [tensorboard experiment summary](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/). @@ -628,7 +631,7 @@ def train() -> None: # ### Reviewing the Training Results # # See the [tensorboard experiment summaries](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/) to get a sense -# of the relative computational and performance tradeoffs associated with these ``FinetuningScheduler`` configurations. +# of the relative computational and performance tradeoffs associated with these [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) configurations. # The summary compares a full ``fts_implicit`` execution to ``fts_explicit`` and ``nofts_baseline`` scenarios using DDP # training with 2 GPUs. The full logs/schedules for all three scenarios are available # [here](https://drive.google.com/file/d/1LrUcisRLHeJgh_BDOOD_GUBPp5iHAkoR/view?usp=sharing) and the checkpoints @@ -641,8 +644,8 @@ def train() -> None: # Note there could be around ~1% variation in performance from the tensorboard summaries generated by this notebook # which uses DDP_SPAWN and 1 GPU. # -# ``FinetuningScheduler`` expands the space of possible finetuning schedules and the composition of more sophisticated schedules can -# yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of ``FinetuningScheduler`` is to grant +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) expands the space of possible finetuning schedules and the composition of more sophisticated schedules can +# yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) is to grant # greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTa-v3's implicit training # run, a critical tuning transition point is immediately apparent: # @@ -651,13 +654,13 @@ def train() -> None: # Our `val_loss` begins a precipitous decline at step 3119 which corresponds to phase 17 in the schedule. Referring to our # schedule, in phase 17 we're beginning tuning the attention parameters of our 10th encoder layer (of 11). Interesting! # Though beyond the scope of this tutorial, it might be worth investigating these dynamics further and -# ``FinetuningScheduler`` allows one to do just that quite easily. +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) allows one to do just that quite easily. # # %% [markdown] # # Note that though this example is intended to capture a common usage scenario, substantial variation is expected # among use cases and models. -# In summary, ``FinetuningScheduler`` provides increased finetuning flexibility that can be useful in a variety of +# In summary, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) provides increased finetuning flexibility that can be useful in a variety of # contexts from exploring model tuning behavior to maximizing performance. # %% [markdown] # ## Footnotes From c4a3dd963f781ccef0f3def916ab727298fc21cc Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Thu, 27 Jan 2022 12:52:20 -0800 Subject: [PATCH 29/44] update finetuning_scheduler dependency sha --- lightning_examples/finetuning-scheduler/.meta.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 52aa85441..ef6fa1550 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -18,6 +18,6 @@ requirements: - datasets - scikit-learn - sentencepiece - - git+git://github.com/speediedan/pytorch-lightning.git@9079069a7bb3bbc20f7c68fe7932b46bf76b21cf#egg=pytorch-lightning + - git+https://github.com/speediedan/pytorch-lightning.git@90e1976a0099f100b1acefcb9b9cc69ab7ec7ac1#egg=pytorch-lightning accelerator: - GPU From 98c55dfce022ffdf4da296245d7331b7811a577a Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Wed, 9 Feb 2022 17:09:40 -0800 Subject: [PATCH 30/44] updated tutorial with initial version of finetuning-scheduler dependency --- .../finetuning-scheduler/.meta.yml | 8 +- .../finetuning-scheduler.py | 78 +++++++++---------- 2 files changed, 41 insertions(+), 45 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index ef6fa1550..f2814d3fa 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -7,17 +7,13 @@ build: 1 tags: - finetuning description: | - This notebook introduces the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) + This notebook introduces the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback and demonstrates the use of it to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/) with iterative early-stopping defined according to a user-specified schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and foundational model weights. requirements: - - transformers - - datasets - - scikit-learn - - sentencepiece - - git+https://github.com/speediedan/pytorch-lightning.git@90e1976a0099f100b1acefcb9b9cc69ab7ec7ac1#egg=pytorch-lightning + - git+https://github.com/speediedan/finetuning-scheduler.git@736ae0e481729ca2519fc7abf0d38b7f9ba425fe#egg=finetuning-scheduler[examples] accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index a49a3072c..3e6aefb6c 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,9 +1,9 @@ # %% [markdown] # ## Scheduled Finetuning # -# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) callback expedites and enhances foundational model experimentation with flexible finetuning schedules. +# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback expedites and enhances foundational model experimentation with flexible finetuning schedules. # -# Training with the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) confers a host of benefits: +# Training with the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) confers a host of benefits: # # - maximize finetuning flexibility # - expedite and facilitate exploration of model tuning dynamics in research @@ -11,7 +11,7 @@ # #
# -# Fundamentally, the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) callback enables scheduled, multi-phase, +# Fundamentally, the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback enables scheduled, multi-phase, # finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize # foundational model knowledge retention while allowing (typically upper layers of) the model to # optimally adapt to new tasks during transfer learning [1, 2, 3](#f1) @@ -19,12 +19,12 @@ # #
# -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) orchestrates the gradual unfreezing +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) orchestrates the gradual unfreezing # of models via a finetuning schedule that is either implicitly generated (the default) or explicitly provided by the user # (more computationally efficient). Finetuning phase transitions are driven by -# [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) +# [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) # criteria (a multi-phase extension of ``EarlyStopping``), user-specified epoch transitions or a composition of the two (the default mode). -# A [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) training session completes when the +# A [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) training session completes when the # final phase of the schedule has its stopping criteria met. See # the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/extensions/generated/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. # @@ -36,36 +36,36 @@ # #
# -# If no finetuning schedule is provided by the user, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) will generate a +# If no finetuning schedule is provided by the user, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) will generate a # [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, -# using default [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) and [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint) callbacks with ``monitor=val_loss``. +# using default [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) and [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) callbacks with ``monitor=val_loss``. # #
# # ```python # from pytorch_lightning import Trainer -# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# from finetuning_scheduler import FinetuningScheduler # trainer = Trainer(callbacks=[FinetuningScheduler()]) # ``` # %% [markdown] # ## The Default Finetuning Schedule # -# Schedule definition is facilitated via the [gen_ft_schedule](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.SchedulingMixin.gen_ft_schedule) method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as +# Schedule definition is facilitated via the [gen_ft_schedule](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.SchedulingMixin.gen_ft_schedule) method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as # desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will likely be less computationally efficient than a user-defined finetuning schedule but is useful for exploring a model's finetuning behavior and can serve as a good baseline for subsquent explicit schedule refinement. -# While the current version of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) only supports single optimizer and (optional) lr_scheduler configurations, per-phase maximum learning rates can be set as demonstrated in the next section. +# While the current version of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) only supports single optimizer and (optional) lr_scheduler configurations, per-phase maximum learning rates can be set as demonstrated in the next section. # %% [markdown] # ## Specifying a Finetuning Schedule # # To specify a finetuning schedule, it's convenient to first generate the default schedule and then alter the thawed/unfrozen parameter groups associated with each finetuning phase as desired. Finetuning phases are zero-indexed and executed in ascending order. # -# 1. Generate the default schedule to ``Trainer.log_dir`` with the name -# (``lightning_module.__class__.__name__``)_ft_schedule.yaml +# 1. First, generate the default schedule to ``Trainer.log_dir``. It will be named after your +# ``LightningModule`` subclass with the suffix ``_ft_schedule.yaml``. # # ```python # from pytorch_lightning import Trainer -# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# from finetuning_scheduler import FinetuningScheduler # trainer = Trainer(callbacks=[FinetuningScheduler(gen_ft_sched_only=True)]) # ``` # @@ -74,11 +74,11 @@ # ![side_by_side_yaml](side_by_side_yaml.png) # # 3. Once the finetuning schedule has been altered as desired, pass it to -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) to commence scheduled training: +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) to commence scheduled training: # # ```python # from pytorch_lightning import Trainer -# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# from finetuning_scheduler import FinetuningScheduler # # trainer = Trainer(callbacks=[FinetuningScheduler(ft_schedule="/path/to/my/schedule/my_schedule.yaml")]) # ``` @@ -87,9 +87,9 @@ # ## Early-Stopping and Epoch-Driven Phase Transition Criteria # # -# By default, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) and epoch-driven -# transition criteria are composed. If a ``max_transition_epoch`` is specified for a given phase, the next finetuning phase will begin at that epoch unless [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) criteria are met first. -# If [FinetuningScheduler.epoch_transitions_only](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.epoch_transitions_only) is ``True``, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) will not be used +# By default, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) and epoch-driven +# transition criteria are composed. If a ``max_transition_epoch`` is specified for a given phase, the next finetuning phase will begin at that epoch unless [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) criteria are met first. +# If [FinetuningScheduler.epoch_transitions_only](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler.params.epoch_transitions_only) is ``True``, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) will not be used # and transitions will be exclusively epoch-driven. # # @@ -103,40 +103,40 @@ # # # -# The end-to-end example in this notebook ([Scheduled Finetuning For SuperGLUE](#superglue)) uses [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) in explicit mode to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). -# Please see the [official Finetuning Scheduler documentation](https://finetuning-scheduler.readthedocs.io/en/latest/advanced/finetuning_scheduler.html) if you are interested in a similar [CLI-based example](https://finetuning-scheduler.readthedocs.io/en/latest/advanced/finetuning_scheduler.html#example-scheduled-finetuning-for-superglue) using the LightningCLI. +# The end-to-end example in this notebook ([Scheduled Finetuning For SuperGLUE](#superglue)) uses [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) in explicit mode to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). +# Please see the [official Finetuning Scheduler documentation](https://finetuning-scheduler.readthedocs.io/en/latest/index.html) if you are interested in a similar [CLI-based example](https://finetuning-scheduler.readthedocs.io/en/latest/index.html#scheduled-finetuning-superglue) using the LightningCLI. # %% [markdown] # ## Resuming Scheduled Finetuning Training Sessions # # Resumption of scheduled finetuning training is identical to the continuation of -# [other training sessions](https://pytorch-lightning.readthedocs.io/en/latest/common/trainer.html) with the caveat that the provided checkpoint must have been saved by a [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) session. -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) uses [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint) (an extension of ``ModelCheckpoint``) to maintain schedule state with special metadata. +# [other training sessions](https://pytorch-lightning.readthedocs.io/en/latest/common/trainer.html) with the caveat that the provided checkpoint must have been saved by a [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) session. +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) uses [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) (an extension of ``ModelCheckpoint``) to maintain schedule state with special metadata. # # # ```python # from pytorch_lightning import Trainer -# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# from finetuning_scheduler import FinetuningScheduler # trainer = Trainer(callbacks=[FinetuningScheduler()]) # trainer.fit(..., ckpt_path="some/path/to/my_checkpoint.ckpt") # ``` # # Training will resume at the depth/level of the provided checkpoint according the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. # -# By default ([FinetuningScheduler.restore_best](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html?highlight=restore_best#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.restore_best) is ``True``), [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) will attempt to restore the best available checkpoint before finetuning depth transitions. +# By default ([FinetuningScheduler.restore_best](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=restore_best#finetuning_scheduler.fts.FinetuningScheduler.params.restore_best) is ``True``), [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) will attempt to restore the best available checkpoint before finetuning depth transitions. # # ```python # trainer = Trainer(callbacks=[FinetuningScheduler(new_incarnation_mode=True)]) # trainer.fit(..., ckpt_path="some/path/to/my_kth_best_checkpoint.ckpt") # ``` # -# To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting [FinetuningScheduler.new_incarnation_mode](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html?highlight=new_Incarnation_mode#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.new_incarnation_mode) to +# To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting [FinetuningScheduler.new_incarnation_mode](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=new_Incarnation_mode#finetuning_scheduler.fts.FinetuningScheduler.params.new_incarnation_mode) to # ``True`` as above will re-intialize the checkpoint state with a new best checkpoint at the resumption depth. # %% [markdown] #
# -# **Note:** Currently, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) only supports the following ``StrategyType``s: +# **Note:** Currently, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) supports the following ``StrategyType``s: # # - ``DP`` # - ``DDP`` @@ -151,7 +151,7 @@ # # ## Scheduled Finetuning For SuperGLUE # -# The following example demonstrates the use of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. +# The following example demonstrates the use of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # # %% @@ -183,7 +183,7 @@ def mock_register_module(key: str, require_fqn: bool = False) -> List: if key.lower() == "finetuningscheduler": - mod = import_module("pytorch_lightning.callbacks.finetuning_scheduler") + mod = import_module("finetuning_scheduler") MOCK_REGISTRY.register_classes(mod, pl.callbacks.Callback) else: raise MisconfigurationException(f"user module key '{key}' not found") @@ -457,7 +457,7 @@ def configure_callbacks(self): # %% # Let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it -# Please see the [FinetuningScheduler documentation](https://finetuning-scheduler.readthedocs.io/en/latest/advanced/finetuning_scheduler.html) for a full description of the schedule format +# Please see the [FinetuningScheduler documentation](https://finetuning-scheduler.readthedocs.io/en/latest/index.html) for a full description of the schedule format ft_schedule_yaml = """ @@ -539,8 +539,8 @@ def configure_callbacks(self): # %% [markdown] # ### Callback Configuration # -# The only callback required to invoke the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) is the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) callback itself. -# Default versions of [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint) and [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.html#pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSEarlyStopping) +# The only callback required to invoke the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback itself. +# Default versions of [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) and [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) # (if not specifying ``epoch_only_transitions``) will be included ([as discussed above](#basic_usage)) if not provided # in the callbacks list. For demonstration purposes I'm including example configurations of all three callbacks below. @@ -598,10 +598,10 @@ def train() -> None: # with the LightningCLI. This allows us to avoid managing imports and support more complex configuration separated from # code. # -# Note that we'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping [max_depth](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html?highlight=max_depth#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) for +# Note that we'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping [max_depth](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=max_depth#finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) for # the implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction # of the parameters you'd want to tune for maximum performance. Since the implicit schedule is quite computationally -# intensive and most useful for exploring model behavior, leaving [max_depth](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html?highlight=max_depth#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) 1 allows us to demo implicit mode +# intensive and most useful for exploring model behavior, leaving [max_depth](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=max_depth#finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) 1 allows us to demo implicit mode # behavior while keeping the computational cost and runtime of this notebook reasonable. To review how a full implicit # mode run compares to the ``nofts_baseline`` and ``fts_explicit`` scenarios, please see the the following # [tensorboard experiment summary](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/). @@ -631,7 +631,7 @@ def train() -> None: # ### Reviewing the Training Results # # See the [tensorboard experiment summaries](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/) to get a sense -# of the relative computational and performance tradeoffs associated with these [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) configurations. +# of the relative computational and performance tradeoffs associated with these [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) configurations. # The summary compares a full ``fts_implicit`` execution to ``fts_explicit`` and ``nofts_baseline`` scenarios using DDP # training with 2 GPUs. The full logs/schedules for all three scenarios are available # [here](https://drive.google.com/file/d/1LrUcisRLHeJgh_BDOOD_GUBPp5iHAkoR/view?usp=sharing) and the checkpoints @@ -644,8 +644,8 @@ def train() -> None: # Note there could be around ~1% variation in performance from the tensorboard summaries generated by this notebook # which uses DDP_SPAWN and 1 GPU. # -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) expands the space of possible finetuning schedules and the composition of more sophisticated schedules can -# yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) is to grant +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) expands the space of possible finetuning schedules and the composition of more sophisticated schedules can +# yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is to grant # greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTa-v3's implicit training # run, a critical tuning transition point is immediately apparent: # @@ -654,13 +654,13 @@ def train() -> None: # Our `val_loss` begins a precipitous decline at step 3119 which corresponds to phase 17 in the schedule. Referring to our # schedule, in phase 17 we're beginning tuning the attention parameters of our 10th encoder layer (of 11). Interesting! # Though beyond the scope of this tutorial, it might be worth investigating these dynamics further and -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) allows one to do just that quite easily. +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) allows one to do just that quite easily. # # %% [markdown] # # Note that though this example is intended to capture a common usage scenario, substantial variation is expected # among use cases and models. -# In summary, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.finetuning_scheduler.fts.html#pytorch_lightning.callbacks.finetuning_scheduler.fts.FinetuningScheduler) provides increased finetuning flexibility that can be useful in a variety of +# In summary, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) provides increased finetuning flexibility that can be useful in a variety of # contexts from exploring model tuning behavior to maximizing performance. # %% [markdown] # ## Footnotes From cdc332ad0e82cdfe355a19ca5afa1575df07a93f Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Fri, 18 Feb 2022 13:35:30 -0800 Subject: [PATCH 31/44] update finetuning-scheduler commit sha, simplify notebook dependency with finetuning-scheduler[examples] extra, accommodate acceleratorconnector refactor --- lightning_examples/finetuning-scheduler/.meta.yml | 6 +++--- .../finetuning-scheduler/finetuning-scheduler.py | 13 +++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index f2814d3fa..e2287a647 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -11,9 +11,9 @@ description: | callback and demonstrates the use of it to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/) with iterative early-stopping defined according to a user-specified - schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data - and foundational model weights. + schedule. It uses Hugging Face's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data + and foundational model weights. The required dependencies are installed via the finetuning-scheduler ``[examples]`` extra. requirements: - - git+https://github.com/speediedan/finetuning-scheduler.git@736ae0e481729ca2519fc7abf0d38b7f9ba425fe#egg=finetuning-scheduler[examples] + - git+https://github.com/speediedan/finetuning-scheduler.git@ff8c9f7176de4a10bb3d0d682fef5658b83d9462#egg=finetuning-scheduler[examples] accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 3e6aefb6c..4ff03b8cd 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,13 +1,13 @@ # %% [markdown] # ## Scheduled Finetuning # -# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback expedites and enhances foundational model experimentation with flexible finetuning schedules. +# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback accelerates and enhances model experimentation with flexible finetuning schedules. # -# Training with the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) confers a host of benefits: +# Training with the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is simple and confers a host of benefits: # -# - maximize finetuning flexibility -# - expedite and facilitate exploration of model tuning dynamics in research -# - allow marginal performance improvements of finetuned models +# - it dramatically increases finetuning flexibility +# - expedites and facilitates exploration of model tuning dynamics +# - enables marginal performance improvements of finetuned models # #
# @@ -574,6 +574,7 @@ def train() -> None: enable_progress_bar=enable_progress_bar, max_epochs=100, precision=16, + strategy="dp", accelerator="gpu", devices=1, callbacks=callbacks, @@ -642,7 +643,7 @@ def train() -> None: # [![nofts_baseline](nofts_baseline_accuracy.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6dHJ1ZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) # # Note there could be around ~1% variation in performance from the tensorboard summaries generated by this notebook -# which uses DDP_SPAWN and 1 GPU. +# which uses DP and 1 GPU. # # [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) expands the space of possible finetuning schedules and the composition of more sophisticated schedules can # yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is to grant From 64ef2709e2282cf079f9deb8cb4fa1c12f985561 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Tue, 29 Mar 2022 14:10:40 -0700 Subject: [PATCH 32/44] sync finetuning_scheduler tutorial for pl 1.6.0rc1 --- lightning_examples/finetuning-scheduler/.meta.yml | 3 ++- .../finetuning-scheduler/finetuning-scheduler.py | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index e2287a647..6ad58c5cc 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -14,6 +14,7 @@ description: | schedule. It uses Hugging Face's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and foundational model weights. The required dependencies are installed via the finetuning-scheduler ``[examples]`` extra. requirements: - - git+https://github.com/speediedan/finetuning-scheduler.git@ff8c9f7176de4a10bb3d0d682fef5658b83d9462#egg=finetuning-scheduler[examples] + - git+https://github.com/speediedan/finetuning-scheduler.git@ce4f44acdbb741317370c23ed9c70b131d36540e#egg=finetuning-scheduler[examples] + - git+https://github.com/huggingface/transformers.git@2f4cea0899b0f2c2988f3da30dc89deaf6af7fcb#egg=transformers accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 4ff03b8cd..5e7274cdc 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -26,7 +26,7 @@ # criteria (a multi-phase extension of ``EarlyStopping``), user-specified epoch transitions or a composition of the two (the default mode). # A [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) training session completes when the # final phase of the schedule has its stopping criteria met. See -# the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/extensions/generated/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. +# the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. # # ![FinetuningScheduler explicit loss animation](fts_explicit_loss_anim.gif) @@ -126,12 +126,13 @@ # By default ([FinetuningScheduler.restore_best](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=restore_best#finetuning_scheduler.fts.FinetuningScheduler.params.restore_best) is ``True``), [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) will attempt to restore the best available checkpoint before finetuning depth transitions. # # ```python -# trainer = Trainer(callbacks=[FinetuningScheduler(new_incarnation_mode=True)]) +# trainer = Trainer(callbacks=[FinetuningScheduler()]) # trainer.fit(..., ckpt_path="some/path/to/my_kth_best_checkpoint.ckpt") # ``` # -# To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting [FinetuningScheduler.new_incarnation_mode](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=new_Incarnation_mode#finetuning_scheduler.fts.FinetuningScheduler.params.new_incarnation_mode) to -# ``True`` as above will re-intialize the checkpoint state with a new best checkpoint at the resumption depth. +# Note that similar to the behavior of [ModelCheckpoint](https://pytorch-lightning.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.ModelCheckpoint.html), (specifically [this PR](https://github.com/PyTorchLightning/pytorch-lightning/pull/12045)), +# when resuming training with a different [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) ``dirpath`` from the provided +# checkpoint, the new training session's checkpoint state will be re-initialized at the resumption depth with the provided checkpoint being set as the best checkpoint. # %% [markdown] #
@@ -486,7 +487,7 @@ def configure_callbacks(self): f.write(ft_schedule_yaml) # %% -datasets.set_progress_bar_enabled(False) +datasets.logging.disable_progress_bar() pl.seed_everything(42) dm = RteBoolqDataModule(model_name_or_path="microsoft/deberta-v3-base", tokenizers_parallelism=True) From 7f6c7ffb79ffd99494928babbdc25ca49bca4f46 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Wed, 30 Mar 2022 12:15:32 -0700 Subject: [PATCH 33/44] update commit sha to point to fts with official pl 1.6.0 release --- lightning_examples/finetuning-scheduler/.meta.yml | 4 ++-- .../finetuning-scheduler/finetuning-scheduler.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 6ad58c5cc..64cbf9eea 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -1,7 +1,7 @@ title: Finetuning Scheduler author: "[Dan Dale](https://github.com/speediedan)" created: 2021-11-29 -updated: 2021-11-29 +updated: 2022-03-29 license: CC BY-SA build: 1 tags: @@ -14,7 +14,7 @@ description: | schedule. It uses Hugging Face's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and foundational model weights. The required dependencies are installed via the finetuning-scheduler ``[examples]`` extra. requirements: - - git+https://github.com/speediedan/finetuning-scheduler.git@ce4f44acdbb741317370c23ed9c70b131d36540e#egg=finetuning-scheduler[examples] + - git+https://github.com/speediedan/finetuning-scheduler.git@10d4aa88aae437d9275ba4cea13836c350045900#egg=finetuning-scheduler[examples] - git+https://github.com/huggingface/transformers.git@2f4cea0899b0f2c2988f3da30dc89deaf6af7fcb#egg=transformers accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 5e7274cdc..173344eba 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,3 +1,15 @@ +# --- +# jupyter: +# jupytext: +# cell_metadata_filter: -all +# formats: ipynb,py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.13.7 +# --- + # %% [markdown] # ## Scheduled Finetuning # From 835d15ee94467c02cb8e49991d02e428e9885c21 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Thu, 7 Apr 2022 17:54:39 -0700 Subject: [PATCH 34/44] require only finetuning-scheduler dependency now that it is available on pypi --- lightning_examples/finetuning-scheduler/.meta.yml | 3 +-- .../finetuning-scheduler/finetuning-scheduler.py | 12 ------------ 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 64cbf9eea..552d05fde 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -14,7 +14,6 @@ description: | schedule. It uses Hugging Face's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and foundational model weights. The required dependencies are installed via the finetuning-scheduler ``[examples]`` extra. requirements: - - git+https://github.com/speediedan/finetuning-scheduler.git@10d4aa88aae437d9275ba4cea13836c350045900#egg=finetuning-scheduler[examples] - - git+https://github.com/huggingface/transformers.git@2f4cea0899b0f2c2988f3da30dc89deaf6af7fcb#egg=transformers + - finetuning-scheduler[examples] accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 173344eba..5e7274cdc 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,15 +1,3 @@ -# --- -# jupyter: -# jupytext: -# cell_metadata_filter: -all -# formats: ipynb,py:percent -# text_representation: -# extension: .py -# format_name: percent -# format_version: '1.3' -# jupytext_version: 1.13.7 -# --- - # %% [markdown] # ## Scheduled Finetuning # From f6ec983db1729dec42dce9f0f2fb0d0ae081f527 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Mon, 18 Apr 2022 13:36:52 -0700 Subject: [PATCH 35/44] update fts documentation to point to stable version (0.1.1) --- .../finetuning-scheduler/.meta.yml | 2 +- .../finetuning-scheduler.py | 80 +++++++++++-------- 2 files changed, 47 insertions(+), 35 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 552d05fde..d4f6e477a 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -7,7 +7,7 @@ build: 1 tags: - finetuning description: | - This notebook introduces the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) + This notebook introduces the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback and demonstrates the use of it to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/) with iterative early-stopping defined according to a user-specified diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 5e7274cdc..cf4e6f959 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,9 +1,21 @@ +# --- +# jupyter: +# jupytext: +# cell_metadata_filter: -all +# formats: ipynb,py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.13.8 +# --- + # %% [markdown] # ## Scheduled Finetuning # -# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback accelerates and enhances model experimentation with flexible finetuning schedules. +# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback accelerates and enhances model experimentation with flexible finetuning schedules. # -# Training with the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is simple and confers a host of benefits: +# Training with the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is simple and confers a host of benefits: # # - it dramatically increases finetuning flexibility # - expedites and facilitates exploration of model tuning dynamics @@ -11,7 +23,7 @@ # #
# -# Fundamentally, the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback enables scheduled, multi-phase, +# Fundamentally, the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback enables scheduled, multi-phase, # finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize # foundational model knowledge retention while allowing (typically upper layers of) the model to # optimally adapt to new tasks during transfer learning [1, 2, 3](#f1) @@ -19,14 +31,14 @@ # #
# -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) orchestrates the gradual unfreezing +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) orchestrates the gradual unfreezing # of models via a finetuning schedule that is either implicitly generated (the default) or explicitly provided by the user # (more computationally efficient). Finetuning phase transitions are driven by -# [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) +# [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) # criteria (a multi-phase extension of ``EarlyStopping``), user-specified epoch transitions or a composition of the two (the default mode). -# A [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) training session completes when the +# A [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) training session completes when the # final phase of the schedule has its stopping criteria met. See -# the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. +# the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/stable/api/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. # # ![FinetuningScheduler explicit loss animation](fts_explicit_loss_anim.gif) @@ -36,9 +48,9 @@ # #
# -# If no finetuning schedule is provided by the user, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) will generate a +# If no finetuning schedule is provided by the user, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) will generate a # [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, -# using default [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) and [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) callbacks with ``monitor=val_loss``. +# using default [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) and [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) callbacks with ``monitor=val_loss``. # #
# @@ -51,9 +63,9 @@ # %% [markdown] # ## The Default Finetuning Schedule # -# Schedule definition is facilitated via the [gen_ft_schedule](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.SchedulingMixin.gen_ft_schedule) method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as +# Schedule definition is facilitated via the [gen_ft_schedule](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.SchedulingMixin.gen_ft_schedule) method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as # desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will likely be less computationally efficient than a user-defined finetuning schedule but is useful for exploring a model's finetuning behavior and can serve as a good baseline for subsquent explicit schedule refinement. -# While the current version of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) only supports single optimizer and (optional) lr_scheduler configurations, per-phase maximum learning rates can be set as demonstrated in the next section. +# While the current version of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) only supports single optimizer and (optional) lr_scheduler configurations, per-phase maximum learning rates can be set as demonstrated in the next section. # %% [markdown] # ## Specifying a Finetuning Schedule @@ -74,7 +86,7 @@ # ![side_by_side_yaml](side_by_side_yaml.png) # # 3. Once the finetuning schedule has been altered as desired, pass it to -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) to commence scheduled training: +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) to commence scheduled training: # # ```python # from pytorch_lightning import Trainer @@ -87,9 +99,9 @@ # ## Early-Stopping and Epoch-Driven Phase Transition Criteria # # -# By default, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) and epoch-driven -# transition criteria are composed. If a ``max_transition_epoch`` is specified for a given phase, the next finetuning phase will begin at that epoch unless [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) criteria are met first. -# If [FinetuningScheduler.epoch_transitions_only](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler.params.epoch_transitions_only) is ``True``, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) will not be used +# By default, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) and epoch-driven +# transition criteria are composed. If a ``max_transition_epoch`` is specified for a given phase, the next finetuning phase will begin at that epoch unless [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) criteria are met first. +# If [FinetuningScheduler.epoch_transitions_only](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler.params.epoch_transitions_only) is ``True``, [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) will not be used # and transitions will be exclusively epoch-driven. # # @@ -103,15 +115,15 @@ # # # -# The end-to-end example in this notebook ([Scheduled Finetuning For SuperGLUE](#superglue)) uses [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) in explicit mode to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). -# Please see the [official Finetuning Scheduler documentation](https://finetuning-scheduler.readthedocs.io/en/latest/index.html) if you are interested in a similar [CLI-based example](https://finetuning-scheduler.readthedocs.io/en/latest/index.html#scheduled-finetuning-superglue) using the LightningCLI. +# The end-to-end example in this notebook ([Scheduled Finetuning For SuperGLUE](#superglue)) uses [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) in explicit mode to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). +# Please see the [official Finetuning Scheduler documentation](https://finetuning-scheduler.readthedocs.io/en/stable/index.html) if you are interested in a similar [CLI-based example](https://finetuning-scheduler.readthedocs.io/en/stable/index.html#scheduled-finetuning-superglue) using the LightningCLI. # %% [markdown] # ## Resuming Scheduled Finetuning Training Sessions # # Resumption of scheduled finetuning training is identical to the continuation of -# [other training sessions](https://pytorch-lightning.readthedocs.io/en/latest/common/trainer.html) with the caveat that the provided checkpoint must have been saved by a [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) session. -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) uses [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) (an extension of ``ModelCheckpoint``) to maintain schedule state with special metadata. +# [other training sessions](https://pytorch-lightning.readthedocs.io/en/stable/common/trainer.html) with the caveat that the provided checkpoint must have been saved by a [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) session. +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) uses [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) (an extension of ``ModelCheckpoint``) to maintain schedule state with special metadata. # # # ```python @@ -123,21 +135,21 @@ # # Training will resume at the depth/level of the provided checkpoint according the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. # -# By default ([FinetuningScheduler.restore_best](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=restore_best#finetuning_scheduler.fts.FinetuningScheduler.params.restore_best) is ``True``), [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) will attempt to restore the best available checkpoint before finetuning depth transitions. +# By default ([FinetuningScheduler.restore_best](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html?highlight=restore_best#finetuning_scheduler.fts.FinetuningScheduler.params.restore_best) is ``True``), [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) will attempt to restore the best available checkpoint before finetuning depth transitions. # # ```python # trainer = Trainer(callbacks=[FinetuningScheduler()]) # trainer.fit(..., ckpt_path="some/path/to/my_kth_best_checkpoint.ckpt") # ``` # -# Note that similar to the behavior of [ModelCheckpoint](https://pytorch-lightning.readthedocs.io/en/latest/api/pytorch_lightning.callbacks.ModelCheckpoint.html), (specifically [this PR](https://github.com/PyTorchLightning/pytorch-lightning/pull/12045)), -# when resuming training with a different [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) ``dirpath`` from the provided +# Note that similar to the behavior of [ModelCheckpoint](https://pytorch-lightning.readthedocs.io/en/stable/api/pytorch_lightning.callbacks.ModelCheckpoint.html), (specifically [this PR](https://github.com/PyTorchLightning/pytorch-lightning/pull/12045)), +# when resuming training with a different [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) ``dirpath`` from the provided # checkpoint, the new training session's checkpoint state will be re-initialized at the resumption depth with the provided checkpoint being set as the best checkpoint. # %% [markdown] #
# -# **Note:** Currently, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) supports the following ``StrategyType``s: +# **Note:** Currently, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) supports the following ``StrategyType``s: # # - ``DP`` # - ``DDP`` @@ -152,7 +164,7 @@ # # ## Scheduled Finetuning For SuperGLUE # -# The following example demonstrates the use of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. +# The following example demonstrates the use of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # # %% @@ -458,7 +470,7 @@ def configure_callbacks(self): # %% # Let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it -# Please see the [FinetuningScheduler documentation](https://finetuning-scheduler.readthedocs.io/en/latest/index.html) for a full description of the schedule format +# Please see the [FinetuningScheduler documentation](https://finetuning-scheduler.readthedocs.io/en/stable/index.html) for a full description of the schedule format ft_schedule_yaml = """ @@ -540,8 +552,8 @@ def configure_callbacks(self): # %% [markdown] # ### Callback Configuration # -# The only callback required to invoke the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback itself. -# Default versions of [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) and [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) +# The only callback required to invoke the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback itself. +# Default versions of [FTSCheckpoint](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSCheckpoint) and [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) # (if not specifying ``epoch_only_transitions``) will be included ([as discussed above](#basic_usage)) if not provided # in the callbacks list. For demonstration purposes I'm including example configurations of all three callbacks below. @@ -600,10 +612,10 @@ def train() -> None: # with the LightningCLI. This allows us to avoid managing imports and support more complex configuration separated from # code. # -# Note that we'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping [max_depth](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=max_depth#finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) for +# Note that we'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping [max_depth](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html?highlight=max_depth#finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) for # the implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction # of the parameters you'd want to tune for maximum performance. Since the implicit schedule is quite computationally -# intensive and most useful for exploring model behavior, leaving [max_depth](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html?highlight=max_depth#finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) 1 allows us to demo implicit mode +# intensive and most useful for exploring model behavior, leaving [max_depth](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html?highlight=max_depth#finetuning_scheduler.fts.FinetuningScheduler.params.max_depth) 1 allows us to demo implicit mode # behavior while keeping the computational cost and runtime of this notebook reasonable. To review how a full implicit # mode run compares to the ``nofts_baseline`` and ``fts_explicit`` scenarios, please see the the following # [tensorboard experiment summary](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/). @@ -633,7 +645,7 @@ def train() -> None: # ### Reviewing the Training Results # # See the [tensorboard experiment summaries](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/) to get a sense -# of the relative computational and performance tradeoffs associated with these [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) configurations. +# of the relative computational and performance tradeoffs associated with these [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) configurations. # The summary compares a full ``fts_implicit`` execution to ``fts_explicit`` and ``nofts_baseline`` scenarios using DDP # training with 2 GPUs. The full logs/schedules for all three scenarios are available # [here](https://drive.google.com/file/d/1LrUcisRLHeJgh_BDOOD_GUBPp5iHAkoR/view?usp=sharing) and the checkpoints @@ -646,8 +658,8 @@ def train() -> None: # Note there could be around ~1% variation in performance from the tensorboard summaries generated by this notebook # which uses DP and 1 GPU. # -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) expands the space of possible finetuning schedules and the composition of more sophisticated schedules can -# yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is to grant +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) expands the space of possible finetuning schedules and the composition of more sophisticated schedules can +# yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is to grant # greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTa-v3's implicit training # run, a critical tuning transition point is immediately apparent: # @@ -656,13 +668,13 @@ def train() -> None: # Our `val_loss` begins a precipitous decline at step 3119 which corresponds to phase 17 in the schedule. Referring to our # schedule, in phase 17 we're beginning tuning the attention parameters of our 10th encoder layer (of 11). Interesting! # Though beyond the scope of this tutorial, it might be worth investigating these dynamics further and -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) allows one to do just that quite easily. +# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) allows one to do just that quite easily. # # %% [markdown] # # Note that though this example is intended to capture a common usage scenario, substantial variation is expected # among use cases and models. -# In summary, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/latest/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) provides increased finetuning flexibility that can be useful in a variety of +# In summary, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) provides increased finetuning flexibility that can be useful in a variety of # contexts from exploring model tuning behavior to maximizing performance. # %% [markdown] # ## Footnotes From e7c3838ec8099485ce6a9c8d8603fe496cf8e1a9 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Tue, 19 Apr 2022 14:01:01 -0700 Subject: [PATCH 36/44] implement workaround for cuda toolkit build difference of torch and torchvision in CI that was resulting in a segfault triggered by sentencepiece upon pytorch_lightning import --- lightning_examples/finetuning-scheduler/.meta.yml | 2 +- .../finetuning-scheduler/finetuning-scheduler.py | 13 +------------ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index d4f6e477a..2461fdae0 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -3,7 +3,7 @@ author: "[Dan Dale](https://github.com/speediedan)" created: 2021-11-29 updated: 2022-03-29 license: CC BY-SA -build: 1 +build: 2 tags: - finetuning description: | diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index cf4e6f959..0148cbd67 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,15 +1,3 @@ -# --- -# jupyter: -# jupytext: -# cell_metadata_filter: -all -# formats: ipynb,py:percent -# text_representation: -# extension: .py -# format_name: percent -# format_version: '1.3' -# jupytext_version: 1.13.8 -# --- - # %% [markdown] # ## Scheduled Finetuning # @@ -176,6 +164,7 @@ import datasets import pytorch_lightning as pl +import sentencepiece as sp # noqa:F401 import torch from pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint from pytorch_lightning.loggers.tensorboard import TensorBoardLogger From 4e0715e8eea6a7918d46be55afddea4f8b36015b Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Tue, 19 Apr 2022 14:58:37 -0700 Subject: [PATCH 37/44] isort skip directive required to implement sentencepiece workaround --- .../finetuning-scheduler/finetuning-scheduler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 0148cbd67..f137f106e 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -163,8 +163,9 @@ from typing import Any, Dict, List, Optional import datasets + +import sentencepiece as sp # noqa: F401 # isort: split import pytorch_lightning as pl -import sentencepiece as sp # noqa:F401 import torch from pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint from pytorch_lightning.loggers.tensorboard import TensorBoardLogger From 31d3cb26e43bbdc4b36ba2df8d927994d555f31a Mon Sep 17 00:00:00 2001 From: Dan Dale Date: Thu, 21 Apr 2022 10:08:32 -0700 Subject: [PATCH 38/44] update broken gan/datamodules tutorial links (#164) * update both datamodules and basic-gan tutorials to reference stable doc version --- lightning_examples/basic-gan/gan.py | 2 +- lightning_examples/datamodules/.meta.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lightning_examples/basic-gan/gan.py b/lightning_examples/basic-gan/gan.py index 251f68284..f0b984f30 100644 --- a/lightning_examples/basic-gan/gan.py +++ b/lightning_examples/basic-gan/gan.py @@ -20,7 +20,7 @@ # ### MNIST DataModule # # Below, we define a DataModule for the MNIST Dataset. To learn more about DataModules, check out our tutorial -# on them or see the [latest docs](https://pytorch-lightning.readthedocs.io/en/latest/extensions/datamodules.html). +# on them or see the [latest docs](https://pytorch-lightning.readthedocs.io/en/stable/extensions/datamodules.html). # %% diff --git a/lightning_examples/datamodules/.meta.yml b/lightning_examples/datamodules/.meta.yml index c53dcbcea..93a86ce8a 100644 --- a/lightning_examples/datamodules/.meta.yml +++ b/lightning_examples/datamodules/.meta.yml @@ -7,7 +7,7 @@ build: 3 description: This notebook will walk you through how to start using Datamodules. With the release of `pytorch-lightning` version 0.9.0, we have included a new class called `LightningDataModule` to help you decouple data related hooks from your `LightningModule`. - The most up to date documentation on datamodules can be found + The most up-to-date documentation on datamodules can be found [here](https://pytorch-lightning.readthedocs.io/en/stable/extensions/datamodules.html). requirements: - torchvision From d4e36786fa1d2ceeb0cde2e69218ee218ea2dac3 Mon Sep 17 00:00:00 2001 From: Dan Dale Date: Tue, 10 May 2022 13:10:28 -0700 Subject: [PATCH 39/44] Apply suggestions from code review a few excellent suggestions/cleanup from review Co-authored-by: Rohit Gupta --- .../finetuning-scheduler.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index f137f106e..d2f10623a 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -52,7 +52,7 @@ # ## The Default Finetuning Schedule # # Schedule definition is facilitated via the [gen_ft_schedule](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.SchedulingMixin.gen_ft_schedule) method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as -# desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will likely be less computationally efficient than a user-defined finetuning schedule but is useful for exploring a model's finetuning behavior and can serve as a good baseline for subsquent explicit schedule refinement. +# desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will likely be less computationally efficient than a user-defined finetuning schedule but is useful for exploring a model's finetuning behavior and can serve as a good baseline for subsequent explicit schedule refinement. # While the current version of [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) only supports single optimizer and (optional) lr_scheduler configurations, per-phase maximum learning rates can be set as demonstrated in the next section. # %% [markdown] @@ -121,7 +121,7 @@ # trainer.fit(..., ckpt_path="some/path/to/my_checkpoint.ckpt") # ``` # -# Training will resume at the depth/level of the provided checkpoint according the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. +# Training will resume at the depth/level of the provided checkpoint according to the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. # # By default ([FinetuningScheduler.restore_best](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html?highlight=restore_best#finetuning_scheduler.fts.FinetuningScheduler.params.restore_best) is ``True``), [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) will attempt to restore the best available checkpoint before finetuning depth transitions. # @@ -205,7 +205,6 @@ def mock_register_module(key: str, require_fqn: bool = False) -> List: # Load the `FinetuningScheduler` PyTorch Lightning extension module we want to use. This will import all necessary callbacks. mock_register_module("finetuningscheduler") # set notebook-level variables -AVAIL_GPUS = torch.cuda.device_count() TASK_NUM_LABELS = {"boolq": 2, "rte": 2} DEFAULT_TASK = "rte" @@ -241,7 +240,7 @@ def __init__( tokenizers_parallelism: bool = True, **dataloader_kwargs: Any, ): - """Initialize this ``LightningDataModule`` designed for both the RTE or BoolQ SuperGLUE Hugging Face + """Initialize the ``LightningDataModule`` designed for both the RTE or BoolQ SuperGLUE Hugging Face datasets. Args: @@ -258,6 +257,7 @@ def __init__( train_batch_size (int, optional): Training batch size. Defaults to 16. eval_batch_size (int, optional): Batch size to use for validation and testing splits. Defaults to 16. tokenizers_parallelism (bool, optional): Whether to use parallelism in the tokenizer. Defaults to True. + \**dataloader_kwargs: Arguments passed when initializing the dataloader """ super().__init__() self.model_name_or_path = model_name_or_path @@ -355,7 +355,7 @@ def __init__( self.task_name = task_name else: self.task_name = DEFAULT_TASK - rank_zero_warn(f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'") + rank_zero_warn(f"Invalid task_name {task_name!r}. Proceeding with the default task: {DEFAULT_TASK!r}") self.num_labels = TASK_NUM_LABELS[self.task_name] self.experiment_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}" self.model_cfg = model_cfg or {} @@ -381,7 +381,7 @@ def forward(self, **inputs): def training_step(self, batch, batch_idx): outputs = self(**batch) loss = outputs[0] - self.log("train_loss", loss, prog_bar=True) + self.log("train_loss", loss) return loss def training_epoch_end(self, outputs: List[Any]) -> None: @@ -433,7 +433,7 @@ def configure_optimizers(self): # not applied to the bias parameter (for completeness, in this case it won't make much # performance difference) optimizer = AdamW(params=self._init_param_groups(), **self.optimizer_init) - scheduler = {"scheduler": CosineAnnealingWarmRestarts(optimizer, **self.lr_scheduler_init)} + scheduler = {"scheduler": CosineAnnealingWarmRestarts(optimizer, **self.lr_scheduler_init), "interval": "step"} return [optimizer], [scheduler] def configure_callbacks(self): @@ -577,9 +577,8 @@ def train() -> None: enable_progress_bar=enable_progress_bar, max_epochs=100, precision=16, - strategy="dp", - accelerator="gpu", - devices=1, + accelerator="auto", + devices=1 if torch.cuda.is_available() else None callbacks=callbacks, logger=logger, ) From be5810f62280df8ba1b1e840092d571164f487e7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 10 May 2022 20:10:46 +0000 Subject: [PATCH 40/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- lightning_examples/finetuning-scheduler/finetuning-scheduler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index d2f10623a..c2c6019c7 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -240,7 +240,7 @@ def __init__( tokenizers_parallelism: bool = True, **dataloader_kwargs: Any, ): - """Initialize the ``LightningDataModule`` designed for both the RTE or BoolQ SuperGLUE Hugging Face + r"""Initialize the ``LightningDataModule`` designed for both the RTE or BoolQ SuperGLUE Hugging Face datasets. Args: From d1505880f4c4d8b315cfdb9bef233dda24b5bae2 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Tue, 10 May 2022 15:05:36 -0700 Subject: [PATCH 41/44] additional clarification of documentation and minor cleanup pre-publish --- .../finetuning-scheduler.py | 111 +++++++++--------- .../finetuning-scheduler/logo_fts.png | Bin 0 -> 7798 bytes 2 files changed, 57 insertions(+), 54 deletions(-) create mode 100644 lightning_examples/finetuning-scheduler/logo_fts.png diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index c2c6019c7..3e829b451 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,29 +1,37 @@ # %% [markdown] -# ## Scheduled Finetuning +# ## Scheduled Finetuning with the Finetuning Scheduler Extension # -# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback accelerates and enhances model experimentation with flexible finetuning schedules. +# ![Finetuning Scheduler logo](logo_fts.png) # -# Training with the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) is simple and confers a host of benefits: +# The [Finetuning Scheduler](https://finetuning-scheduler.readthedocs.io/en/stable/index.html) extension accelerates and enhances model experimentation with flexible finetuning schedules. +# +# Training with the extension is simple and confers a host of benefits: # # - it dramatically increases finetuning flexibility # - expedites and facilitates exploration of model tuning dynamics # - enables marginal performance improvements of finetuned models # +# Setup is straightforward, just install from PyPI! Since this notebook-based example requires a few additional packages (e.g. +# ``transformers``, ``sentencepiece``), we installed the ``finetuning-scheduler`` package with the ``[examples]`` extra above. +# Once the ``finetuning-scheduler`` package is installed, the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback is available for use with PyTorch Lightning. +# For additional installation options, please see the Finetuning Scheduler [README](https://github.com/speediedan/finetuning-scheduler/blob/main/README.md). +# +# +# #
# -# Fundamentally, the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback enables scheduled, multi-phase, -# finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize +# Fundamentally, [Finetuning Scheduler](https://finetuning-scheduler.readthedocs.io/en/stable/index.html) enables +# scheduled, multi-phase, finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize # foundational model knowledge retention while allowing (typically upper layers of) the model to # optimally adapt to new tasks during transfer learning [1, 2, 3](#f1) # -# #
# -# [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) orchestrates the gradual unfreezing +# The [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) callback orchestrates the gradual unfreezing # of models via a finetuning schedule that is either implicitly generated (the default) or explicitly provided by the user # (more computationally efficient). Finetuning phase transitions are driven by # [FTSEarlyStopping](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts_supporters.html#finetuning_scheduler.fts_supporters.FTSEarlyStopping) -# criteria (a multi-phase extension of ``EarlyStopping``), user-specified epoch transitions or a composition of the two (the default mode). +# criteria (a multi-phase extension of ``EarlyStopping`` packaged with FinetuningScheduler), user-specified epoch transitions or a composition of the two (the default mode). # A [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) training session completes when the # final phase of the schedule has its stopping criteria met. See # the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/stable/api/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. @@ -260,30 +268,27 @@ def __init__( \**dataloader_kwargs: Arguments passed when initializing the dataloader """ super().__init__() - self.model_name_or_path = model_name_or_path - self.task_name = task_name if task_name in TASK_NUM_LABELS.keys() else DEFAULT_TASK - self.max_seq_length = max_seq_length - self.train_batch_size = train_batch_size - self.eval_batch_size = eval_batch_size - self.tokenizers_parallelism = tokenizers_parallelism + task_name = task_name if task_name in TASK_NUM_LABELS.keys() else DEFAULT_TASK + self.text_fields = self.TASK_TEXT_FIELD_MAP[task_name] self.dataloader_kwargs = { "num_workers": dataloader_kwargs.get("num_workers", 0), "pin_memory": dataloader_kwargs.get("pin_memory", False), } - self.text_fields = self.TASK_TEXT_FIELD_MAP[self.task_name] - self.num_labels = TASK_NUM_LABELS[self.task_name] - os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.tokenizers_parallelism else "false" - self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True, local_files_only=False) + self.save_hyperparameters() + os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.hparams.tokenizers_parallelism else "false" + self.tokenizer = AutoTokenizer.from_pretrained( + self.hparams.model_name_or_path, use_fast=True, local_files_only=False + ) def prepare_data(self): """Load the SuperGLUE dataset.""" # N.B. PL calls prepare_data from a single process (rank 0) so do not use it to assign # state (e.g. self.x=y) - datasets.load_dataset("super_glue", self.task_name) + datasets.load_dataset("super_glue", self.hparams.task_name) def setup(self, stage): - """Setup our dataset splits for training/validation/testing.""" - self.dataset = datasets.load_dataset("super_glue", self.task_name) + """Setup our dataset splits for training/validation.""" + self.dataset = datasets.load_dataset("super_glue", self.hparams.task_name) for split in self.dataset.keys(): self.dataset[split] = self.dataset[split].map( self._convert_to_features, batched=True, remove_columns=["label"] @@ -294,15 +299,12 @@ def setup(self, stage): self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] def train_dataloader(self): - return DataLoader(self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs) + return DataLoader(self.dataset["train"], batch_size=self.hparams.train_batch_size, **self.dataloader_kwargs) def val_dataloader(self): - return DataLoader(self.dataset["validation"], batch_size=self.eval_batch_size, **self.dataloader_kwargs) - - def test_dataloader(self): - return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs) + return DataLoader(self.dataset["validation"], batch_size=self.hparams.eval_batch_size, **self.dataloader_kwargs) - def _convert_to_features(self, example_batch) -> BatchEncoding: + def _convert_to_features(self, example_batch: datasets.arrow_dataset.Batch) -> BatchEncoding: """Convert raw text examples to a :class:`~transformers.tokenization_utils_base.BatchEncoding` container (derived from python dict) of features that includes helpful methods for translating between word/character space and token space. @@ -316,7 +318,7 @@ def _convert_to_features(self, example_batch) -> BatchEncoding: text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) # Tokenize the text/text pairs features = self.tokenizer.batch_encode_plus( - text_pairs, max_length=self.max_seq_length, padding="longest", truncation=True + text_pairs, max_length=self.hparams.max_seq_length, padding="longest", truncation=True ) # Rename label to labels to make it easier to pass to model forward features["labels"] = example_batch["label"] @@ -349,31 +351,32 @@ def __init__( "default". """ super().__init__() - self.optimizer_init = optimizer_init - self.lr_scheduler_init = lr_scheduler_init - if task_name in TASK_NUM_LABELS.keys(): - self.task_name = task_name - else: - self.task_name = DEFAULT_TASK + if task_name not in TASK_NUM_LABELS.keys(): rank_zero_warn(f"Invalid task_name {task_name!r}. Proceeding with the default task: {DEFAULT_TASK!r}") - self.num_labels = TASK_NUM_LABELS[self.task_name] - self.experiment_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}" + task_name = DEFAULT_TASK + self.num_labels = TASK_NUM_LABELS[task_name] self.model_cfg = model_cfg or {} conf = AutoConfig.from_pretrained(model_name_or_path, num_labels=self.num_labels, local_files_only=False) self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=conf) self.model.config.update(self.model_cfg) # apply model config overrides self.init_hparams = { - "optimizer": self.optimizer_init, - "lr_scheduler": self.lr_scheduler_init, + "optimizer_init": optimizer_init, + "lr_scheduler_init": lr_scheduler_init, "model_config": self.model.config, "model_name_or_path": model_name_or_path, - "task_name": self.task_name, - "experiment_id": self.experiment_id, + "task_name": task_name, + "experiment_id": f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}", } self.save_hyperparameters(self.init_hparams) - self.metric = datasets.load_metric("super_glue", self.task_name, experiment_id=self.experiment_id) + self.metric = datasets.load_metric( + "super_glue", self.hparams.task_name, experiment_id=self.hparams.experiment_id + ) self.no_decay = ["bias", "LayerNorm.weight"] - self.finetuningscheduler_callback = None + + @property + def finetuningscheduler_callback(self) -> FinetuningScheduler: # type: ignore # noqa + fts = [c for c in self.trainer.callbacks if isinstance(c, FinetuningScheduler)] # type: ignore # noqa + return fts[0] if fts else None def forward(self, **inputs): return self.model(**inputs) @@ -414,7 +417,7 @@ def _init_param_groups(self) -> List[Dict]: for n, p in self.model.named_parameters() if not any(nd in n for nd in self.no_decay) and p.requires_grad ], - "weight_decay": self.optimizer_init["weight_decay"], + "weight_decay": self.hparams.optimizer_init["weight_decay"], }, { "params": [ @@ -432,16 +435,13 @@ def configure_optimizers(self): # but in this case we pass a list of parameter groups to ensure weight_decay is # not applied to the bias parameter (for completeness, in this case it won't make much # performance difference) - optimizer = AdamW(params=self._init_param_groups(), **self.optimizer_init) - scheduler = {"scheduler": CosineAnnealingWarmRestarts(optimizer, **self.lr_scheduler_init), "interval": "step"} + optimizer = AdamW(params=self._init_param_groups(), **self.hparams.optimizer_init) + scheduler = { + "scheduler": CosineAnnealingWarmRestarts(optimizer, **self.hparams.lr_scheduler_init), + "interval": "step", + } return [optimizer], [scheduler] - def configure_callbacks(self): - found_fts = [c for c in self.trainer.callbacks if isinstance(c, FinetuningScheduler)] # type: ignore # noqa - if found_fts: - self.finetuningscheduler_callback = found_fts[0] - return super().configure_callbacks() - # %% [markdown] # ### Our Training Sessions @@ -578,14 +578,14 @@ def train() -> None: max_epochs=100, precision=16, accelerator="auto", - devices=1 if torch.cuda.is_available() else None + devices=1 if torch.cuda.is_available() else None, callbacks=callbacks, logger=logger, ) trainer.fit(model, datamodule=dm) -if AVAIL_GPUS > 0: +if torch.cuda.is_available(): train() else: print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") @@ -620,7 +620,7 @@ def train() -> None: scenario_callbacks = {"nofts_baseline": nofts_callbacks, "fts_implicit": fts_implicit_callbacks} # %% -if AVAIL_GPUS > 0: +if torch.cuda.is_available(): for scenario_name, scenario_callbacks in scenario_callbacks.items(): model = RteBoolqModule(**lightning_module_kwargs, experiment_tag=scenario_name) logger = TensorBoardLogger("lightning_logs", name=scenario_name) @@ -709,3 +709,6 @@ def train() -> None: # # # + +# %% [markdown] +# diff --git a/lightning_examples/finetuning-scheduler/logo_fts.png b/lightning_examples/finetuning-scheduler/logo_fts.png new file mode 100644 index 0000000000000000000000000000000000000000..00599a54ddb97acfae0f0b4eaeb9dfb9989376eb GIT binary patch literal 7798 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 IM6N<$f@H Date: Tue, 10 May 2022 15:45:43 -0700 Subject: [PATCH 42/44] metadata and aesthetic image improvements --- .../finetuning-scheduler/.meta.yml | 8 +++---- .../finetuning-scheduler.py | 24 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 2461fdae0..3cae7999e 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -1,14 +1,14 @@ title: Finetuning Scheduler author: "[Dan Dale](https://github.com/speediedan)" created: 2021-11-29 -updated: 2022-03-29 +updated: 2022-05-10 license: CC BY-SA -build: 2 +build: 3 tags: - finetuning description: | - This notebook introduces the [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) - callback and demonstrates the use of it to finetune a small foundational model on the + This notebook introduces the [Finetuning Scheduler](https://finetuning-scheduler.readthedocs.io/en/stable/index.html) extension + and demonstrates the use of it to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/) with iterative early-stopping defined according to a user-specified schedule. It uses Hugging Face's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 3e829b451..0c0fb5b81 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,7 +1,7 @@ # %% [markdown] # ## Scheduled Finetuning with the Finetuning Scheduler Extension # -# ![Finetuning Scheduler logo](logo_fts.png) +# ![Finetuning Scheduler logo](logo_fts.png){height="58px" width="401px"} # # The [Finetuning Scheduler](https://finetuning-scheduler.readthedocs.io/en/stable/index.html) extension accelerates and enhances model experimentation with flexible finetuning schedules. # @@ -36,7 +36,7 @@ # final phase of the schedule has its stopping criteria met. See # the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/stable/api/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. # -# ![FinetuningScheduler explicit loss animation](fts_explicit_loss_anim.gif) +# ![FinetuningScheduler explicit loss animation](fts_explicit_loss_anim.gif){height="272px" width="376px"} # %% [markdown] # @@ -79,7 +79,7 @@ # # 2. Alter the schedule as desired. # -# ![side_by_side_yaml](side_by_side_yaml.png) +# ![side_by_side_yaml](side_by_side_yaml.png){height="327px" width="800px"} # # 3. Once the finetuning schedule has been altered as desired, pass it to # [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) to commence scheduled training: @@ -105,7 +105,7 @@ # # **Tip:** Use of regex expressions can be convenient for specifying more complex schedules. Also, a per-phase base maximum lr can be specified: # -# ![emphasized_yaml](emphasized_yaml.png) +# ![emphasized_yaml](emphasized_yaml.png){height="380px" width="800px"} # #
# @@ -145,7 +145,7 @@ # %% [markdown] #
# -# **Note:** Currently, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) supports the following ``StrategyType``s: +# **Note:** Currently, [FinetuningScheduler](https://finetuning-scheduler.readthedocs.io/en/stable/api/finetuning_scheduler.fts.html#finetuning_scheduler.fts.FinetuningScheduler) supports the following strategy types: # # - ``DP`` # - ``DDP`` @@ -588,7 +588,9 @@ def train() -> None: if torch.cuda.is_available(): train() else: - print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") + print( + "Given the computation associated w/ the multiple phases of finetuning demonstrated, this notebook is best used with a GPU" + ) # %% [markdown] # ### Running the Baseline and Implicit Finetuning Scenarios @@ -628,7 +630,9 @@ def train() -> None: print(f"Beginning training the '{scenario_name}' scenario") train() else: - print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") + print( + "Given the computation associated w/ the multiple phases of finetuning demonstrated, this notebook is best used with a GPU" + ) # %% [markdown] # ### Reviewing the Training Results @@ -641,8 +645,8 @@ def train() -> None: # produced in the scenarios [here](https://drive.google.com/file/d/1t7myBgcqcZ9ax_IT9QVk-vFH_l_o5UXB/view?usp=sharing) # (caution, ~3.5GB). # -# [![fts_explicit_accuracy](fts_explicit_accuracy.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOnRydWUsIm5vZnRzX2Jhc2VsaW5lIjpmYWxzZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) -# [![nofts_baseline](nofts_baseline_accuracy.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6dHJ1ZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) +# [![fts_explicit_accuracy](fts_explicit_accuracy.png){height="315px" width="492px"}](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOnRydWUsIm5vZnRzX2Jhc2VsaW5lIjpmYWxzZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) +# [![nofts_baseline](nofts_baseline_accuracy.png){height="316px" width="505px"}](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6dHJ1ZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) # # Note there could be around ~1% variation in performance from the tensorboard summaries generated by this notebook # which uses DP and 1 GPU. @@ -652,7 +656,7 @@ def train() -> None: # greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTa-v3's implicit training # run, a critical tuning transition point is immediately apparent: # -# [![implicit_training_transition](implicit_training_transition.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6ZmFsc2UsImZ0c19pbXBsaWNpdCI6dHJ1ZX0%3D) +# [![implicit_training_transition](implicit_training_transition.png){height="272px" width="494px"}](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6ZmFsc2UsImZ0c19pbXBsaWNpdCI6dHJ1ZX0%3D) # # Our `val_loss` begins a precipitous decline at step 3119 which corresponds to phase 17 in the schedule. Referring to our # schedule, in phase 17 we're beginning tuning the attention parameters of our 10th encoder layer (of 11). Interesting! From 3cecc757d7dc40b7a364a21fa73aaaf204fff9a2 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Wed, 11 May 2022 09:53:43 -0700 Subject: [PATCH 43/44] make notebook accelerator agnostic --- .../finetuning-scheduler.py | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 0c0fb5b81..9d6316332 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -585,12 +585,10 @@ def train() -> None: trainer.fit(model, datamodule=dm) -if torch.cuda.is_available(): - train() -else: - print( - "Given the computation associated w/ the multiple phases of finetuning demonstrated, this notebook is best used with a GPU" - ) +print( + "Note given the computation associated w/ the multiple phases of finetuning demonstrated, this notebook is best used with an accelerator" +) +train() # %% [markdown] # ### Running the Baseline and Implicit Finetuning Scenarios @@ -622,17 +620,12 @@ def train() -> None: scenario_callbacks = {"nofts_baseline": nofts_callbacks, "fts_implicit": fts_implicit_callbacks} # %% -if torch.cuda.is_available(): - for scenario_name, scenario_callbacks in scenario_callbacks.items(): - model = RteBoolqModule(**lightning_module_kwargs, experiment_tag=scenario_name) - logger = TensorBoardLogger("lightning_logs", name=scenario_name) - callbacks = scenario_callbacks - print(f"Beginning training the '{scenario_name}' scenario") - train() -else: - print( - "Given the computation associated w/ the multiple phases of finetuning demonstrated, this notebook is best used with a GPU" - ) +for scenario_name, scenario_callbacks in scenario_callbacks.items(): + model = RteBoolqModule(**lightning_module_kwargs, experiment_tag=scenario_name) + logger = TensorBoardLogger("lightning_logs", name=scenario_name) + callbacks = scenario_callbacks + print(f"Beginning training the '{scenario_name}' scenario") + train() # %% [markdown] # ### Reviewing the Training Results From e73f44361cfd5c0c326ad0d2cb659178597dd98e Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Wed, 11 May 2022 11:28:52 -0700 Subject: [PATCH 44/44] reset lr_scheduler interval to epoch --- lightning_examples/finetuning-scheduler/finetuning-scheduler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 9d6316332..e276fe677 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -438,7 +438,7 @@ def configure_optimizers(self): optimizer = AdamW(params=self._init_param_groups(), **self.hparams.optimizer_init) scheduler = { "scheduler": CosineAnnealingWarmRestarts(optimizer, **self.hparams.lr_scheduler_init), - "interval": "step", + "interval": "epoch", } return [optimizer], [scheduler]

{r{eP{8H&=nRp6Dlu%-n7 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

# # **Note:** Currently, _FinetuningScheduler_ only supports the following ``StrategyType``s: +# # - ``DP`` # - ``DDP`` # - ``DDP_SPAWN`` @@ -600,6 +601,8 @@ def configure_callbacks(self): enable_progress_bar = False # %% + + def train() -> None: trainer = pl.Trainer( enable_progress_bar=enable_progress_bar, @@ -622,13 +625,15 @@ def train() -> None: # ### Running the Baseline and Implicit Finetuning Scenarios # # Let's now compare our ``nofts_baseline`` and ``fts_implicit`` scenarios with the ``fts_explicit`` one we just ran. +# # We'll need to update our callbacks list, using the core PL ``EarlyStopping`` and ``ModelCheckpoint`` callbacks for the # ``nofts_baseline`` (which operate identically to their FTS analogs apart from the recursive training support). # For both core PyTorch Lightning and user-registered callbacks, we can define our callbacks using a dictionary as we do # with the LightningCLI. This allows us to avoid managing imports and support more complex configuration separated from # code. -# We'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping ``max_depth`` for the -# implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction +# +# Note that we'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping ``max_depth`` for +# the implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction # of the parameters you'd want to tune for maximum performance. Since the implicit schedule is quite computationally # intensive and most useful for exploring model behavior, leaving ``max_depth`` 1 allows us to demo implicit mode # behavior while keeping the computational cost and runtime of this notebook reasonable. To review how a full implicit @@ -686,8 +691,8 @@ def train() -> None: # which uses DDP_SPAWN and 1 GPU. # # ``FinetuningScheduler`` expands the space of possible finetuning schedules and the composition of more sophisticated schedules can -# yield mariginal finetuning performance gains. That stated, it should be emphasized the primary utility of ``FinetuningScheduler`` is to grant -# greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTav3's implicit training +# yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of ``FinetuningScheduler`` is to grant +# greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTa-v3's implicit training # run, a critical tuning transition point is immediately apparent: # # [![implicit_training_transition](implicit_training_transition.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6ZmFsc2UsImZ0c19pbXBsaWNpdCI6dHJ1ZX0%3D) From c99e169566535a64144fa830b778206c2cac55e6 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Thu, 18 Nov 2021 11:11:42 -0800 Subject: [PATCH 11/44] several recommended fixes for lightning_examples/finetuning-scheduler/finetuning-scheduler.py Co-authored-by: thomas chaton --- .../finetuning-scheduler/.meta.yml | 20 ++ .../finetuning-scheduler.py | 326 ++++++++++++++++++ .../text-transformers/text-transformers.py | 2 +- 3 files changed, 347 insertions(+), 1 deletion(-) create mode 100644 lightning_examples/finetuning-scheduler/.meta.yml create mode 100644 lightning_examples/finetuning-scheduler/finetuning-scheduler.py diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml new file mode 100644 index 000000000..6a2a38ce8 --- /dev/null +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -0,0 +1,20 @@ +title: Finetuning Scheduler +author: PL team +created: 2021-01-31 +updated: 2021-06-21 +license: CC BY-SA +build: 1 +tags: + - Text +description: | + This notebook will use HuggingFace's `datasets` library to get data, which will be wrapped in a `LightningDataModule`. + Then, we write a class to perform text classification on any dataset from the [GLUE Benchmark](https://gluebenchmark.com/). + (We just show CoLA and MRPC due to constraint on compute/disk) +requirements: + - transformers + - datasets + - scipy + - scikit-learn +accelerator: + - CPU + - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py new file mode 100644 index 000000000..b97a1012e --- /dev/null +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -0,0 +1,326 @@ +# %% +from datetime import datetime +from typing import Optional + +import datasets +import torch +from pytorch_lightning import LightningDataModule, LightningModule, Trainer, seed_everything +from torch.utils.data import DataLoader +from transformers import ( + AdamW, + AutoConfig, + AutoModelForSequenceClassification, + AutoTokenizer, + get_linear_schedule_with_warmup, +) + +AVAIL_GPUS = min(1, torch.cuda.device_count()) + +# %% [markdown] +# ## Training BERT with Lightning + +# %% [markdown] +# ### Lightning DataModule for GLUE + + +# %% +class GLUEDataModule(LightningDataModule): + + task_text_field_map = { + "cola": ["sentence"], + "sst2": ["sentence"], + "mrpc": ["sentence1", "sentence2"], + "qqp": ["question1", "question2"], + "stsb": ["sentence1", "sentence2"], + "mnli": ["premise", "hypothesis"], + "qnli": ["question", "sentence"], + "rte": ["sentence1", "sentence2"], + "wnli": ["sentence1", "sentence2"], + "ax": ["premise", "hypothesis"], + } + + glue_task_num_labels = { + "cola": 2, + "sst2": 2, + "mrpc": 2, + "qqp": 2, + "stsb": 1, + "mnli": 3, + "qnli": 2, + "rte": 2, + "wnli": 2, + "ax": 3, + } + + loader_columns = [ + "datasets_idx", + "input_ids", + "token_type_ids", + "attention_mask", + "start_positions", + "end_positions", + "labels", + ] + + def __init__( + self, + model_name_or_path: str, + task_name: str = "mrpc", + max_seq_length: int = 128, + train_batch_size: int = 32, + eval_batch_size: int = 32, + **kwargs, + ): + super().__init__() + self.model_name_or_path = model_name_or_path + self.task_name = task_name + self.max_seq_length = max_seq_length + self.train_batch_size = train_batch_size + self.eval_batch_size = eval_batch_size + + self.text_fields = self.task_text_field_map[task_name] + self.num_labels = self.glue_task_num_labels[task_name] + self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True) + + def setup(self, stage: str): + self.dataset = datasets.load_dataset("glue", self.task_name) + + for split in self.dataset.keys(): + self.dataset[split] = self.dataset[split].map( + self.convert_to_features, + batched=True, + remove_columns=["label"], + ) + self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns] + self.dataset[split].set_format(type="torch", columns=self.columns) + + self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] + + def prepare_data(self): + datasets.load_dataset("glue", self.task_name) + AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True) + + def train_dataloader(self): + return DataLoader(self.dataset["train"], batch_size=self.train_batch_size) + + def val_dataloader(self): + if len(self.eval_splits) == 1: + return DataLoader(self.dataset["validation"], batch_size=self.eval_batch_size) + elif len(self.eval_splits) > 1: + return [DataLoader(self.dataset[x], batch_size=self.eval_batch_size) for x in self.eval_splits] + + def test_dataloader(self): + if len(self.eval_splits) == 1: + return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size) + elif len(self.eval_splits) > 1: + return [DataLoader(self.dataset[x], batch_size=self.eval_batch_size) for x in self.eval_splits] + + def convert_to_features(self, example_batch, indices=None): + + # Either encode single sentence or sentence pairs + if len(self.text_fields) > 1: + texts_or_text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) + else: + texts_or_text_pairs = example_batch[self.text_fields[0]] + + # Tokenize the text/text pairs + features = self.tokenizer.batch_encode_plus( + texts_or_text_pairs, max_length=self.max_seq_length, pad_to_max_length=True, truncation=True + ) + + # Rename label to labels to make it easier to pass to model forward + features["labels"] = example_batch["label"] + + return features + + +# %% [markdown] +# **You could use this datamodule with standalone PyTorch if you wanted...** + +# %% +dm = GLUEDataModule("distilbert-base-uncased") +dm.prepare_data() +dm.setup("fit") +next(iter(dm.train_dataloader())) + +# %% [markdown] +# ### Transformer LightningModule + + +# %% +class GLUETransformer(LightningModule): + def __init__( + self, + model_name_or_path: str, + num_labels: int, + task_name: str, + learning_rate: float = 2e-5, + adam_epsilon: float = 1e-8, + warmup_steps: int = 0, + weight_decay: float = 0.0, + train_batch_size: int = 32, + eval_batch_size: int = 32, + eval_splits: Optional[list] = None, + **kwargs, + ): + super().__init__() + + self.save_hyperparameters() + + self.config = AutoConfig.from_pretrained(model_name_or_path, num_labels=num_labels) + self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=self.config) + self.metric = datasets.load_metric( + "glue", self.hparams.task_name, experiment_id=datetime.now().strftime("%d-%m-%Y_%H-%M-%S") + ) + + def forward(self, **inputs): + return self.model(**inputs) + + def training_step(self, batch, batch_idx): + outputs = self(**batch) + loss = outputs[0] + return loss + + def validation_step(self, batch, batch_idx, dataloader_idx=0): + outputs = self(**batch) + val_loss, logits = outputs[:2] + + if self.hparams.num_labels >= 1: + preds = torch.argmax(logits, axis=1) + elif self.hparams.num_labels == 1: + preds = logits.squeeze() + + labels = batch["labels"] + + return {"loss": val_loss, "preds": preds, "labels": labels} + + def validation_epoch_end(self, outputs): + if self.hparams.task_name == "mnli": + for i, output in enumerate(outputs): + # matched or mismatched + split = self.hparams.eval_splits[i].split("_")[-1] + preds = torch.cat([x["preds"] for x in output]).detach().cpu().numpy() + labels = torch.cat([x["labels"] for x in output]).detach().cpu().numpy() + loss = torch.stack([x["loss"] for x in output]).mean() + self.log(f"val_loss_{split}", loss, prog_bar=True) + split_metrics = { + f"{k}_{split}": v for k, v in self.metric.compute(predictions=preds, references=labels).items() + } + self.log_dict(split_metrics, prog_bar=True) + return loss + + preds = torch.cat([x["preds"] for x in outputs]).detach().cpu().numpy() + labels = torch.cat([x["labels"] for x in outputs]).detach().cpu().numpy() + loss = torch.stack([x["loss"] for x in outputs]).mean() + self.log("val_loss", loss, prog_bar=True) + self.log_dict(self.metric.compute(predictions=preds, references=labels), prog_bar=True) + return loss + + def setup(self, stage=None) -> None: + if stage != "fit": + return + # Get dataloader by calling it - train_dataloader() is called after setup() by default + # train_loader = self.train_dataloader() + train_loader = self.trainer.datamodule.train_dataloader() + # Calculate total steps + tb_size = self.hparams.train_batch_size * max(1, self.trainer.gpus) + ab_size = self.trainer.accumulate_grad_batches * float(self.trainer.max_epochs) + self.total_steps = (len(train_loader.dataset) // tb_size) // ab_size + + def configure_optimizers(self): + """Prepare optimizer and schedule (linear warmup and decay)""" + model = self.model + no_decay = ["bias", "LayerNorm.weight"] + optimizer_grouped_parameters = [ + { + "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], + "weight_decay": self.hparams.weight_decay, + }, + { + "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], + "weight_decay": 0.0, + }, + ] + optimizer = AdamW(optimizer_grouped_parameters, lr=self.hparams.learning_rate, eps=self.hparams.adam_epsilon) + + scheduler = get_linear_schedule_with_warmup( + optimizer, + num_warmup_steps=self.hparams.warmup_steps, + num_training_steps=self.total_steps, + ) + scheduler = {"scheduler": scheduler, "interval": "step", "frequency": 1} + return [optimizer], [scheduler] + + +# %% [markdown] +# ## Training + +# %% [markdown] +# ### CoLA +# +# See an interactive view of the +# CoLA dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=cola) + +# %% +seed_everything(42) + +dm = GLUEDataModule(model_name_or_path="albert-base-v2", task_name="cola") +dm.setup("fit") +model = GLUETransformer( + model_name_or_path="albert-base-v2", + num_labels=dm.num_labels, + eval_splits=dm.eval_splits, + task_name=dm.task_name, +) + +trainer = Trainer(max_epochs=1, gpus=AVAIL_GPUS) +trainer.fit(model, dm) + +# %% [markdown] +# ### MRPC +# +# See an interactive view of the +# MRPC dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=mrpc) + +# %% +seed_everything(42) + +dm = GLUEDataModule( + model_name_or_path="distilbert-base-cased", + task_name="mrpc", +) +dm.setup("fit") +model = GLUETransformer( + model_name_or_path="distilbert-base-cased", + num_labels=dm.num_labels, + eval_splits=dm.eval_splits, + task_name=dm.task_name, +) + +trainer = Trainer(max_epochs=3, gpus=AVAIL_GPUS) +trainer.fit(model, dm) + +# %% [markdown] +# ### MNLI +# +# - The MNLI dataset is huge, so we aren't going to bother trying to train on it here. +# - We will skip over training and go straight to validation. +# +# See an interactive view of the +# MRPC dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=mnli) + +# %% +dm = GLUEDataModule( + model_name_or_path="distilbert-base-cased", + task_name="mnli", +) +dm.setup("fit") +model = GLUETransformer( + model_name_or_path="distilbert-base-cased", + num_labels=dm.num_labels, + eval_splits=dm.eval_splits, + task_name=dm.task_name, +) + +trainer = Trainer(gpus=AVAIL_GPUS, progress_bar_refresh_rate=20) +trainer.validate(model, dm.val_dataloader()) diff --git a/lightning_examples/text-transformers/text-transformers.py b/lightning_examples/text-transformers/text-transformers.py index 57786f010..d14a2e397 100644 --- a/lightning_examples/text-transformers/text-transformers.py +++ b/lightning_examples/text-transformers/text-transformers.py @@ -220,7 +220,7 @@ def setup(self, stage=None) -> None: if stage != "fit": return # Get dataloader by calling it - train_dataloader() is called after setup() by default - train_loader = self.trainer.datamodule.train_dataloader() + train_loader = self.train_dataloader() # Calculate total steps tb_size = self.hparams.train_batch_size * max(1, self.trainer.gpus) From b89c5d03d18b4ab8e93c76514ddaef5104cc3983 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Mon, 29 Nov 2021 17:22:25 -0800 Subject: [PATCH 12/44] notebook-based fts tutorial and example --- .../finetuning-scheduler/.meta.yml | 19 +- .../finetuning-scheduler/emphasized_yaml.svg | 1176 +++++++++++++++++ .../finetuning-scheduler.py | 704 +++++++--- .../fts_explicit_loss_anim.gif | Bin 0 -> 302052 bytes .../side_by_side_yaml.svg | 754 +++++++++++ 5 files changed, 2437 insertions(+), 216 deletions(-) create mode 100644 lightning_examples/finetuning-scheduler/emphasized_yaml.svg create mode 100644 lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif create mode 100644 lightning_examples/finetuning-scheduler/side_by_side_yaml.svg diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 6a2a38ce8..33296fba5 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -1,20 +1,19 @@ title: Finetuning Scheduler -author: PL team -created: 2021-01-31 -updated: 2021-06-21 +author: Dan Dale +created: 2021-11-26 +updated: 2021-11-26 license: CC BY-SA build: 1 tags: - - Text + - finetuning description: | - This notebook will use HuggingFace's `datasets` library to get data, which will be wrapped in a `LightningDataModule`. - Then, we write a class to perform text classification on any dataset from the [GLUE Benchmark](https://gluebenchmark.com/). - (We just show CoLA and MRPC due to constraint on compute/disk) + This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune + a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task + of [SuperGLUE](https://super.gluebenchmark.com/) with iterative earlystopping defined according to a user-specified + schedule. It uses HuggingFace's `datasets` and `transformers`` libraries to retrieve the relevant benchmark data and + foundational model weights. requirements: - transformers - datasets - - scipy - - scikit-learn accelerator: - - CPU - GPU diff --git a/lightning_examples/finetuning-scheduler/emphasized_yaml.svg b/lightning_examples/finetuning-scheduler/emphasized_yaml.svg new file mode 100644 index 000000000..eda7e7891 --- /dev/null +++ b/lightning_examples/finetuning-scheduler/emphasized_yaml.svg @@ -0,0 +1,1176 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index b97a1012e..9669cb632 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,57 +1,274 @@ +# -*- coding: utf-8 -*- +# --- +# jupyter: +# jupytext: +# formats: ipynb,py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.13.1 +# kernelspec: +# display_name: 'Python 3.7.11 64-bit (''pldev_tutorials'': conda)' +# language: python +# name: python3 +# --- + +# %% [markdown] +# # Scheduled Finetuning +# +#
+# +# The ``FinetuningScheduler`` callback enables multi-phase, +# scheduled finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize +# foundational model knowledge retention while allowing (typically upper layers of) the model to +# optimally adapt to new tasks during transfer learning [1, 2, 3](#f1) +# +#
+# +# ``FinetuningScheduler`` orchestrates the gradual unfreezing +# of models via a finetuning schedule that is either implicitly generated (the default) or explicitly provided by the user +# (more computationally efficient). Finetuning phase transitions are driven by +# ``FTSEarlyStopping`` criteria (a multi-phase +# extension of ``EarlyStopping``), user-specified epoch transitions or a composition of the two (the default mode). +# A ``FinetuningScheduler`` training session completes when the +# final phase of the schedule has its stopping criteria met. See +# the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/extensions/generated/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. +# +# + +# %% [markdown] +# ## Basic Usage +# +# If no finetuning schedule is user-provided, ``FinetuningScheduler`` will generate a +# [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, using default ``FTSEarlyStopping`` and ``FTSCheckpoint`` callbacks with ``monitor=val_loss``. +# +# ```python +# from pytorch_lightning import Trainer +# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# trainer = Trainer(callbacks=[FinetuningScheduler()]) +# ``` + +# %% [markdown] +# ## The Default Finetuning Schedule +# +# Schedule definition is facilitated via the ``gen_ft_schedule`` method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as +# desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will often be less computationally efficient than a user-defined finetuning schedule but can often serve as a good baseline for subsquent explicit schedule refinement and will marginally outperform many explicit schedules. + +# %% [markdown] +# ## Specifying a Finetuning Schedule +# +# To specify a finetuning schedule, it's convenient to first generate the default schedule and then alter the thawed/unfrozen parameter groups associated with each finetuning phase as desired. Finetuning phases are zero-indexed and executed in ascending order. +# +# 1. Generate the default schedule to ``Trainer.log_dir`` with the name +# (``lightning_module.__class__.__name__``)_ft_schedule.yaml +# +# ```python +# from pytorch_lightning import Trainer +# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# trainer = Trainer(callbacks=[FinetuningScheduler(gen_ft_sched_only=True)]) +# ``` +# +# 2. Alter the schedule as desired. +# +# +# +# 3. Once the finetuning schedule has been altered as desired, pass it to +# ``FinetuningScheduler`` to commence scheduled training: +# +# ```python +# from pytorch_lightning import Trainer +# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# +# trainer = Trainer(callbacks=[FinetuningScheduler(ft_schedule="/path/to/my/schedule/my_schedule.yaml")]) +# ``` + +# %% [markdown] +# ## EarlyStopping and Epoch-Driven Phase Transition Criteria +# +# +# By default, ``FTSEarlyStopping`` and epoch-driven +# transition criteria are composed. If a ``max_transition_epoch`` is specified for a given phase, the next finetuning phase will begin at that epoch unless ``FTSEarlyStopping`` criteria are met first. +# If ``FinetuningScheduler.epoch_transitions_only`` is ``True``, ``FTSEarlyStopping`` will not be used +# and transitions will be exclusively epoch-driven. +# +# +#
+# +# **Tip:** Use of regex expressions can be convenient for specifying more complex schedules: +# +# +# +#
+# +# +# +# The end-to-end example in this notebook ([Scheduled Finetuning For SuperGLUE](#superglue)) uses ``FinetuningScheduler`` in explicit mode to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). + +# %% [markdown] +# ## Resuming Scheduled Finetuning Training Sessions +# +# Resumption of scheduled finetuning training is identical to the continuation of +# [other training sessions](https://pytorch-lightning.readthedocs.io/en/latest/common/trainer.html) with the caveat that the provided checkpoint must have been saved by a ``FinetuningScheduler`` session. +# ``FinetuningScheduler`` uses ``FTSCheckpoint`` (an extension of ``ModelCheckpoint``) to maintain schedule state with special metadata. +# +# +# ```python +# from pytorch_lightning import Trainer +# from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler +# trainer = Trainer(callbacks=[FinetuningScheduler()], resume_from_checkpoint="some/path/to/my_checkpoint.ckpt") +# ``` +# +# Training will resume at the depth/level of the provided checkpoint according the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. +# +# By default (``FinetuningScheduler.restore_best`` is ``True``), ``FinetuningScheduler`` will attempt to restore the best available checkpoint before finetuning depth transitions. +# +# ```python +# trainer = Trainer( +# callbacks=[FinetuningScheduler(new_incarnation_mode=True)], +# resume_from_checkpoint="some/path/to/my_kth_best_checkpoint.ckpt", +# ) +# ``` +# +# To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting ``FinetuningScheduler.new_incarnation_mode`` to +# ``True`` as above will re-intialize the checkpoint state with a new best checkpoint at the resumption depth. + +# %% [markdown] +#
+# +# **Note:** Currently, _FinetuningScheduler_ only supports the following _TrainingTypePlugins_: +# +# - ``DDPPlugin`` +# - ``DDPShardedPlugin`` +# - ``DDPSpawnPlugin`` +# - ``DDPSpawnShardedPlugin`` +# - ``DataParallelPlugin`` +# - ``SingleDevicePlugin`` +# +#
+ +# %% [markdown] +#
+# +# # Scheduled Finetuning For SuperGLUE +# +# The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. +# +# ``FinetuningScheduler`` can be used to achieve non-trivial model performance improvements in both implicit and explicit scheduling contexts at an also non-trivial computational cost. + # %% +import os +import warnings from datetime import datetime -from typing import Optional +from typing import Any, Dict, List, Optional, Tuple, Union +from importlib import import_module +import logging -import datasets import torch -from pytorch_lightning import LightningDataModule, LightningModule, Trainer, seed_everything from torch.utils.data import DataLoader -from transformers import ( - AdamW, - AutoConfig, - AutoModelForSequenceClassification, - AutoTokenizer, - get_linear_schedule_with_warmup, -) -AVAIL_GPUS = min(1, torch.cuda.device_count()) +import pytorch_lightning as pl +from pytorch_lightning.utilities import rank_zero_warn +from pytorch_lightning.utilities.cli import CALLBACK_REGISTRY, _Registry +from pytorch_lightning.utilities.exceptions import MisconfigurationException +from pytorch_lightning.loggers.tensorboard import TensorBoardLogger -# %% [markdown] -# ## Training BERT with Lightning +import datasets +from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer -# %% [markdown] -# ### Lightning DataModule for GLUE + +# %% +# a couple helper functions to prepare code to work with the forthcoming hub and user module registry +MOCK_HUB_REGISTRY = _Registry() + + +def module_hub_mock(key: str, require_fqn: bool = False) -> List: + if key.lower() == "finetuningscheduler": + mod = import_module("pytorch_lightning.callbacks.finetuning_scheduler") + MOCK_HUB_REGISTRY.register_classes(mod, pl.callbacks.Callback) + else: + raise MisconfigurationException(f"user module key '{key}' not found") + registered_list = [] + # make registered class available by unqualified class name by default + if not require_fqn: + for n, c in MOCK_HUB_REGISTRY.items(): + globals()[f"{n}"] = c + registered_list = ", ".join([n for n in MOCK_HUB_REGISTRY.names]) + else: + registered_list = ", ".join( + [c.__module__ + "." + c.__name__ for c in MOCK_HUB_REGISTRY.classes] + ) + print(f"Imported and registered the following callbacks: {registered_list}") + + +def instantiate_registered_class( + init: Dict[str, Any], args: Optional[Union[Any, Tuple[Any, ...]]] = None +) -> Any: + """Instantiates a class with the given args and init. Accepts class definitions in the form + of a "class_path" or "callback_key" associated with a _Registry + + Args: + init: Dict of the form {"class_path":... or "callback_key":..., "init_args":...}. + args: Positional arguments required for instantiation. + + Returns: + The instantiated class object. + """ + kwargs = init.get("init_args", {}) + if args and not isinstance(args, tuple): + args = (args,) + shortcircuit_local = False if "." in init["class_path"] else True + class_module, class_name, args_class = None, None, None + if init.get("class_path", None): + if not shortcircuit_local: + class_module, class_name = init["class_path"].rsplit(".", 1) + else: # class is expected to be locally defined + args_class = globals()[init["class_path"]] + elif init.get("callback_key", None): + callback_path = CALLBACK_REGISTRY.get( + init["callback_key"], None + ) or MOCK_HUB_REGISTRY.get(init["callback_key"], None) + assert callback_path, MisconfigurationException( + f'specified callback_key {init["callback_key"]} has not been registered' + ) + class_module, class_name = callback_path.__module__, callback_path.__name__ + else: + raise MisconfigurationException( + "Neither a class_path nor callback_key were included in a configuration that" + "requires one" + ) + if not shortcircuit_local: + module = __import__(class_module, fromlist=[class_name]) + args_class = getattr(module, class_name) + return args_class(**kwargs) if not args else args_class(*args, **kwargs) + + +# %% +# load the pl extension module we want to use. This will import all necessary callbacks. +module_hub_mock("finetuningscheduler") +# set notebook-level variables +AVAIL_GPUS = min(1, torch.cuda.device_count()) +TASK_NUM_LABELS = {"boolq": 2, "rte": 2} +DEFAULT_TASK = "rte" + +# narrow our logging to adapt it for a notebook environment +for l_key in logging.Logger.manager.loggerDict.keys(): + if "pytorch_lightning" in l_key: + logging.getLogger(l_key).setLevel("INFO") + else: + logging.getLogger(l_key).setLevel("CRITICAL") +pl_logger = logging.getLogger("pytorch_lightning") +pl_logger.removeHandler(pl_logger.handlers[0]) +rz_logger = logging.getLogger("pytorch_lightning.utilities.distributed") +rz_logger.addHandler(logging.StreamHandler()) +rz_logger.handlers[0].setLevel("INFO") # %% -class GLUEDataModule(LightningDataModule): - - task_text_field_map = { - "cola": ["sentence"], - "sst2": ["sentence"], - "mrpc": ["sentence1", "sentence2"], - "qqp": ["question1", "question2"], - "stsb": ["sentence1", "sentence2"], - "mnli": ["premise", "hypothesis"], - "qnli": ["question", "sentence"], - "rte": ["sentence1", "sentence2"], - "wnli": ["sentence1", "sentence2"], - "ax": ["premise", "hypothesis"], - } - - glue_task_num_labels = { - "cola": 2, - "sst2": 2, - "mrpc": 2, - "qqp": 2, - "stsb": 1, - "mnli": 3, - "qnli": 2, - "rte": 2, - "wnli": 2, - "ax": 3, - } +class RteBoolqDataModule(pl.LightningDataModule): + """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets""" + task_text_field_map = {"rte": ["premise", "hypothesis"], "boolq": ["question", "passage"]} loader_columns = [ "datasets_idx", "input_ids", @@ -61,117 +278,167 @@ class GLUEDataModule(LightningDataModule): "end_positions", "labels", ] + # ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and + # expected logging behavior + for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: + warnings.filterwarnings("ignore", warnf) def __init__( self, model_name_or_path: str, - task_name: str = "mrpc", + task_name: str = DEFAULT_TASK, + prep_on_init: bool = False, max_seq_length: int = 128, train_batch_size: int = 32, eval_batch_size: int = 32, - **kwargs, + pin_memory: bool = False, + tokenizers_parallelism: bool = True, + num_workers: int = 0, ): super().__init__() self.model_name_or_path = model_name_or_path - self.task_name = task_name + self.task_name = task_name if task_name in TASK_NUM_LABELS.keys() else DEFAULT_TASK self.max_seq_length = max_seq_length self.train_batch_size = train_batch_size self.eval_batch_size = eval_batch_size - - self.text_fields = self.task_text_field_map[task_name] - self.num_labels = self.glue_task_num_labels[task_name] - self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True) - - def setup(self, stage: str): - self.dataset = datasets.load_dataset("glue", self.task_name) - + self.tokenizers_parallelism = tokenizers_parallelism + self.dataloader_kwargs = {"num_workers": num_workers, "pin_memory": pin_memory} + self.text_fields = self.task_text_field_map[self.task_name] + self.num_labels = TASK_NUM_LABELS[self.task_name] + os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.tokenizers_parallelism else "false" + self.tokenizer = AutoTokenizer.from_pretrained( + self.model_name_or_path, use_fast=True, local_files_only=False + ) + if ( + prep_on_init + ): # useful if one wants to load datasets as soon as the ``LightningDataModule`` is + # instantiated + self.prepare_data() + self.setup("fit") + + def setup(self, stage): + self.dataset = datasets.load_dataset("super_glue", self.task_name) for split in self.dataset.keys(): self.dataset[split] = self.dataset[split].map( - self.convert_to_features, - batched=True, - remove_columns=["label"], + self.convert_to_features, batched=True, remove_columns=["label"] ) - self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns] + self.columns = [ + c for c in self.dataset[split].column_names if c in self.loader_columns + ] self.dataset[split].set_format(type="torch", columns=self.columns) self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] def prepare_data(self): - datasets.load_dataset("glue", self.task_name) - AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True) + # N.B. PL calls prepare_data from a single process (rank 0) so do not use it to assign + # state (e.g. self.x=y) + datasets.load_dataset("super_glue", self.task_name) def train_dataloader(self): - return DataLoader(self.dataset["train"], batch_size=self.train_batch_size) + return DataLoader( + self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs + ) def val_dataloader(self): if len(self.eval_splits) == 1: - return DataLoader(self.dataset["validation"], batch_size=self.eval_batch_size) + return DataLoader( + self.dataset["validation"], + batch_size=self.eval_batch_size, + **self.dataloader_kwargs, + ) elif len(self.eval_splits) > 1: - return [DataLoader(self.dataset[x], batch_size=self.eval_batch_size) for x in self.eval_splits] + return [ + DataLoader( + self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs + ) + for x in self.eval_splits + ] def test_dataloader(self): if len(self.eval_splits) == 1: - return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size) + return DataLoader( + self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs + ) elif len(self.eval_splits) > 1: - return [DataLoader(self.dataset[x], batch_size=self.eval_batch_size) for x in self.eval_splits] - - def convert_to_features(self, example_batch, indices=None): - - # Either encode single sentence or sentence pairs - if len(self.text_fields) > 1: - texts_or_text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) - else: - texts_or_text_pairs = example_batch[self.text_fields[0]] - + return [ + DataLoader( + self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs + ) + for x in self.eval_splits + ] + + def convert_to_features(self, example_batch): + text_pairs = list( + zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]]) + ) # Tokenize the text/text pairs features = self.tokenizer.batch_encode_plus( - texts_or_text_pairs, max_length=self.max_seq_length, pad_to_max_length=True, truncation=True + text_pairs, max_length=self.max_seq_length, padding="longest", truncation=True ) - # Rename label to labels to make it easier to pass to model forward features["labels"] = example_batch["label"] - return features -# %% [markdown] -# **You could use this datamodule with standalone PyTorch if you wanted...** - # %% -dm = GLUEDataModule("distilbert-base-uncased") -dm.prepare_data() -dm.setup("fit") -next(iter(dm.train_dataloader())) - -# %% [markdown] -# ### Transformer LightningModule - +class RteBoolqModule(pl.LightningModule): + """A ``LightningModule`` that can be used to finetune a foundational + model on either the RTE or BoolQ SuperGLUE tasks using Hugging Face + implementations of a given model and the `SuperGLUE Hugging Face dataset. + """ -# %% -class GLUETransformer(LightningModule): def __init__( self, model_name_or_path: str, - num_labels: int, - task_name: str, - learning_rate: float = 2e-5, - adam_epsilon: float = 1e-8, - warmup_steps: int = 0, - weight_decay: float = 0.0, - train_batch_size: int = 32, - eval_batch_size: int = 32, - eval_splits: Optional[list] = None, - **kwargs, + optimizer_init: Dict[str, Any], + lr_scheduler_init: Dict[str, Any], + pl_lrs_cfg: Optional[Dict[str, Any]] = None, + model_cfg: Optional[Dict[str, Any]] = None, + task_name: str = DEFAULT_TASK, + experiment_tag: str = "default", + plot_liveloss: bool = False, ): + """ + Args: + model_name_or_path (str): Path to pretrained model or identifier from https://huggingface.co/models + optimizer_init (Dict[str, Any]): The desired optimizer configuration. + lr_scheduler_init (Dict[str, Any]): The desired learning rate scheduler config + pl_lrs_cfg (Optional[Dict[str, Any]]): Defines custom overrides of pytorch lightning lr_scheduler defaults + defined in ``_get_default_scheduler_config`` + model_cfg (Optional[Dict[str, Any]], optional): Defines overrides of the default model config. Defaults to + ``None``. + task_name (str, optional): The SuperGLUE task to execute, one of ``'rte'``, ``'boolq'``. Defaults to "rte". + experiment_tag (str, optional): The tag to use for the experiment and tensorboard logs. Defaults to + "default". + """ super().__init__() - + self.optimizer_init = optimizer_init + self.lr_scheduler_init = lr_scheduler_init + self.plot_liveloss = plot_liveloss + self.pl_lrs_cfg = pl_lrs_cfg or {} + if task_name in TASK_NUM_LABELS.keys(): + self.task_name = task_name + else: + self.task_name = DEFAULT_TASK + rank_zero_warn( + f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'" + ) + self.num_labels = TASK_NUM_LABELS[self.task_name] self.save_hyperparameters() - - self.config = AutoConfig.from_pretrained(model_name_or_path, num_labels=num_labels) - self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=self.config) + self.experiment_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}" + self.model_cfg = model_cfg or {} + conf = AutoConfig.from_pretrained( + model_name_or_path, num_labels=self.num_labels, local_files_only=False + ) + self.model = AutoModelForSequenceClassification.from_pretrained( + model_name_or_path, config=conf + ) + self.model.config.update(self.model_cfg) # apply model config overrides self.metric = datasets.load_metric( - "glue", self.hparams.task_name, experiment_id=datetime.now().strftime("%d-%m-%Y_%H-%M-%S") + "super_glue", self.task_name, experiment_id=self.experiment_id ) + self.no_decay = ["bias", "LayerNorm.weight"] + self.finetuningscheduler_callback = None def forward(self, **inputs): return self.model(**inputs) @@ -181,146 +448,171 @@ def training_step(self, batch, batch_idx): loss = outputs[0] return loss + def training_epoch_end(self, outputs: List[Any]) -> None: + loss = torch.stack([x["loss"] for x in outputs]).mean() + self.log("train_loss", loss, prog_bar=True, sync_dist=True) + if self.finetuningscheduler_callback: + self.log("finetuning_schedule_depth", self.finetuningscheduler_callback.curr_depth) + def validation_step(self, batch, batch_idx, dataloader_idx=0): outputs = self(**batch) val_loss, logits = outputs[:2] - if self.hparams.num_labels >= 1: + if self.num_labels >= 1: preds = torch.argmax(logits, axis=1) - elif self.hparams.num_labels == 1: + elif self.num_labels == 1: preds = logits.squeeze() labels = batch["labels"] - return {"loss": val_loss, "preds": preds, "labels": labels} def validation_epoch_end(self, outputs): - if self.hparams.task_name == "mnli": - for i, output in enumerate(outputs): - # matched or mismatched - split = self.hparams.eval_splits[i].split("_")[-1] - preds = torch.cat([x["preds"] for x in output]).detach().cpu().numpy() - labels = torch.cat([x["labels"] for x in output]).detach().cpu().numpy() - loss = torch.stack([x["loss"] for x in output]).mean() - self.log(f"val_loss_{split}", loss, prog_bar=True) - split_metrics = { - f"{k}_{split}": v for k, v in self.metric.compute(predictions=preds, references=labels).items() - } - self.log_dict(split_metrics, prog_bar=True) - return loss - preds = torch.cat([x["preds"] for x in outputs]).detach().cpu().numpy() labels = torch.cat([x["labels"] for x in outputs]).detach().cpu().numpy() loss = torch.stack([x["loss"] for x in outputs]).mean() - self.log("val_loss", loss, prog_bar=True) - self.log_dict(self.metric.compute(predictions=preds, references=labels), prog_bar=True) + self.log("val_loss", loss, prog_bar=True, sync_dist=True) + metric_dict = self.metric.compute(predictions=preds, references=labels) + self.log_dict(metric_dict, prog_bar=True, sync_dist=True) return loss - def setup(self, stage=None) -> None: - if stage != "fit": - return - # Get dataloader by calling it - train_dataloader() is called after setup() by default - # train_loader = self.train_dataloader() - train_loader = self.trainer.datamodule.train_dataloader() - # Calculate total steps - tb_size = self.hparams.train_batch_size * max(1, self.trainer.gpus) - ab_size = self.trainer.accumulate_grad_batches * float(self.trainer.max_epochs) - self.total_steps = (len(train_loader.dataset) // tb_size) // ab_size + def init_pgs(self) -> List[Dict]: + """Initialize the parameter groups. Used to ensure weight_decay is not applied + to our specified bias parameters when we initialize the optimizer. - def configure_optimizers(self): - """Prepare optimizer and schedule (linear warmup and decay)""" - model = self.model - no_decay = ["bias", "LayerNorm.weight"] - optimizer_grouped_parameters = [ + Returns: + List[Dict]: A list of parameter group dictionaries. + """ + pgs = [ { - "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], - "weight_decay": self.hparams.weight_decay, + "params": [ + p + for n, p in self.model.named_parameters() + if not any(nd in n for nd in self.no_decay) and p.requires_grad + ], + "weight_decay": self.optimizer_init["init_args"]["weight_decay"], }, { - "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], + "params": [ + p + for n, p in self.model.named_parameters() + if any(nd in n for nd in self.no_decay) and p.requires_grad + ], "weight_decay": 0.0, }, ] - optimizer = AdamW(optimizer_grouped_parameters, lr=self.hparams.learning_rate, eps=self.hparams.adam_epsilon) + return pgs - scheduler = get_linear_schedule_with_warmup( - optimizer, - num_warmup_steps=self.hparams.warmup_steps, - num_training_steps=self.total_steps, - ) - scheduler = {"scheduler": scheduler, "interval": "step", "frequency": 1} + def configure_optimizers(self): + # the phase 0 parameters will have been set to require gradients during setup + # you can initialize the optimizer with a simple requires.grad filter as is often done, + # but in this case we pass a list of parameter groups to ensure weight_decay is + # not applied to the bias parameter (for completeness, in this case it won't make much + # performance difference) + optimizer = instantiate_registered_class(args=self.init_pgs(), init=self.optimizer_init) + scheduler = { + "scheduler": instantiate_registered_class( + args=optimizer, init=self.lr_scheduler_init + ), + **self.pl_lrs_cfg, + } return [optimizer], [scheduler] + def configure_callbacks(self): + found_fts = [c for c in self.trainer.callbacks if isinstance(c, FinetuningScheduler)] # type: ignore # noqa + if found_fts: + self.finetuningscheduler_callback = found_fts[0] + return super().configure_callbacks() -# %% [markdown] -# ## Training - -# %% [markdown] -# ### CoLA -# -# See an interactive view of the -# CoLA dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=cola) # %% -seed_everything(42) +# let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it +# Please see the documentation for a full description of the schedule format +ft_schedule_yaml = """ +0: + params: # the parameters for each phase definition can be fully specified + - model.classifier.bias + - model.classifier.weight +1: + params: # or specified via a regex + - model.albert.pooler.* +2: + params: + - model.albert.encoder.*.ffn_output.* +""" +ft_schedule_name = "RteBoolqModule_ft_schedule_albert_base.yaml" +with open(ft_schedule_name, "w") as f: + f.write(ft_schedule_yaml) -dm = GLUEDataModule(model_name_or_path="albert-base-v2", task_name="cola") +# %% +datasets.set_progress_bar_enabled(False) +pl.seed_everything(42) +dm = RteBoolqDataModule(model_name_or_path="albert-base-v2", tokenizers_parallelism=False) dm.setup("fit") -model = GLUETransformer( +optimizer_init = { + "class_path": "torch.optim.AdamW", + "init_args": {"weight_decay": 1e-05, "eps": 1e-07, "lr": 1e-05}, +} +lr_scheduler_init = { + "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", + "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, +} +pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} + +model = RteBoolqModule( model_name_or_path="albert-base-v2", - num_labels=dm.num_labels, - eval_splits=dm.eval_splits, - task_name=dm.task_name, + optimizer_init=optimizer_init, + lr_scheduler_init=lr_scheduler_init, + pl_lrs_cfg=pl_lrs_cfg, + experiment_tag="fts_explicit", ) - -trainer = Trainer(max_epochs=1, gpus=AVAIL_GPUS) -trainer.fit(model, dm) - -# %% [markdown] -# ### MRPC -# -# See an interactive view of the -# MRPC dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=mrpc) +callbacks = [ + FinetuningScheduler(ft_schedule=ft_schedule_name, max_depth=2), # type: ignore # noqa + FTSEarlyStopping(monitor="val_loss", min_delta=0.001, patience=2), # type: ignore # noqa + FTSCheckpoint(monitor="val_loss", save_top_k=5), # type: ignore # noqa +] +example_logdir = "lightning_logs" +logger = TensorBoardLogger(example_logdir, name="fts_explicit") # %% -seed_everything(42) +# optionally start tensorboard and monitor progress graphically while viewing multi-phase finetuning specific training +# logs in the cell output below by uncommenting the next 3 lines +# # !mkdir -p $example_logdir +# # %load_ext tensorboard +# # %tensorboard --logdir example_logdir +# disable progress bar by default to focus on multi-phase training logs. Set to True to re-enable if desired +show_progress = False -dm = GLUEDataModule( - model_name_or_path="distilbert-base-cased", - task_name="mrpc", -) -dm.setup("fit") -model = GLUETransformer( - model_name_or_path="distilbert-base-cased", - num_labels=dm.num_labels, - eval_splits=dm.eval_splits, - task_name=dm.task_name, +# %% +trainer = pl.Trainer( + enable_progress_bar=show_progress, + precision=16, + gpus=AVAIL_GPUS, + callbacks=callbacks, + logger=logger, ) - -trainer = Trainer(max_epochs=3, gpus=AVAIL_GPUS) -trainer.fit(model, dm) +trainer.fit(model, datamodule=dm) # %% [markdown] -# ### MNLI +# ## Footnotes # -# - The MNLI dataset is huge, so we aren't going to bother trying to train on it here. -# - We will skip over training and go straight to validation. +#
    +#
  1. # -# See an interactive view of the -# MRPC dataset in [NLP Viewer](https://huggingface.co/nlp/viewer/?dataset=glue&config=mnli) - -# %% -dm = GLUEDataModule( - model_name_or_path="distilbert-base-cased", - task_name="mnli", -) -dm.setup("fit") -model = GLUETransformer( - model_name_or_path="distilbert-base-cased", - num_labels=dm.num_labels, - eval_splits=dm.eval_splits, - task_name=dm.task_name, -) - -trainer = Trainer(gpus=AVAIL_GPUS, progress_bar_refresh_rate=20) -trainer.validate(model, dm.val_dataloader()) +# [Howard, J., & Ruder, S. (2018)](https://arxiv.org/pdf/1801.06146.pdf). Fine-tuned Language +# Models for Text Classification. ArXiv, abs/1801.06146. [↩](#a1) +# +#
  2. +#
  3. +# +# [Chronopoulou, A., Baziotis, C., & Potamianos, A. (2019)](https://arxiv.org/pdf/1902.10547.pdf). +# An embarrassingly simple approach for transfer learning from pretrained language models. arXiv +# preprint arXiv:1902.10547. [↩](#a1) +# +#
  4. +#
  5. +# +# [Peters, M. E., Ruder, S., & Smith, N. A. (2019)](https://arxiv.org/pdf/1903.05987.pdf). To tune or not to +# tune? adapting pretrained representations to diverse tasks. arXiv preprint arXiv:1903.05987. [↩](#a1) +# +#
  6. +# diff --git a/lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif b/lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7b7f8db3448e4ec73a18524be7b713c25d6acdc GIT binary patch literal 302052 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%0AWa3=4MR-MPU$zq;I(l!jKXzf*=fO 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 + + + + + + + image/svg+xml + + + + + + + + + From 3a42523e9f3a1fc03c1f4586cfa9b8aeea510abf Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Mon, 29 Nov 2021 19:48:08 -0800 Subject: [PATCH 13/44] tweak md format to H2 and update meta info --- lightning_examples/finetuning-scheduler/.meta.yml | 6 +++--- .../finetuning-scheduler/finetuning-scheduler.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 33296fba5..d1cfeb47d 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -1,7 +1,7 @@ title: Finetuning Scheduler author: Dan Dale -created: 2021-11-26 -updated: 2021-11-26 +created: 2021-11-29 +updated: 2021-11-29 license: CC BY-SA build: 1 tags: @@ -10,7 +10,7 @@ description: | This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/) with iterative earlystopping defined according to a user-specified - schedule. It uses HuggingFace's `datasets` and `transformers`` libraries to retrieve the relevant benchmark data and + schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and foundational model weights. requirements: - transformers diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 9669cb632..4a38f96c4 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -15,7 +15,7 @@ # --- # %% [markdown] -# # Scheduled Finetuning +# ## Scheduled Finetuning # #
    # @@ -150,7 +150,7 @@ # %% [markdown] #
    # -# # Scheduled Finetuning For SuperGLUE +# ## Scheduled Finetuning For SuperGLUE # # The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # From 7ddbcd4a6a47478f607f046fbf4b22986e84f690 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Tue, 30 Nov 2021 10:57:11 -0800 Subject: [PATCH 14/44] update tutorial reqs --- docs/requirements.txt | 3 + .../finetuning-scheduler/.meta.yml | 11 +- .../finetuning-scheduler.py | 108 ++++++------------ .../fts_explicit_loss_anim.gif | Bin 302052 -> 172945 bytes 4 files changed, 44 insertions(+), 78 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index f721f461a..cd93ce2ee 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,6 +6,9 @@ docutils>=0.16 sphinx-paramlinks>=0.4.0 ipython[notebook] +# temporarily included until hub available to evaluate finetuning_scheduler +git+git://github.com/speediedan/pytorch-lightning.git@24d3e43568814ec381ac5be91627629808d62081#egg=pytorch-lightning + https://github.com/PyTorchLightning/lightning_sphinx_theme/archive/master.zip#egg=pt-lightning-sphinx-theme -r ../.actions/requirements.txt diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index d1cfeb47d..3b63b73e5 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -7,13 +7,14 @@ build: 1 tags: - finetuning description: | - This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune - a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task - of [SuperGLUE](https://super.gluebenchmark.com/) with iterative earlystopping defined according to a user-specified - schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data and - foundational model weights. + This notebook introduces the FinetuningScheduler callback and demonstrates the use of FinetuningScheduler to finetune + a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task + of [SuperGLUE](https://super.gluebenchmark.com/) with iterative early-stopping defined according to a user-specified + schedule. It uses HuggingFace's ``datasets`` and ``transformers`` libraries to retrieve the relevant benchmark data + and foundational model weights. requirements: - transformers - datasets + - scikit-learn accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 4a38f96c4..5aab8f6df 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # --- # jupyter: # jupytext: @@ -7,7 +6,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.13.1 +# jupytext_version: 1.13.2 # kernelspec: # display_name: 'Python 3.7.11 64-bit (''pldev_tutorials'': conda)' # language: python @@ -84,7 +83,7 @@ # ``` # %% [markdown] -# ## EarlyStopping and Epoch-Driven Phase Transition Criteria +# ## Early-Stopping and Epoch-Driven Phase Transition Criteria # # # By default, ``FTSEarlyStopping`` and epoch-driven @@ -155,28 +154,26 @@ # The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # # ``FinetuningScheduler`` can be used to achieve non-trivial model performance improvements in both implicit and explicit scheduling contexts at an also non-trivial computational cost. +# # %% +import logging import os import warnings from datetime import datetime -from typing import Any, Dict, List, Optional, Tuple, Union from importlib import import_module -import logging - -import torch -from torch.utils.data import DataLoader +from typing import Any, Dict, List, Optional, Tuple, Union +import datasets import pytorch_lightning as pl +import torch +from pytorch_lightning.loggers.tensorboard import TensorBoardLogger from pytorch_lightning.utilities import rank_zero_warn from pytorch_lightning.utilities.cli import CALLBACK_REGISTRY, _Registry from pytorch_lightning.utilities.exceptions import MisconfigurationException -from pytorch_lightning.loggers.tensorboard import TensorBoardLogger - -import datasets +from torch.utils.data import DataLoader from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer - # %% # a couple helper functions to prepare code to work with the forthcoming hub and user module registry MOCK_HUB_REGISTRY = _Registry() @@ -195,17 +192,13 @@ def module_hub_mock(key: str, require_fqn: bool = False) -> List: globals()[f"{n}"] = c registered_list = ", ".join([n for n in MOCK_HUB_REGISTRY.names]) else: - registered_list = ", ".join( - [c.__module__ + "." + c.__name__ for c in MOCK_HUB_REGISTRY.classes] - ) + registered_list = ", ".join([c.__module__ + "." + c.__name__ for c in MOCK_HUB_REGISTRY.classes]) print(f"Imported and registered the following callbacks: {registered_list}") -def instantiate_registered_class( - init: Dict[str, Any], args: Optional[Union[Any, Tuple[Any, ...]]] = None -) -> Any: - """Instantiates a class with the given args and init. Accepts class definitions in the form - of a "class_path" or "callback_key" associated with a _Registry +def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, Tuple[Any, ...]]] = None) -> Any: + """Instantiates a class with the given args and init. Accepts class definitions in the form of a "class_path" + or "callback_key" associated with a _Registry. Args: init: Dict of the form {"class_path":... or "callback_key":..., "init_args":...}. @@ -225,17 +218,16 @@ def instantiate_registered_class( else: # class is expected to be locally defined args_class = globals()[init["class_path"]] elif init.get("callback_key", None): - callback_path = CALLBACK_REGISTRY.get( + callback_path = CALLBACK_REGISTRY.get(init["callback_key"], None) or MOCK_HUB_REGISTRY.get( init["callback_key"], None - ) or MOCK_HUB_REGISTRY.get(init["callback_key"], None) + ) assert callback_path, MisconfigurationException( f'specified callback_key {init["callback_key"]} has not been registered' ) class_module, class_name = callback_path.__module__, callback_path.__name__ else: raise MisconfigurationException( - "Neither a class_path nor callback_key were included in a configuration that" - "requires one" + "Neither a class_path nor callback_key were included in a configuration that" "requires one" ) if not shortcircuit_local: module = __import__(class_module, fromlist=[class_name]) @@ -266,7 +258,7 @@ def instantiate_registered_class( # %% class RteBoolqDataModule(pl.LightningDataModule): - """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets""" + """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets.""" task_text_field_map = {"rte": ["premise", "hypothesis"], "boolq": ["question", "passage"]} loader_columns = [ @@ -306,12 +298,8 @@ def __init__( self.text_fields = self.task_text_field_map[self.task_name] self.num_labels = TASK_NUM_LABELS[self.task_name] os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.tokenizers_parallelism else "false" - self.tokenizer = AutoTokenizer.from_pretrained( - self.model_name_or_path, use_fast=True, local_files_only=False - ) - if ( - prep_on_init - ): # useful if one wants to load datasets as soon as the ``LightningDataModule`` is + self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True, local_files_only=False) + if prep_on_init: # useful if one wants to load datasets as soon as the ``LightningDataModule`` is # instantiated self.prepare_data() self.setup("fit") @@ -322,9 +310,7 @@ def setup(self, stage): self.dataset[split] = self.dataset[split].map( self.convert_to_features, batched=True, remove_columns=["label"] ) - self.columns = [ - c for c in self.dataset[split].column_names if c in self.loader_columns - ] + self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns] self.dataset[split].set_format(type="torch", columns=self.columns) self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] @@ -335,9 +321,7 @@ def prepare_data(self): datasets.load_dataset("super_glue", self.task_name) def train_dataloader(self): - return DataLoader( - self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs - ) + return DataLoader(self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs) def val_dataloader(self): if len(self.eval_splits) == 1: @@ -348,29 +332,21 @@ def val_dataloader(self): ) elif len(self.eval_splits) > 1: return [ - DataLoader( - self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs - ) + DataLoader(self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs) for x in self.eval_splits ] def test_dataloader(self): if len(self.eval_splits) == 1: - return DataLoader( - self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs - ) + return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs) elif len(self.eval_splits) > 1: return [ - DataLoader( - self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs - ) + DataLoader(self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs) for x in self.eval_splits ] def convert_to_features(self, example_batch): - text_pairs = list( - zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]]) - ) + text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) # Tokenize the text/text pairs features = self.tokenizer.batch_encode_plus( text_pairs, max_length=self.max_seq_length, padding="longest", truncation=True @@ -382,10 +358,8 @@ def convert_to_features(self, example_batch): # %% class RteBoolqModule(pl.LightningModule): - """A ``LightningModule`` that can be used to finetune a foundational - model on either the RTE or BoolQ SuperGLUE tasks using Hugging Face - implementations of a given model and the `SuperGLUE Hugging Face dataset. - """ + """A ``LightningModule`` that can be used to finetune a foundational model on either the RTE or BoolQ SuperGLUE + tasks using Hugging Face implementations of a given model and the `SuperGLUE Hugging Face dataset.""" def __init__( self, @@ -396,7 +370,6 @@ def __init__( model_cfg: Optional[Dict[str, Any]] = None, task_name: str = DEFAULT_TASK, experiment_tag: str = "default", - plot_liveloss: bool = False, ): """ Args: @@ -414,29 +387,20 @@ def __init__( super().__init__() self.optimizer_init = optimizer_init self.lr_scheduler_init = lr_scheduler_init - self.plot_liveloss = plot_liveloss self.pl_lrs_cfg = pl_lrs_cfg or {} if task_name in TASK_NUM_LABELS.keys(): self.task_name = task_name else: self.task_name = DEFAULT_TASK - rank_zero_warn( - f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'" - ) + rank_zero_warn(f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'") self.num_labels = TASK_NUM_LABELS[self.task_name] self.save_hyperparameters() self.experiment_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}" self.model_cfg = model_cfg or {} - conf = AutoConfig.from_pretrained( - model_name_or_path, num_labels=self.num_labels, local_files_only=False - ) - self.model = AutoModelForSequenceClassification.from_pretrained( - model_name_or_path, config=conf - ) + conf = AutoConfig.from_pretrained(model_name_or_path, num_labels=self.num_labels, local_files_only=False) + self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=conf) self.model.config.update(self.model_cfg) # apply model config overrides - self.metric = datasets.load_metric( - "super_glue", self.task_name, experiment_id=self.experiment_id - ) + self.metric = datasets.load_metric("super_glue", self.task_name, experiment_id=self.experiment_id) self.no_decay = ["bias", "LayerNorm.weight"] self.finetuningscheduler_callback = None @@ -476,8 +440,8 @@ def validation_epoch_end(self, outputs): return loss def init_pgs(self) -> List[Dict]: - """Initialize the parameter groups. Used to ensure weight_decay is not applied - to our specified bias parameters when we initialize the optimizer. + """Initialize the parameter groups. Used to ensure weight_decay is not applied to our specified bias + parameters when we initialize the optimizer. Returns: List[Dict]: A list of parameter group dictionaries. @@ -510,9 +474,7 @@ def configure_optimizers(self): # performance difference) optimizer = instantiate_registered_class(args=self.init_pgs(), init=self.optimizer_init) scheduler = { - "scheduler": instantiate_registered_class( - args=optimizer, init=self.lr_scheduler_init - ), + "scheduler": instantiate_registered_class(args=optimizer, init=self.lr_scheduler_init), **self.pl_lrs_cfg, } return [optimizer], [scheduler] @@ -568,7 +530,7 @@ def configure_callbacks(self): callbacks = [ FinetuningScheduler(ft_schedule=ft_schedule_name, max_depth=2), # type: ignore # noqa FTSEarlyStopping(monitor="val_loss", min_delta=0.001, patience=2), # type: ignore # noqa - FTSCheckpoint(monitor="val_loss", save_top_k=5), # type: ignore # noqa + FTSCheckpoint(monitor="val_loss", save_top_k=5), # type: ignore # noqa ] example_logdir = "lightning_logs" logger = TensorBoardLogger(example_logdir, name="fts_explicit") diff --git a/lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif b/lightning_examples/finetuning-scheduler/fts_explicit_loss_anim.gif index b7b7f8db3448e4ec73a18524be7b713c25d6acdc..7451f65c0974bdab9c70da5f2c9099ad5eab1083 100644 GIT binary patch delta 142 zcmV;90CE51w-S-Z3b0p%m!Qr8_m?kI0YI~St}RoS!1)2zmoI(++_!;M0XQeOAo&4@ z1Gl)T0pTgPfcXO{0k=#30TwEkpdfNr{Q^5Hm(SA! wOt)!M1Nj)(+S6Vh%xOaK4? delta 82050 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
    6esg%DH8Xp{3cEY^b2x>X3nX_>5mN*=>;KV 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

    p!9fWX!9>Ux18xRP$9&s>2gQ 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

    yykX)%|m?+;)!%#^ZvO1F>T-X<5ekN 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 Date: Wed, 1 Dec 2021 14:45:57 -0800 Subject: [PATCH 15/44] stick to markdown w/o html wherever possible, remove temporary fts requirement --- docs/requirements.txt | 3 --- .../finetuning-scheduler.py | 19 ++----------------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index cd93ce2ee..f721f461a 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,9 +6,6 @@ docutils>=0.16 sphinx-paramlinks>=0.4.0 ipython[notebook] -# temporarily included until hub available to evaluate finetuning_scheduler -git+git://github.com/speediedan/pytorch-lightning.git@24d3e43568814ec381ac5be91627629808d62081#egg=pytorch-lightning - https://github.com/PyTorchLightning/lightning_sphinx_theme/archive/master.zip#egg=pt-lightning-sphinx-theme -r ../.actions/requirements.txt diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 5aab8f6df..027275b92 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,18 +1,3 @@ -# --- -# jupyter: -# jupytext: -# formats: ipynb,py:percent -# text_representation: -# extension: .py -# format_name: percent -# format_version: '1.3' -# jupytext_version: 1.13.2 -# kernelspec: -# display_name: 'Python 3.7.11 64-bit (''pldev_tutorials'': conda)' -# language: python -# name: python3 -# --- - # %% [markdown] # ## Scheduled Finetuning # @@ -34,7 +19,7 @@ # final phase of the schedule has its stopping criteria met. See # the [early stopping documentation](https://pytorch-lightning.readthedocs.io/en/latest/extensions/generated/pytorch_lightning.callbacks.EarlyStopping.html) for more details on that callback's configuration. # -# +# ![FinetuningScheduler explicit loss animation](fts_explicit_loss_anim.gif) # %% [markdown] # ## Basic Usage @@ -416,7 +401,7 @@ def training_epoch_end(self, outputs: List[Any]) -> None: loss = torch.stack([x["loss"] for x in outputs]).mean() self.log("train_loss", loss, prog_bar=True, sync_dist=True) if self.finetuningscheduler_callback: - self.log("finetuning_schedule_depth", self.finetuningscheduler_callback.curr_depth) + self.log("finetuning_schedule_depth", float(self.finetuningscheduler_callback.curr_depth)) def validation_step(self, batch, batch_idx, dataloader_idx=0): outputs = self(**batch) From b250845e601a43db7adad699b49cac8f941cbc65 Mon Sep 17 00:00:00 2001 From: Dan Dale Date: Thu, 2 Dec 2021 09:06:05 -0800 Subject: [PATCH 16/44] Update lightning_examples/finetuning-scheduler/finetuning-scheduler.py Co-authored-by: thomas chaton --- .../finetuning-scheduler.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 027275b92..9cc473742 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -24,7 +24,7 @@ # %% [markdown] # ## Basic Usage # -# If no finetuning schedule is user-provided, ``FinetuningScheduler`` will generate a +# If no finetuning schedule is provided by the user, ``FinetuningScheduler`` will generate a # [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, using default ``FTSEarlyStopping`` and ``FTSCheckpoint`` callbacks with ``monitor=val_loss``. # # ```python @@ -268,9 +268,8 @@ def __init__( max_seq_length: int = 128, train_batch_size: int = 32, eval_batch_size: int = 32, - pin_memory: bool = False, tokenizers_parallelism: bool = True, - num_workers: int = 0, + **dataloader_kwargs: Any, ): super().__init__() self.model_name_or_path = model_name_or_path @@ -399,7 +398,7 @@ def training_step(self, batch, batch_idx): def training_epoch_end(self, outputs: List[Any]) -> None: loss = torch.stack([x["loss"] for x in outputs]).mean() - self.log("train_loss", loss, prog_bar=True, sync_dist=True) + self.log("train_loss", loss, prog_bar=True) if self.finetuningscheduler_callback: self.log("finetuning_schedule_depth", float(self.finetuningscheduler_callback.curr_depth)) @@ -424,14 +423,14 @@ def validation_epoch_end(self, outputs): self.log_dict(metric_dict, prog_bar=True, sync_dist=True) return loss - def init_pgs(self) -> List[Dict]: + def _init_param_groups(self) -> List[Dict]: """Initialize the parameter groups. Used to ensure weight_decay is not applied to our specified bias parameters when we initialize the optimizer. Returns: List[Dict]: A list of parameter group dictionaries. """ - pgs = [ + return [ { "params": [ p @@ -449,7 +448,6 @@ def init_pgs(self) -> List[Dict]: "weight_decay": 0.0, }, ] - return pgs def configure_optimizers(self): # the phase 0 parameters will have been set to require gradients during setup @@ -472,7 +470,7 @@ def configure_callbacks(self): # %% -# let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it +# Let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it # Please see the documentation for a full description of the schedule format ft_schedule_yaml = """ 0: @@ -527,13 +525,14 @@ def configure_callbacks(self): # # %load_ext tensorboard # # %tensorboard --logdir example_logdir # disable progress bar by default to focus on multi-phase training logs. Set to True to re-enable if desired -show_progress = False +enable_progress_bar = False # %% trainer = pl.Trainer( - enable_progress_bar=show_progress, + enable_progress_bar=enable_progress_bar, precision=16, - gpus=AVAIL_GPUS, + accelerator="auto", + devices="auto", callbacks=callbacks, logger=logger, ) From 8077909c3193d68d06cfa22efe372421d99a21d4 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Thu, 2 Dec 2021 14:34:09 -0800 Subject: [PATCH 17/44] additional tuning literature references and several additional recommended improvements for finetuning_scheduler tutorial --- .../finetuning-scheduler.py | 182 +++++++++++------- 1 file changed, 115 insertions(+), 67 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 9cc473742..52a10fb23 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -100,7 +100,8 @@ # ```python # from pytorch_lightning import Trainer # from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler -# trainer = Trainer(callbacks=[FinetuningScheduler()], resume_from_checkpoint="some/path/to/my_checkpoint.ckpt") +# trainer = Trainer(callbacks=[FinetuningScheduler()]) +# trainer.fit(..., ckpt_path="some/path/to/my_checkpoint.ckpt") # ``` # # Training will resume at the depth/level of the provided checkpoint according the specified schedule. Schedules can be altered between training sessions but schedule compatibility is left to the user for maximal flexibility. If executing a user-defined schedule, typically the same schedule should be provided for the original and resumed training sessions. @@ -108,10 +109,8 @@ # By default (``FinetuningScheduler.restore_best`` is ``True``), ``FinetuningScheduler`` will attempt to restore the best available checkpoint before finetuning depth transitions. # # ```python -# trainer = Trainer( -# callbacks=[FinetuningScheduler(new_incarnation_mode=True)], -# resume_from_checkpoint="some/path/to/my_kth_best_checkpoint.ckpt", -# ) +# trainer = Trainer(callbacks=[FinetuningScheduler(new_incarnation_mode=True)]) +# trainer.fit(..., ckpt_path="some/path/to/my_kth_best_checkpoint.ckpt") # ``` # # To handle the edge case wherein one is resuming scheduled finetuning from a non-best checkpoint and the previous best checkpoints may not be accessible, setting ``FinetuningScheduler.new_incarnation_mode`` to @@ -120,14 +119,12 @@ # %% [markdown] #

    @@ -142,7 +139,6 @@ # # %% -import logging import os import warnings from datetime import datetime @@ -160,24 +156,24 @@ from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer # %% -# a couple helper functions to prepare code to work with the forthcoming hub and user module registry -MOCK_HUB_REGISTRY = _Registry() +# a couple helper functions to prepare code to work with a user module registry +MOCK_REGISTRY = _Registry() -def module_hub_mock(key: str, require_fqn: bool = False) -> List: +def mock_register_module(key: str, require_fqn: bool = False) -> List: if key.lower() == "finetuningscheduler": mod = import_module("pytorch_lightning.callbacks.finetuning_scheduler") - MOCK_HUB_REGISTRY.register_classes(mod, pl.callbacks.Callback) + MOCK_REGISTRY.register_classes(mod, pl.callbacks.Callback) else: raise MisconfigurationException(f"user module key '{key}' not found") registered_list = [] # make registered class available by unqualified class name by default if not require_fqn: - for n, c in MOCK_HUB_REGISTRY.items(): + for n, c in MOCK_REGISTRY.items(): globals()[f"{n}"] = c - registered_list = ", ".join([n for n in MOCK_HUB_REGISTRY.names]) + registered_list = ", ".join([n for n in MOCK_REGISTRY.names]) else: - registered_list = ", ".join([c.__module__ + "." + c.__name__ for c in MOCK_HUB_REGISTRY.classes]) + registered_list = ", ".join([c.__module__ + "." + c.__name__ for c in MOCK_REGISTRY.classes]) print(f"Imported and registered the following callbacks: {registered_list}") @@ -203,7 +199,7 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, else: # class is expected to be locally defined args_class = globals()[init["class_path"]] elif init.get("callback_key", None): - callback_path = CALLBACK_REGISTRY.get(init["callback_key"], None) or MOCK_HUB_REGISTRY.get( + callback_path = CALLBACK_REGISTRY.get(init["callback_key"], None) or MOCK_REGISTRY.get( init["callback_key"], None ) assert callback_path, MisconfigurationException( @@ -222,31 +218,24 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, # %% # load the pl extension module we want to use. This will import all necessary callbacks. -module_hub_mock("finetuningscheduler") +mock_register_module("finetuningscheduler") # set notebook-level variables -AVAIL_GPUS = min(1, torch.cuda.device_count()) +AVAIL_GPUS = torch.cuda.device_count() TASK_NUM_LABELS = {"boolq": 2, "rte": 2} DEFAULT_TASK = "rte" -# narrow our logging to adapt it for a notebook environment -for l_key in logging.Logger.manager.loggerDict.keys(): - if "pytorch_lightning" in l_key: - logging.getLogger(l_key).setLevel("INFO") - else: - logging.getLogger(l_key).setLevel("CRITICAL") -pl_logger = logging.getLogger("pytorch_lightning") -pl_logger.removeHandler(pl_logger.handlers[0]) -rz_logger = logging.getLogger("pytorch_lightning.utilities.distributed") -rz_logger.addHandler(logging.StreamHandler()) -rz_logger.handlers[0].setLevel("INFO") +# ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and +# expected logging behavior +for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: + warnings.filterwarnings("ignore", warnf) # %% class RteBoolqDataModule(pl.LightningDataModule): """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets.""" - task_text_field_map = {"rte": ["premise", "hypothesis"], "boolq": ["question", "passage"]} - loader_columns = [ + TASK_TEXT_FIELD_MAP = {"rte": ("premise", "hypothesis"), "boolq": ("question", "passage")} + LOADER_COLUMNS = ( "datasets_idx", "input_ids", "token_type_ids", @@ -254,17 +243,12 @@ class RteBoolqDataModule(pl.LightningDataModule): "start_positions", "end_positions", "labels", - ] - # ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and - # expected logging behavior - for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: - warnings.filterwarnings("ignore", warnf) + ) def __init__( self, model_name_or_path: str, task_name: str = DEFAULT_TASK, - prep_on_init: bool = False, max_seq_length: int = 128, train_batch_size: int = 32, eval_batch_size: int = 32, @@ -278,23 +262,22 @@ def __init__( self.train_batch_size = train_batch_size self.eval_batch_size = eval_batch_size self.tokenizers_parallelism = tokenizers_parallelism - self.dataloader_kwargs = {"num_workers": num_workers, "pin_memory": pin_memory} - self.text_fields = self.task_text_field_map[self.task_name] + self.dataloader_kwargs = { + "num_workers": dataloader_kwargs.get("num_workers", 0), + "pin_memory": dataloader_kwargs.get("pin_memory", False), + } + self.text_fields = self.TASK_TEXT_FIELD_MAP[self.task_name] self.num_labels = TASK_NUM_LABELS[self.task_name] os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.tokenizers_parallelism else "false" self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True, local_files_only=False) - if prep_on_init: # useful if one wants to load datasets as soon as the ``LightningDataModule`` is - # instantiated - self.prepare_data() - self.setup("fit") def setup(self, stage): self.dataset = datasets.load_dataset("super_glue", self.task_name) for split in self.dataset.keys(): self.dataset[split] = self.dataset[split].map( - self.convert_to_features, batched=True, remove_columns=["label"] + self._convert_to_features, batched=True, remove_columns=["label"] ) - self.columns = [c for c in self.dataset[split].column_names if c in self.loader_columns] + self.columns = [c for c in self.dataset[split].column_names if c in self.LOADER_COLUMNS] self.dataset[split].set_format(type="torch", columns=self.columns) self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] @@ -329,7 +312,7 @@ def test_dataloader(self): for x in self.eval_splits ] - def convert_to_features(self, example_batch): + def _convert_to_features(self, example_batch): text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) # Tokenize the text/text pairs features = self.tokenizer.batch_encode_plus( @@ -412,15 +395,15 @@ def validation_step(self, batch, batch_idx, dataloader_idx=0): preds = logits.squeeze() labels = batch["labels"] + self.log("val_loss", val_loss, prog_bar=True) return {"loss": val_loss, "preds": preds, "labels": labels} def validation_epoch_end(self, outputs): preds = torch.cat([x["preds"] for x in outputs]).detach().cpu().numpy() labels = torch.cat([x["labels"] for x in outputs]).detach().cpu().numpy() loss = torch.stack([x["loss"] for x in outputs]).mean() - self.log("val_loss", loss, prog_bar=True, sync_dist=True) metric_dict = self.metric.compute(predictions=preds, references=labels) - self.log_dict(metric_dict, prog_bar=True, sync_dist=True) + self.log_dict(metric_dict, prog_bar=True) return loss def _init_param_groups(self) -> List[Dict]: @@ -455,7 +438,7 @@ def configure_optimizers(self): # but in this case we pass a list of parameter groups to ensure weight_decay is # not applied to the bias parameter (for completeness, in this case it won't make much # performance difference) - optimizer = instantiate_registered_class(args=self.init_pgs(), init=self.optimizer_init) + optimizer = instantiate_registered_class(args=self._init_param_groups(), init=self.optimizer_init) scheduler = { "scheduler": instantiate_registered_class(args=optimizer, init=self.lr_scheduler_init), **self.pl_lrs_cfg, @@ -485,6 +468,8 @@ def configure_callbacks(self): - model.albert.encoder.*.ffn_output.* """ ft_schedule_name = "RteBoolqModule_ft_schedule_albert_base.yaml" +# Let's write the schedule to a file so we can simulate loading an explicitly defined finetuning +# schedule. with open(ft_schedule_name, "w") as f: f.write(ft_schedule_yaml) @@ -492,17 +477,52 @@ def configure_callbacks(self): datasets.set_progress_bar_enabled(False) pl.seed_everything(42) dm = RteBoolqDataModule(model_name_or_path="albert-base-v2", tokenizers_parallelism=False) -dm.setup("fit") + +# %% [markdown] +# ### Optimizer Configuration +# +#
    +# +# Though other optimizers can arguably yield some marginal advantage contingent on the context, +# the Adam optimizer (and the [AdamW version](https://pytorch.org/docs/stable/_modules/torch/optim/adamw.html#AdamW) which +# implements decoupled weight decay) remains robust to hyperparameter choices and is commonly used for finetuning +# foundational language models. See [(Sivaprasad et al., 2020)](#f2) and [(Mosbach, Andriushchenko & Klakow, 2020)](#f3) for theoretical and systematic empirical justifications of Adam and its use in finetuning +# large transformer-based language models. The values used here have some justification +# in the referenced literature but have been largely empirically determined and while a good +# starting point could be could be further tuned. +# +#
    + +# %% optimizer_init = { "class_path": "torch.optim.AdamW", "init_args": {"weight_decay": 1e-05, "eps": 1e-07, "lr": 1e-05}, } + +# %% [markdown] +# ### LR Scheduler Configuration +# +#
    +# +# The [CosineAnnealingWarmRestarts scheduler](https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.CosineAnnealingWarmRestarts.html?highlight=cosineannealingwarm#torch.optim.lr_scheduler.CosineAnnealingWarmRestarts) nicely fits with our iterative finetuning since it does not depend upon a global max_epoch +# value. The importance of initial warmup is reduced due to the innate warmup effect of Adam bias correction [[5]](#f3) +# and the gradual thawing we are performing. Note that commonly used LR schedulers that depend on providing +# max_iterations/epochs (e.g. the +# [CosineWarmupScheduler](https://github.com/PyTorchLightning/lightning-tutorials/blob/0c325829101d5a6ebf32ed99bbf5b09badf04a59/course_UvA-DL/05-transformers-and-MH-attention/Transformers_MHAttention.py#L688) +# used in other pytorch-lightning tutorials) also work with FinetuningScheduler. Though the LR scheduler is theoretically +# justified [(Loshchilov & Hutter, 2016)](#f4), the particular values provided here are primarily empircally driven. +# +#
    + + +# %% lr_scheduler_init = { "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, } pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} +# %% model = RteBoolqModule( model_name_or_path="albert-base-v2", optimizer_init=optimizer_init, @@ -528,15 +548,23 @@ def configure_callbacks(self): enable_progress_bar = False # %% -trainer = pl.Trainer( - enable_progress_bar=enable_progress_bar, - precision=16, - accelerator="auto", - devices="auto", - callbacks=callbacks, - logger=logger, -) -trainer.fit(model, datamodule=dm) +def train() -> None: + trainer = pl.Trainer( + enable_progress_bar=enable_progress_bar, + precision=16, + gpus=1, + # accelerator="auto", + # devices="auto", + callbacks=callbacks, + logger=logger, + ) + trainer.fit(model, datamodule=dm) + + +if AVAIL_GPUS > 0: + train() +else: + print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") # %% [markdown] # ## Footnotes @@ -560,5 +588,25 @@ def configure_callbacks(self): # [Peters, M. E., Ruder, S., & Smith, N. A. (2019)](https://arxiv.org/pdf/1903.05987.pdf). To tune or not to # tune? adapting pretrained representations to diverse tasks. arXiv preprint arXiv:1903.05987. [↩](#a1) # -# -# +# +#
  7. +# +# [Sivaprasad, P. T., Mai, F., Vogels, T., Jaggi, M., & Fleuret, F. (2020)](https://arxiv.org/pdf/1910.11758.pdf). +# Optimizer benchmarking needs to account for hyperparameter tuning. In International Conference on Machine Learning +# (pp. 9036-9045). PMLR. [↩](#a2) +# +#
  8. +#
  9. +# +# [Mosbach, M., Andriushchenko, M., & Klakow, D. (2020)](https://arxiv.org/pdf/2006.04884.pdf). On the stability of +# fine-tuning bert: Misconceptions, explanations, and strong baselines. arXiv preprint arXiv:2006.04884. [↩](#a2) +# +#
  10. +#
  11. +# +# [Loshchilov, I., & Hutter, F. (2016)](https://arxiv.org/pdf/1608.03983.pdf). Sgdr: Stochastic gradient descent with +# warm restarts. arXiv preprint arXiv:1608.03983. [↩](#a3) +# +#
  12. +# +#
From d1429fa103c48f85bf2b111d222c73342401cb2d Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Sat, 4 Dec 2021 14:34:37 -0800 Subject: [PATCH 18/44] misc tutorial enhancements --- .../finetuning-scheduler.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 52a10fb23..37729e295 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,3 +1,15 @@ +# --- +# jupyter: +# jupytext: +# cell_metadata_filter: -all +# formats: ipynb,py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.13.2 +# --- + # %% [markdown] # ## Scheduled Finetuning # @@ -396,6 +408,7 @@ def validation_step(self, batch, batch_idx, dataloader_idx=0): labels = batch["labels"] self.log("val_loss", val_loss, prog_bar=True) + return {"loss": val_loss, "preds": preds, "labels": labels} def validation_epoch_end(self, outputs): @@ -518,7 +531,8 @@ def configure_callbacks(self): # %% lr_scheduler_init = { "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", - "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, + # "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, + "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 0}, } pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} @@ -551,10 +565,10 @@ def configure_callbacks(self): def train() -> None: trainer = pl.Trainer( enable_progress_bar=enable_progress_bar, + # max_epochs=1, precision=16, - gpus=1, - # accelerator="auto", - # devices="auto", + accelerator="gpu", + devices=1, callbacks=callbacks, logger=logger, ) From 3fc3887b990c509ac0e4a082eb8cd53c19fbac7d Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Wed, 8 Dec 2021 12:33:03 -0800 Subject: [PATCH 19/44] numerous expository enhancements and switch to DeBERTav3 --- .../finetuning-scheduler/.meta.yml | 1 + ...eBoolqModule_ft_schedule_deberta_base.yaml | 18 ++ .../finetuning-scheduler.py | 233 +++++++++++++----- .../fts_explicit_accuracy.png | Bin 0 -> 24409 bytes .../implicit_training_transition.png | Bin 0 -> 22919 bytes .../nofts_baseline_accuracy.png | Bin 0 -> 24750 bytes 6 files changed, 197 insertions(+), 55 deletions(-) create mode 100644 lightning_examples/finetuning-scheduler/RteBoolqModule_ft_schedule_deberta_base.yaml create mode 100644 lightning_examples/finetuning-scheduler/fts_explicit_accuracy.png create mode 100644 lightning_examples/finetuning-scheduler/implicit_training_transition.png create mode 100644 lightning_examples/finetuning-scheduler/nofts_baseline_accuracy.png diff --git a/lightning_examples/finetuning-scheduler/.meta.yml b/lightning_examples/finetuning-scheduler/.meta.yml index 3b63b73e5..6954f680c 100644 --- a/lightning_examples/finetuning-scheduler/.meta.yml +++ b/lightning_examples/finetuning-scheduler/.meta.yml @@ -16,5 +16,6 @@ requirements: - transformers - datasets - scikit-learn + - sentencepiece accelerator: - GPU diff --git a/lightning_examples/finetuning-scheduler/RteBoolqModule_ft_schedule_deberta_base.yaml b/lightning_examples/finetuning-scheduler/RteBoolqModule_ft_schedule_deberta_base.yaml new file mode 100644 index 000000000..62bdbae28 --- /dev/null +++ b/lightning_examples/finetuning-scheduler/RteBoolqModule_ft_schedule_deberta_base.yaml @@ -0,0 +1,18 @@ + +0: + params: + - model.classifier.bias + - model.classifier.weight + - model.pooler.dense.bias + - model.pooler.dense.weight + - model.deberta.encoder.LayerNorm.bias + - model.deberta.encoder.LayerNorm.weight + - model.deberta.encoder.rel_embeddings.weight + - model.deberta.encoder.layer.{0,11}.(output|attention|intermediate).* +1: + params: + - model.deberta.embeddings.LayerNorm.bias + - model.deberta.embeddings.LayerNorm.weight +2: + params: + - model.deberta.embeddings.word_embeddings.weight diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 37729e295..968395d0c 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -1,25 +1,21 @@ -# --- -# jupyter: -# jupytext: -# cell_metadata_filter: -all -# formats: ipynb,py:percent -# text_representation: -# extension: .py -# format_name: percent -# format_version: '1.3' -# jupytext_version: 1.13.2 -# --- - # %% [markdown] # ## Scheduled Finetuning # +# Training with the ``FinetuningScheduler`` callback confers a host of benefits. It was created to meet the following +# objectives in roughly descending order of priority: +# +# - maximize finetuning flexibility +# - expedite and facilitate exploration of model tuning dynamics in research +# - allow marginal performance improvements of finetuned models +# #
# -# The ``FinetuningScheduler`` callback enables multi-phase, -# scheduled finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize +# Fundamentally, the ``FinetuningScheduler`` callback enables scheduled, multi-phase, +# finetuning of foundational models. Gradual unfreezing (i.e. thawing) can help maximize # foundational model knowledge retention while allowing (typically upper layers of) the model to # optimally adapt to new tasks during transfer learning [1, 2, 3](#f1) # +# #
# # ``FinetuningScheduler`` orchestrates the gradual unfreezing @@ -34,11 +30,16 @@ # ![FinetuningScheduler explicit loss animation](fts_explicit_loss_anim.gif) # %% [markdown] +# # ## Basic Usage # +#
+# # If no finetuning schedule is provided by the user, ``FinetuningScheduler`` will generate a # [default schedule](#The-Default-Finetuning-Schedule) and proceed to finetune according to the generated schedule, using default ``FTSEarlyStopping`` and ``FTSCheckpoint`` callbacks with ``monitor=val_loss``. # +#
+# # ```python # from pytorch_lightning import Trainer # from pytorch_lightning.callbacks.finetuning_scheduler import FinetuningScheduler @@ -49,7 +50,7 @@ # ## The Default Finetuning Schedule # # Schedule definition is facilitated via the ``gen_ft_schedule`` method which dumps a default finetuning schedule (by default using a naive, 2-parameters per level heuristic) which can be adjusted as -# desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will often be less computationally efficient than a user-defined finetuning schedule but can often serve as a good baseline for subsquent explicit schedule refinement and will marginally outperform many explicit schedules. +# desired by the user and/or subsequently passed to the callback. Using the default/implicitly generated schedule will likely be less computationally efficient than a user-defined finetuning schedule but is useful for exploring a model's finetuning behavior and can serve as a good baseline for subsquent explicit schedule refinement. # %% [markdown] # ## Specifying a Finetuning Schedule @@ -147,8 +148,6 @@ # # The following example demonstrates the use of ``FinetuningScheduler`` to finetune a small foundational model on the [RTE](https://huggingface.co/datasets/viewer/?dataset=super_glue&config=rte) task of [SuperGLUE](https://super.gluebenchmark.com/). Iterative early-stopping will be applied according to a user-specified schedule. # -# ``FinetuningScheduler`` can be used to achieve non-trivial model performance improvements in both implicit and explicit scheduling contexts at an also non-trivial computational cost. -# # %% import os @@ -166,6 +165,7 @@ from pytorch_lightning.utilities.exceptions import MisconfigurationException from torch.utils.data import DataLoader from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer +from transformers import logging as transformers_logging # %% # a couple helper functions to prepare code to work with a user module registry @@ -200,12 +200,14 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, Returns: The instantiated class object. """ + class_module, class_name, args_class = None, None, None + shortcircuit_local = False kwargs = init.get("init_args", {}) + class_path = init.get("class_path", None) if args and not isinstance(args, tuple): args = (args,) - shortcircuit_local = False if "." in init["class_path"] else True - class_module, class_name, args_class = None, None, None - if init.get("class_path", None): + if class_path: + shortcircuit_local = False if "." in class_path else True if not shortcircuit_local: class_module, class_name = init["class_path"].rsplit(".", 1) else: # class is expected to be locally defined @@ -236,6 +238,7 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, TASK_NUM_LABELS = {"boolq": 2, "rte": 2} DEFAULT_TASK = "rte" +transformers_logging.set_verbosity_error() # ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and # expected logging behavior for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: @@ -262,8 +265,8 @@ def __init__( model_name_or_path: str, task_name: str = DEFAULT_TASK, max_seq_length: int = 128, - train_batch_size: int = 32, - eval_batch_size: int = 32, + train_batch_size: int = 16, + eval_batch_size: int = 16, tokenizers_parallelism: bool = True, **dataloader_kwargs: Any, ): @@ -373,12 +376,21 @@ def __init__( self.task_name = DEFAULT_TASK rank_zero_warn(f"Invalid task_name '{task_name}'. Proceeding with the default task: '{DEFAULT_TASK}'") self.num_labels = TASK_NUM_LABELS[self.task_name] - self.save_hyperparameters() self.experiment_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{experiment_tag}" self.model_cfg = model_cfg or {} conf = AutoConfig.from_pretrained(model_name_or_path, num_labels=self.num_labels, local_files_only=False) self.model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, config=conf) self.model.config.update(self.model_cfg) # apply model config overrides + self.init_hparams = { + "optimizer": self.optimizer_init, + "lr_scheduler": self.lr_scheduler_init, + "pl_lrs_cfg": self.pl_lrs_cfg, + "model_config": self.model.config, + "model_name_or_path": model_name_or_path, + "task_name": self.task_name, + "experiment_id": self.experiment_id, + } + self.save_hyperparameters(self.init_hparams) self.metric = datasets.load_metric("super_glue", self.task_name, experiment_id=self.experiment_id) self.no_decay = ["bias", "LayerNorm.weight"] self.finetuningscheduler_callback = None @@ -400,24 +412,14 @@ def training_epoch_end(self, outputs: List[Any]) -> None: def validation_step(self, batch, batch_idx, dataloader_idx=0): outputs = self(**batch) val_loss, logits = outputs[:2] - if self.num_labels >= 1: preds = torch.argmax(logits, axis=1) elif self.num_labels == 1: preds = logits.squeeze() - labels = batch["labels"] self.log("val_loss", val_loss, prog_bar=True) - - return {"loss": val_loss, "preds": preds, "labels": labels} - - def validation_epoch_end(self, outputs): - preds = torch.cat([x["preds"] for x in outputs]).detach().cpu().numpy() - labels = torch.cat([x["labels"] for x in outputs]).detach().cpu().numpy() - loss = torch.stack([x["loss"] for x in outputs]).mean() metric_dict = self.metric.compute(predictions=preds, references=labels) self.log_dict(metric_dict, prog_bar=True) - return loss def _init_param_groups(self) -> List[Dict]: """Initialize the parameter groups. Used to ensure weight_decay is not applied to our specified bias @@ -465,22 +467,46 @@ def configure_callbacks(self): return super().configure_callbacks() +# %% [markdown] +# ### Our Training Sessions +# +# We'll be comparing three different finetuning training configurations. Every configuration in this example depends +# upon a shared set of defaults, only differing in their respective finetuning schedules. +# +# | Experiment Tag | Training Scenario Description | +# |:-----------------:| ---------------------------------------------------------------------- | +# | ``fts_explicit`` | Training with a finetuning schedule explicitly provided by the user | +# | ``nofts_baseline``| A baseline finetuning training session (without scheduled finetuning) | +# | ``fts_implicit`` | Training with an implicitly generated finetuning schedule (the default)| +# +# Let's begin by configuring the ``fts_explicit`` scenario. We'll subsequently run the other two scenarios for +# comparison. + # %% # Let's create a finetuning schedule for our model and run an explicitly scheduled finetuning training scenario with it -# Please see the documentation for a full description of the schedule format +# Please see the ``FinetuningScheduler`` documentation for a full description of the schedule format + + ft_schedule_yaml = """ 0: - params: # the parameters for each phase definition can be fully specified + params: - model.classifier.bias - model.classifier.weight + - model.pooler.dense.bias + - model.pooler.dense.weight + - model.deberta.encoder.LayerNorm.bias + - model.deberta.encoder.LayerNorm.weight + - model.deberta.encoder.rel_embeddings.weight + - model.deberta.encoder.layer.{0,11}.(output|attention|intermediate).* 1: - params: # or specified via a regex - - model.albert.pooler.* + params: + - model.deberta.embeddings.LayerNorm.bias + - model.deberta.embeddings.LayerNorm.weight 2: params: - - model.albert.encoder.*.ffn_output.* + - model.deberta.embeddings.word_embeddings.weight """ -ft_schedule_name = "RteBoolqModule_ft_schedule_albert_base.yaml" +ft_schedule_name = "RteBoolqModule_ft_schedule_deberta_base.yaml" # Let's write the schedule to a file so we can simulate loading an explicitly defined finetuning # schedule. with open(ft_schedule_name, "w") as f: @@ -489,7 +515,7 @@ def configure_callbacks(self): # %% datasets.set_progress_bar_enabled(False) pl.seed_everything(42) -dm = RteBoolqDataModule(model_name_or_path="albert-base-v2", tokenizers_parallelism=False) +dm = RteBoolqDataModule(model_name_or_path="microsoft/deberta-v3-base", tokenizers_parallelism=False) # %% [markdown] # ### Optimizer Configuration @@ -531,28 +557,40 @@ def configure_callbacks(self): # %% lr_scheduler_init = { "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", - # "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, - "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 0}, + "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, } pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} # %% -model = RteBoolqModule( - model_name_or_path="albert-base-v2", - optimizer_init=optimizer_init, - lr_scheduler_init=lr_scheduler_init, - pl_lrs_cfg=pl_lrs_cfg, - experiment_tag="fts_explicit", -) +# Load our lightning module... +lightning_module_kwargs = { + "model_name_or_path": "microsoft/deberta-v3-base", + "optimizer_init": optimizer_init, + "lr_scheduler_init": lr_scheduler_init, + "pl_lrs_cfg": pl_lrs_cfg, +} +model = RteBoolqModule(**lightning_module_kwargs, experiment_tag="fts_explicit") + +# %% [markdown] +# ### Callback Configuration +# +# The only callback required to invoke the ``FinetuningScheduler`` is the ``FinetuningScheduler`` callback itself. +# Default versions of ``FTSCheckpoint`` and ``FTSEarlyStopping`` (if not specifying ``epoch_only_transitions``) will be +# included ([as discussed above](#basic_usage)) if not provided in the callbacks list. For demonstration purposes I'm +# including example configurations of all three callbacks below. + +# %% +earlystopping_kwargs = {"monitor": "val_loss", "min_delta": 0.001, "patience": 2} +checkpoint_kwargs = {"monitor": "val_loss", "save_top_k": 1} +fts_kwargs = {"max_depth": 1} callbacks = [ - FinetuningScheduler(ft_schedule=ft_schedule_name, max_depth=2), # type: ignore # noqa - FTSEarlyStopping(monitor="val_loss", min_delta=0.001, patience=2), # type: ignore # noqa - FTSCheckpoint(monitor="val_loss", save_top_k=5), # type: ignore # noqa + FinetuningScheduler(ft_schedule=ft_schedule_name, **fts_kwargs), # type: ignore # noqa + FTSEarlyStopping(**earlystopping_kwargs), # type: ignore # noqa + FTSCheckpoint(**checkpoint_kwargs), # type: ignore # noqa ] +# %% example_logdir = "lightning_logs" logger = TensorBoardLogger(example_logdir, name="fts_explicit") - -# %% # optionally start tensorboard and monitor progress graphically while viewing multi-phase finetuning specific training # logs in the cell output below by uncommenting the next 3 lines # # !mkdir -p $example_logdir @@ -565,7 +603,7 @@ def configure_callbacks(self): def train() -> None: trainer = pl.Trainer( enable_progress_bar=enable_progress_bar, - # max_epochs=1, + max_epochs=100, precision=16, accelerator="gpu", devices=1, @@ -580,6 +618,91 @@ def train() -> None: else: print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") +# %% [markdown] +# ### Running the Baseline and Implicit Finetuning Scenarios +# +# Let's now compare our ``nofts_baseline`` and ``fts_implicit`` scenarios with the ``fts_explicit`` one we just ran. +# We'll need to update our callbacks list, using the core PL ``EarlyStopping`` and ``ModelCheckpoint`` callbacks for the +# ``nofts_baseline`` (which operate identically to their FTS analogs apart from the recursive training support). +# For both core PyTorch Lightning and user-registered callbacks, we can define our callbacks using a dictionary as we do +# with the LightningCLI. This allows us to avoid managing imports and support more complex configuration separated from +# code. +# We'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping ``max_depth`` for the +# implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction +# of the parameters you'd want to tune for maximum performance. Since the implicit schedule is quite computationally +# intensive and most useful for exploring model behavior, leaving ``max_depth`` 1 allows us to demo implicit mode +# behavior while keeping the computational cost and runtime of this notebook reasonable. To review how a full implicit +# mode run compares to the ``nofts_baseline`` and ``fts_explicit`` scenarios, please see the the following +# [tensorboard experiment summary](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/). + + +# %% + +# reference the core callbacks using the relevant callback_key +nofts_callback_cfg = [ + {"callback_key": "EarlyStopping", "init_args": earlystopping_kwargs}, + {"callback_key": "ModelCheckpoint", "init_args": checkpoint_kwargs}, +] +# we can use class_paths, class names or fully qualified names for referencing user-registered callbacks as well +fts_implicit_cfg = [ + {"callback_key": "FinetuningScheduler", "init_args": fts_kwargs}, # use the callback_key + {"class_path": "FTSEarlyStopping", "init_args": earlystopping_kwargs}, # just the class_name + # or the fully qualified name + { + "class_path": "pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint", + "init_args": checkpoint_kwargs, + }, +] +nofts_callbacks = [instantiate_registered_class(c) for c in nofts_callback_cfg] +fts_implicit_callbacks = [instantiate_registered_class(c) for c in fts_implicit_cfg] +scenario_callbacks = {"nofts_baseline": nofts_callbacks, "fts_implicit": fts_implicit_callbacks} + +# %% +if AVAIL_GPUS > 0: + for scenario_name, scenario_callbacks in scenario_callbacks.items(): + model = RteBoolqModule(**lightning_module_kwargs, experiment_tag=scenario_name) + logger = TensorBoardLogger(example_logdir, name=scenario_name) + callbacks = scenario_callbacks + print(f"Beginning training the '{scenario_name}' scenario") + train() +else: + print("Given the multiple phases of finetuning demonstrated, this notebook is best used with a GPU") + +# %% [markdown] +# ### Reviewing the Training Results +# +# See the [tensorboard experiment summaries](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/) to get a sense +# of the relative computational and performance tradeoffs associated with these ``FinetuningScheduler`` configurations. +# The summary compares a full ``fts_implicit`` execution to ``fts_explicit`` and ``nofts_baseline`` scenarios using DDP +# training with 2 GPUs. The full logs/schedules for all three scenarios are available +# [here](https://drive.google.com/file/d/1LrUcisRLHeJgh_BDOOD_GUBPp5iHAkoR/view?usp=sharing) and the checkpoints +# produced in the scenarios [here](https://drive.google.com/file/d/1t7myBgcqcZ9ax_IT9QVk-vFH_l_o5UXB/view?usp=sharing) +# (caution, ~3.5GB). +# +# [![fts_explicit_accuracy](fts_explicit_accuracy.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOnRydWUsIm5vZnRzX2Jhc2VsaW5lIjpmYWxzZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) +# [![nofts_baseline](nofts_baseline_accuracy.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6dHJ1ZSwiZnRzX2ltcGxpY2l0IjpmYWxzZX0%3D) +# +# Note there could be around ~1% variation in performance from the tensorboard summaries generated by this notebook +# which uses DDP_SPAWN and 1 GPU. +# +# ``FinetuningScheduler`` expands the space of possible finetuning schedules and the composition of more sophisticated schedules can +# yield mariginal finetuning performance gains. That stated, it should be emphasized the primary utility of ``FinetuningScheduler`` is to grant +# greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTav3's implicit training +# run, a critical tuning transition point is immediately apparent: +# +# [![implicit_training_transition](implicit_training_transition.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6ZmFsc2UsImZ0c19pbXBsaWNpdCI6dHJ1ZX0%3D) +# +# Our val_loss begins a precipitous decline at step 3119 which corresponds to phase 17 in the schedule. Referring to our +# schedule, in phase 17 we're beginning tuning the attention parameters of our 10th encoder layer (of 11). Interesting! +# Though beyond the scope of this tutorial, it might be worth investigating these dynamics further and +# ``FinetuningScheduler`` allows one to do just that quite easily. +# +# %% [markdown] +# +# Note that though this example is intended to capture a common usage scenario, substantial variation is expected +# among use cases and models. +# In summary, ``FinetuningScheduler`` provides increased finetuning flexibility that can be useful in a variety of +# contexts from exploring model tuning behavior to maximizing performance. # %% [markdown] # ## Footnotes # diff --git a/lightning_examples/finetuning-scheduler/fts_explicit_accuracy.png b/lightning_examples/finetuning-scheduler/fts_explicit_accuracy.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d8f554a7f7b9b87ed28c016ecfa8d0b1c36deb GIT binary patch literal 24409 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 literal 0 HcmV?d00001 diff --git a/lightning_examples/finetuning-scheduler/nofts_baseline_accuracy.png b/lightning_examples/finetuning-scheduler/nofts_baseline_accuracy.png new file mode 100644 index 0000000000000000000000000000000000000000..b78f8c6756a452156286626501cd06fad5888063 GIT binary patch literal 24750 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 literal 0 HcmV?d00001 From 8d32874b6b7df39dd9d223c484d776b33b7733cb Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Sat, 11 Dec 2021 13:13:22 -0800 Subject: [PATCH 20/44] minor spelling and stylistic updates --- .../finetuning-scheduler/finetuning-scheduler.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 968395d0c..cb8dc2913 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -133,6 +133,7 @@ #
# # **Note:** Currently, _FinetuningScheduler_ only supports the following ``StrategyType``s: +# # - ``DP`` # - ``DDP`` # - ``DDP_SPAWN`` @@ -600,6 +601,8 @@ def configure_callbacks(self): enable_progress_bar = False # %% + + def train() -> None: trainer = pl.Trainer( enable_progress_bar=enable_progress_bar, @@ -622,13 +625,15 @@ def train() -> None: # ### Running the Baseline and Implicit Finetuning Scenarios # # Let's now compare our ``nofts_baseline`` and ``fts_implicit`` scenarios with the ``fts_explicit`` one we just ran. +# # We'll need to update our callbacks list, using the core PL ``EarlyStopping`` and ``ModelCheckpoint`` callbacks for the # ``nofts_baseline`` (which operate identically to their FTS analogs apart from the recursive training support). # For both core PyTorch Lightning and user-registered callbacks, we can define our callbacks using a dictionary as we do # with the LightningCLI. This allows us to avoid managing imports and support more complex configuration separated from # code. -# We'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping ``max_depth`` for the -# implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction +# +# Note that we'll be using identical callback configurations to the ``fts_explicit`` scenario. Keeping ``max_depth`` for +# the implicit schedule will limit finetuning to just the last 4 parameters of the model, which is only a small fraction # of the parameters you'd want to tune for maximum performance. Since the implicit schedule is quite computationally # intensive and most useful for exploring model behavior, leaving ``max_depth`` 1 allows us to demo implicit mode # behavior while keeping the computational cost and runtime of this notebook reasonable. To review how a full implicit @@ -686,8 +691,8 @@ def train() -> None: # which uses DDP_SPAWN and 1 GPU. # # ``FinetuningScheduler`` expands the space of possible finetuning schedules and the composition of more sophisticated schedules can -# yield mariginal finetuning performance gains. That stated, it should be emphasized the primary utility of ``FinetuningScheduler`` is to grant -# greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTav3's implicit training +# yield marginal finetuning performance gains. That stated, it should be emphasized the primary utility of ``FinetuningScheduler`` is to grant +# greater finetuning flexibility for model exploration in research. For example, glancing at DeBERTa-v3's implicit training # run, a critical tuning transition point is immediately apparent: # # [![implicit_training_transition](implicit_training_transition.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6ZmFsc2UsImZ0c19pbXBsaWNpdCI6dHJ1ZX0%3D) From 9722e22dcc688fa8e5bbd1de842df897f0ac98f3 Mon Sep 17 00:00:00 2001 From: Dan Dale Date: Fri, 17 Dec 2021 09:21:22 -0500 Subject: [PATCH 21/44] Apply suggestions from code review a number of good code/documentation cleanup suggestions Co-authored-by: thomas chaton --- .../finetuning-scheduler.py | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index cb8dc2913..46c4c2016 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -232,7 +232,7 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, # %% -# load the pl extension module we want to use. This will import all necessary callbacks. +# Load the `FinetuningScheduler` PyTorch Lightning extension module we want to use. This will import all necessary callbacks. mock_register_module("finetuningscheduler") # set notebook-level variables AVAIL_GPUS = torch.cuda.device_count() @@ -240,15 +240,15 @@ def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, DEFAULT_TASK = "rte" transformers_logging.set_verbosity_error() -# ignore warnings related tokenizers_parallelism/DataLoader parallelism tradeoff and -# expected logging behavior +# ignore warnings related tokenizers_parallelism/DataLoader parallelism trade-off and +# expected logging behavior for warnf in [".*does not have many workers*", ".*The number of training samples.*"]: warnings.filterwarnings("ignore", warnf) # %% class RteBoolqDataModule(pl.LightningDataModule): - """A ``LightningDataModule`` for using either the RTE or BoolQ SuperGLUE Hugging Face datasets.""" + """A ``LightningDataModule`` designed for both the RTE or BoolQ SuperGLUE Hugging Face datasets.""" TASK_TEXT_FIELD_MAP = {"rte": ("premise", "hypothesis"), "boolq": ("question", "passage")} LOADER_COLUMNS = ( @@ -287,6 +287,11 @@ def __init__( os.environ["TOKENIZERS_PARALLELISM"] = "true" if self.tokenizers_parallelism else "false" self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True, local_files_only=False) + def prepare_data(self): + # N.B. PL calls prepare_data from a single process (rank 0) so do not use it to assign + # state (e.g. self.x=y) + datasets.load_dataset("super_glue", self.task_name) + def setup(self, stage): self.dataset = datasets.load_dataset("super_glue", self.task_name) for split in self.dataset.keys(): @@ -298,11 +303,6 @@ def setup(self, stage): self.eval_splits = [x for x in self.dataset.keys() if "validation" in x] - def prepare_data(self): - # N.B. PL calls prepare_data from a single process (rank 0) so do not use it to assign - # state (e.g. self.x=y) - datasets.load_dataset("super_glue", self.task_name) - def train_dataloader(self): return DataLoader(self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs) @@ -402,11 +402,10 @@ def forward(self, **inputs): def training_step(self, batch, batch_idx): outputs = self(**batch) loss = outputs[0] + self.log("train_loss", loss, prog_bar=True) return loss def training_epoch_end(self, outputs: List[Any]) -> None: - loss = torch.stack([x["loss"] for x in outputs]).mean() - self.log("train_loss", loss, prog_bar=True) if self.finetuningscheduler_callback: self.log("finetuning_schedule_depth", float(self.finetuningscheduler_callback.curr_depth)) @@ -516,7 +515,7 @@ def configure_callbacks(self): # %% datasets.set_progress_bar_enabled(False) pl.seed_everything(42) -dm = RteBoolqDataModule(model_name_or_path="microsoft/deberta-v3-base", tokenizers_parallelism=False) +dm = RteBoolqDataModule(model_name_or_path="microsoft/deberta-v3-base", tokenizers_parallelism=True) # %% [markdown] # ### Optimizer Configuration @@ -581,22 +580,18 @@ def configure_callbacks(self): # including example configurations of all three callbacks below. # %% -earlystopping_kwargs = {"monitor": "val_loss", "min_delta": 0.001, "patience": 2} -checkpoint_kwargs = {"monitor": "val_loss", "save_top_k": 1} -fts_kwargs = {"max_depth": 1} callbacks = [ - FinetuningScheduler(ft_schedule=ft_schedule_name, **fts_kwargs), # type: ignore # noqa - FTSEarlyStopping(**earlystopping_kwargs), # type: ignore # noqa - FTSCheckpoint(**checkpoint_kwargs), # type: ignore # noqa + FinetuningScheduler(ft_schedule=ft_schedule_name, max_depth=1), # type: ignore # noqa + FTSEarlyStopping(monitor="val_loss", min_delta=0.001, patience=2), # type: ignore # noqa + FTSCheckpoint(monitor="val_loss", save_top_k=1), # type: ignore # noqa ] # %% -example_logdir = "lightning_logs" -logger = TensorBoardLogger(example_logdir, name="fts_explicit") +logger = TensorBoardLogger("lightning_logs", name="fts_explicit") # optionally start tensorboard and monitor progress graphically while viewing multi-phase finetuning specific training # logs in the cell output below by uncommenting the next 3 lines # # !mkdir -p $example_logdir # # %load_ext tensorboard -# # %tensorboard --logdir example_logdir +# # %tensorboard --logdir lightning_logs # disable progress bar by default to focus on multi-phase training logs. Set to True to re-enable if desired enable_progress_bar = False @@ -697,7 +692,7 @@ def train() -> None: # # [![implicit_training_transition](implicit_training_transition.png)](https://tensorboard.dev/experiment/n7U8XhrzRbmvVzC4SQSpWw/#scalars&_smoothingWeight=0&runSelectionState=eyJmdHNfZXhwbGljaXQiOmZhbHNlLCJub2Z0c19iYXNlbGluZSI6ZmFsc2UsImZ0c19pbXBsaWNpdCI6dHJ1ZX0%3D) # -# Our val_loss begins a precipitous decline at step 3119 which corresponds to phase 17 in the schedule. Referring to our +# Our `val_loss` begins a precipitous decline at step 3119 which corresponds to phase 17 in the schedule. Referring to our # schedule, in phase 17 we're beginning tuning the attention parameters of our 10th encoder layer (of 11). Interesting! # Though beyond the scope of this tutorial, it might be worth investigating these dynamics further and # ``FinetuningScheduler`` allows one to do just that quite easily. From 7dbae67925113aec5976a012c698176f18b523cc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:21:42 +0000 Subject: [PATCH 22/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- lightning_examples/finetuning-scheduler/finetuning-scheduler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 46c4c2016..342532c29 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -291,7 +291,7 @@ def prepare_data(self): # N.B. PL calls prepare_data from a single process (rank 0) so do not use it to assign # state (e.g. self.x=y) datasets.load_dataset("super_glue", self.task_name) - + def setup(self, stage): self.dataset = datasets.load_dataset("super_glue", self.task_name) for split in self.dataset.keys(): From 2367ebaf3b2a2957ca48d97b1e830c344e6886ed Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Fri, 17 Dec 2021 09:13:20 -0800 Subject: [PATCH 23/44] removed instantiate_registered_class to simplify example, improved documentation, simplified datamodule loader logic --- .../finetuning-scheduler.py | 169 +++++++----------- .../text-transformers/text-transformers.py | 2 +- 2 files changed, 63 insertions(+), 108 deletions(-) diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index 342532c29..ee8ae15c5 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -155,18 +155,22 @@ import warnings from datetime import datetime from importlib import import_module -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, Dict, List, Optional import datasets import pytorch_lightning as pl import torch +from pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint from pytorch_lightning.loggers.tensorboard import TensorBoardLogger from pytorch_lightning.utilities import rank_zero_warn -from pytorch_lightning.utilities.cli import CALLBACK_REGISTRY, _Registry +from pytorch_lightning.utilities.cli import _Registry from pytorch_lightning.utilities.exceptions import MisconfigurationException +from torch.optim.adamw import AdamW +from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts from torch.utils.data import DataLoader from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer from transformers import logging as transformers_logging +from transformers.tokenization_utils_base import BatchEncoding # %% # a couple helper functions to prepare code to work with a user module registry @@ -190,47 +194,6 @@ def mock_register_module(key: str, require_fqn: bool = False) -> List: print(f"Imported and registered the following callbacks: {registered_list}") -def instantiate_registered_class(init: Dict[str, Any], args: Optional[Union[Any, Tuple[Any, ...]]] = None) -> Any: - """Instantiates a class with the given args and init. Accepts class definitions in the form of a "class_path" - or "callback_key" associated with a _Registry. - - Args: - init: Dict of the form {"class_path":... or "callback_key":..., "init_args":...}. - args: Positional arguments required for instantiation. - - Returns: - The instantiated class object. - """ - class_module, class_name, args_class = None, None, None - shortcircuit_local = False - kwargs = init.get("init_args", {}) - class_path = init.get("class_path", None) - if args and not isinstance(args, tuple): - args = (args,) - if class_path: - shortcircuit_local = False if "." in class_path else True - if not shortcircuit_local: - class_module, class_name = init["class_path"].rsplit(".", 1) - else: # class is expected to be locally defined - args_class = globals()[init["class_path"]] - elif init.get("callback_key", None): - callback_path = CALLBACK_REGISTRY.get(init["callback_key"], None) or MOCK_REGISTRY.get( - init["callback_key"], None - ) - assert callback_path, MisconfigurationException( - f'specified callback_key {init["callback_key"]} has not been registered' - ) - class_module, class_name = callback_path.__module__, callback_path.__name__ - else: - raise MisconfigurationException( - "Neither a class_path nor callback_key were included in a configuration that" "requires one" - ) - if not shortcircuit_local: - module = __import__(class_module, fromlist=[class_name]) - args_class = getattr(module, class_name) - return args_class(**kwargs) if not args else args_class(*args, **kwargs) - - # %% # Load the `FinetuningScheduler` PyTorch Lightning extension module we want to use. This will import all necessary callbacks. mock_register_module("finetuningscheduler") @@ -271,6 +234,24 @@ def __init__( tokenizers_parallelism: bool = True, **dataloader_kwargs: Any, ): + """Initialize this ``LightningDataModule`` designed for both the RTE or BoolQ SuperGLUE Hugging Face + datasets. + + Args: + model_name_or_path (str): + Can be either: + - A string, the ``model id`` of a pretrained model hosted inside a model repo on huggingface.co. + Valid model ids can be located at the root-level, like ``bert-base-uncased``, or namespaced under + a user or organization name, like ``dbmdz/bert-base-german-cased``. + - A path to a ``directory`` containing model weights saved using + :meth:`~transformers.PreTrainedModel.save_pretrained`, e.g., ``./my_model_directory/``. + task_name (str, optional): Name of the SuperGLUE task to execute. This module supports 'rte' or 'boolq'. + Defaults to DEFAULT_TASK which is 'rte'. + max_seq_length (int, optional): Length to which we will pad sequences or truncate input. Defaults to 128. + train_batch_size (int, optional): Training batch size. Defaults to 16. + eval_batch_size (int, optional): Batch size to use for validation and testing splits. Defaults to 16. + tokenizers_parallelism (bool, optional): Whether to use parallelism in the tokenizer. Defaults to True. + """ super().__init__() self.model_name_or_path = model_name_or_path self.task_name = task_name if task_name in TASK_NUM_LABELS.keys() else DEFAULT_TASK @@ -288,11 +269,13 @@ def __init__( self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path, use_fast=True, local_files_only=False) def prepare_data(self): + """Load the SuperGLUE dataset.""" # N.B. PL calls prepare_data from a single process (rank 0) so do not use it to assign # state (e.g. self.x=y) datasets.load_dataset("super_glue", self.task_name) def setup(self, stage): + """Setup our dataset splits for training/validation/testing.""" self.dataset = datasets.load_dataset("super_glue", self.task_name) for split in self.dataset.keys(): self.dataset[split] = self.dataset[split].map( @@ -307,28 +290,22 @@ def train_dataloader(self): return DataLoader(self.dataset["train"], batch_size=self.train_batch_size, **self.dataloader_kwargs) def val_dataloader(self): - if len(self.eval_splits) == 1: - return DataLoader( - self.dataset["validation"], - batch_size=self.eval_batch_size, - **self.dataloader_kwargs, - ) - elif len(self.eval_splits) > 1: - return [ - DataLoader(self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs) - for x in self.eval_splits - ] + return DataLoader(self.dataset["validation"], batch_size=self.eval_batch_size, **self.dataloader_kwargs) def test_dataloader(self): - if len(self.eval_splits) == 1: - return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs) - elif len(self.eval_splits) > 1: - return [ - DataLoader(self.dataset[x], batch_size=self.eval_batch_size, **self.dataloader_kwargs) - for x in self.eval_splits - ] - - def _convert_to_features(self, example_batch): + return DataLoader(self.dataset["test"], batch_size=self.eval_batch_size, **self.dataloader_kwargs) + + def _convert_to_features(self, example_batch) -> BatchEncoding: + """Convert raw text examples to a :class:`~transformers.tokenization_utils_base.BatchEncoding` container + (derived from python dict) of features that includes helpful methods for translating between word/character + space and token space. + + Args: + example_batch ([type]): The set of examples to convert to token space. + + Returns: + ``BatchEncoding``: A batch of encoded examples (note default tokenizer batch_size=1000) + """ text_pairs = list(zip(example_batch[self.text_fields[0]], example_batch[self.text_fields[1]])) # Tokenize the text/text pairs features = self.tokenizer.batch_encode_plus( @@ -349,7 +326,6 @@ def __init__( model_name_or_path: str, optimizer_init: Dict[str, Any], lr_scheduler_init: Dict[str, Any], - pl_lrs_cfg: Optional[Dict[str, Any]] = None, model_cfg: Optional[Dict[str, Any]] = None, task_name: str = DEFAULT_TASK, experiment_tag: str = "default", @@ -359,8 +335,6 @@ def __init__( model_name_or_path (str): Path to pretrained model or identifier from https://huggingface.co/models optimizer_init (Dict[str, Any]): The desired optimizer configuration. lr_scheduler_init (Dict[str, Any]): The desired learning rate scheduler config - pl_lrs_cfg (Optional[Dict[str, Any]]): Defines custom overrides of pytorch lightning lr_scheduler defaults - defined in ``_get_default_scheduler_config`` model_cfg (Optional[Dict[str, Any]], optional): Defines overrides of the default model config. Defaults to ``None``. task_name (str, optional): The SuperGLUE task to execute, one of ``'rte'``, ``'boolq'``. Defaults to "rte". @@ -370,7 +344,6 @@ def __init__( super().__init__() self.optimizer_init = optimizer_init self.lr_scheduler_init = lr_scheduler_init - self.pl_lrs_cfg = pl_lrs_cfg or {} if task_name in TASK_NUM_LABELS.keys(): self.task_name = task_name else: @@ -385,7 +358,6 @@ def __init__( self.init_hparams = { "optimizer": self.optimizer_init, "lr_scheduler": self.lr_scheduler_init, - "pl_lrs_cfg": self.pl_lrs_cfg, "model_config": self.model.config, "model_name_or_path": model_name_or_path, "task_name": self.task_name, @@ -435,7 +407,7 @@ def _init_param_groups(self) -> List[Dict]: for n, p in self.model.named_parameters() if not any(nd in n for nd in self.no_decay) and p.requires_grad ], - "weight_decay": self.optimizer_init["init_args"]["weight_decay"], + "weight_decay": self.optimizer_init["weight_decay"], }, { "params": [ @@ -453,11 +425,8 @@ def configure_optimizers(self): # but in this case we pass a list of parameter groups to ensure weight_decay is # not applied to the bias parameter (for completeness, in this case it won't make much # performance difference) - optimizer = instantiate_registered_class(args=self._init_param_groups(), init=self.optimizer_init) - scheduler = { - "scheduler": instantiate_registered_class(args=optimizer, init=self.lr_scheduler_init), - **self.pl_lrs_cfg, - } + optimizer = AdamW(params=self._init_param_groups(), **self.optimizer_init) + scheduler = {"scheduler": CosineAnnealingWarmRestarts(optimizer, **self.lr_scheduler_init)} return [optimizer], [scheduler] def configure_callbacks(self): @@ -533,10 +502,7 @@ def configure_callbacks(self): #
# %% -optimizer_init = { - "class_path": "torch.optim.AdamW", - "init_args": {"weight_decay": 1e-05, "eps": 1e-07, "lr": 1e-05}, -} +optimizer_init = {"weight_decay": 1e-05, "eps": 1e-07, "lr": 1e-05} # %% [markdown] # ### LR Scheduler Configuration @@ -555,11 +521,7 @@ def configure_callbacks(self): # %% -lr_scheduler_init = { - "class_path": "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts", - "init_args": {"T_0": 1, "T_mult": 2, "eta_min": 1e-07}, -} -pl_lrs_cfg = {"interval": "epoch", "frequency": 1, "name": "CosineAnnealingWarmRestarts"} +lr_scheduler_init = {"T_0": 1, "T_mult": 2, "eta_min": 1e-07} # %% # Load our lightning module... @@ -567,7 +529,6 @@ def configure_callbacks(self): "model_name_or_path": "microsoft/deberta-v3-base", "optimizer_init": optimizer_init, "lr_scheduler_init": lr_scheduler_init, - "pl_lrs_cfg": pl_lrs_cfg, } model = RteBoolqModule(**lightning_module_kwargs, experiment_tag="fts_explicit") @@ -580,16 +541,22 @@ def configure_callbacks(self): # including example configurations of all three callbacks below. # %% +# let's save our callback configurations for the explicit scenario since we'll be reusing the same +# configurations for the implicit and nofts_baseline scenarios (except the config for the +# FinetuningScheduler callback itself of course in the case of nofts_baseline) +earlystopping_kwargs = {"monitor": "val_loss", "min_delta": 0.001, "patience": 2} +checkpoint_kwargs = {"monitor": "val_loss", "save_top_k": 1} +fts_kwargs = {"max_depth": 1} callbacks = [ - FinetuningScheduler(ft_schedule=ft_schedule_name, max_depth=1), # type: ignore # noqa - FTSEarlyStopping(monitor="val_loss", min_delta=0.001, patience=2), # type: ignore # noqa - FTSCheckpoint(monitor="val_loss", save_top_k=1), # type: ignore # noqa + FinetuningScheduler(ft_schedule=ft_schedule_name, **fts_kwargs), # type: ignore # noqa + FTSEarlyStopping(**earlystopping_kwargs), # type: ignore # noqa + FTSCheckpoint(**checkpoint_kwargs), # type: ignore # noqa ] + # %% logger = TensorBoardLogger("lightning_logs", name="fts_explicit") # optionally start tensorboard and monitor progress graphically while viewing multi-phase finetuning specific training -# logs in the cell output below by uncommenting the next 3 lines -# # !mkdir -p $example_logdir +# logs in the cell output below by uncommenting the next 2 lines # # %load_ext tensorboard # # %tensorboard --logdir lightning_logs # disable progress bar by default to focus on multi-phase training logs. Set to True to re-enable if desired @@ -637,31 +604,19 @@ def train() -> None: # %% - -# reference the core callbacks using the relevant callback_key -nofts_callback_cfg = [ - {"callback_key": "EarlyStopping", "init_args": earlystopping_kwargs}, - {"callback_key": "ModelCheckpoint", "init_args": checkpoint_kwargs}, -] -# we can use class_paths, class names or fully qualified names for referencing user-registered callbacks as well -fts_implicit_cfg = [ - {"callback_key": "FinetuningScheduler", "init_args": fts_kwargs}, # use the callback_key - {"class_path": "FTSEarlyStopping", "init_args": earlystopping_kwargs}, # just the class_name - # or the fully qualified name - { - "class_path": "pytorch_lightning.callbacks.finetuning_scheduler.fts_supporters.FTSCheckpoint", - "init_args": checkpoint_kwargs, - }, +nofts_callbacks = [EarlyStopping(**earlystopping_kwargs), ModelCheckpoint(**checkpoint_kwargs)] +fts_implicit_callbacks = [ + FinetuningScheduler(**fts_kwargs), # type: ignore # noqa + FTSEarlyStopping(**earlystopping_kwargs), # type: ignore # noqa + FTSCheckpoint(**checkpoint_kwargs), # type: ignore # noqa ] -nofts_callbacks = [instantiate_registered_class(c) for c in nofts_callback_cfg] -fts_implicit_callbacks = [instantiate_registered_class(c) for c in fts_implicit_cfg] scenario_callbacks = {"nofts_baseline": nofts_callbacks, "fts_implicit": fts_implicit_callbacks} # %% if AVAIL_GPUS > 0: for scenario_name, scenario_callbacks in scenario_callbacks.items(): model = RteBoolqModule(**lightning_module_kwargs, experiment_tag=scenario_name) - logger = TensorBoardLogger(example_logdir, name=scenario_name) + logger = TensorBoardLogger("lightning_logs", name=scenario_name) callbacks = scenario_callbacks print(f"Beginning training the '{scenario_name}' scenario") train() diff --git a/lightning_examples/text-transformers/text-transformers.py b/lightning_examples/text-transformers/text-transformers.py index d14a2e397..57786f010 100644 --- a/lightning_examples/text-transformers/text-transformers.py +++ b/lightning_examples/text-transformers/text-transformers.py @@ -220,7 +220,7 @@ def setup(self, stage=None) -> None: if stage != "fit": return # Get dataloader by calling it - train_dataloader() is called after setup() by default - train_loader = self.train_dataloader() + train_loader = self.trainer.datamodule.train_dataloader() # Calculate total steps tb_size = self.hparams.train_batch_size * max(1, self.trainer.gpus) From 37e44c2353ecf6707ba90a97f4eda0160b20c763 Mon Sep 17 00:00:00 2001 From: Daniel Dale Date: Fri, 7 Jan 2022 14:57:35 -0800 Subject: [PATCH 24/44] enhance linkcheck configuration and switch two images to be base64 encoded --- docs/source/conf.py | 5 + .../finetuning-scheduler/emphasized_yaml.png | Bin 0 -> 116806 bytes .../finetuning-scheduler/emphasized_yaml.svg | 1176 ----------------- .../finetuning-scheduler.py | 4 +- .../side_by_side_yaml.png | Bin 0 -> 77035 bytes .../side_by_side_yaml.svg | 754 ----------- 6 files changed, 7 insertions(+), 1932 deletions(-) create mode 100644 lightning_examples/finetuning-scheduler/emphasized_yaml.png delete mode 100644 lightning_examples/finetuning-scheduler/emphasized_yaml.svg create mode 100644 lightning_examples/finetuning-scheduler/side_by_side_yaml.png delete mode 100644 lightning_examples/finetuning-scheduler/side_by_side_yaml.svg diff --git a/docs/source/conf.py b/docs/source/conf.py index b20fea9e3..cf7bc4387 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -181,6 +181,11 @@ # (source start file, name, description, authors, manual section). man_pages = [(master_doc, project, project + " Documentation", [author], 1)] +# -- Options for linkcheck builder ---------------------------------------------- +# regex pattern 0: allow linking to a specific selection state in +# tensorboard.dev links while continuing to validate the base experiment link +linkcheck_anchors_ignore = ["scalars.*&runSelectionState.*"] + # -- Options for Texinfo output ---------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples diff --git a/lightning_examples/finetuning-scheduler/emphasized_yaml.png b/lightning_examples/finetuning-scheduler/emphasized_yaml.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee87ec217180ebf323c762dc5be59746a9e175c GIT binary patch literal 116806 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%0AjrYx-^PcashFVzJG%?_1%PvE=7KoVM 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≀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 z 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 I1oZ;`7l{&Q+5i9m literal 0 HcmV?d00001 diff --git a/lightning_examples/finetuning-scheduler/emphasized_yaml.svg b/lightning_examples/finetuning-scheduler/emphasized_yaml.svg deleted file mode 100644 index eda7e7891..000000000 --- a/lightning_examples/finetuning-scheduler/emphasized_yaml.svg +++ /dev/null @@ -1,1176 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py index ee8ae15c5..6fb7ea3a3 100644 --- a/lightning_examples/finetuning-scheduler/finetuning-scheduler.py +++ b/lightning_examples/finetuning-scheduler/finetuning-scheduler.py @@ -68,7 +68,7 @@ # # 2. Alter the schedule as desired. # -# +# ![side_by_side_yaml](side_by_side_yaml.png) # # 3. Once the finetuning schedule has been altered as desired, pass it to # ``FinetuningScheduler`` to commence scheduled training: @@ -94,7 +94,7 @@ # # **Tip:** Use of regex expressions can be convenient for specifying more complex schedules: # -# +# ![emphasized_yaml](emphasized_yaml.png) # #