2020-05-05 02:16:54 +00:00
|
|
|
.. testsetup:: *
|
|
|
|
|
|
|
|
from pytorch_lightning.trainer.trainer import Trainer
|
|
|
|
|
2020-08-13 22:56:51 +00:00
|
|
|
.. _training-tricks:
|
2020-05-05 02:16:54 +00:00
|
|
|
|
2020-02-11 04:55:22 +00:00
|
|
|
Training Tricks
|
|
|
|
================
|
|
|
|
Lightning implements various tricks to help during training
|
|
|
|
|
2020-06-19 06:38:10 +00:00
|
|
|
----------
|
|
|
|
|
2020-02-11 04:55:22 +00:00
|
|
|
Accumulate gradients
|
2020-06-17 21:44:11 +00:00
|
|
|
--------------------
|
2020-02-11 04:55:22 +00:00
|
|
|
Accumulated gradients runs K small batches of size N before doing a backwards pass.
|
|
|
|
The effect is a large effective batch size of size KxN.
|
|
|
|
|
2020-03-20 19:49:01 +00:00
|
|
|
.. seealso:: :class:`~pytorch_lightning.trainer.trainer.Trainer`
|
2020-02-11 04:55:22 +00:00
|
|
|
|
2020-05-05 02:16:54 +00:00
|
|
|
.. testcode::
|
2020-02-11 04:55:22 +00:00
|
|
|
|
|
|
|
# DEFAULT (ie: no accumulated grads)
|
|
|
|
trainer = Trainer(accumulate_grad_batches=1)
|
|
|
|
|
2020-06-19 06:38:10 +00:00
|
|
|
----------
|
2020-02-11 04:55:22 +00:00
|
|
|
|
|
|
|
Gradient Clipping
|
2020-06-17 21:44:11 +00:00
|
|
|
-----------------
|
2020-02-11 04:55:22 +00:00
|
|
|
Gradient clipping may be enabled to avoid exploding gradients. Specifically, this will `clip the gradient
|
|
|
|
norm <https://pytorch.org/docs/stable/nn.html#torch.nn.utils.clip_grad_norm_>`_ computed over all model parameters together.
|
|
|
|
|
2020-03-20 19:49:01 +00:00
|
|
|
.. seealso:: :class:`~pytorch_lightning.trainer.trainer.Trainer`
|
2020-02-11 04:55:22 +00:00
|
|
|
|
2020-05-05 02:16:54 +00:00
|
|
|
.. testcode::
|
2020-02-11 04:55:22 +00:00
|
|
|
|
|
|
|
# DEFAULT (ie: don't clip)
|
|
|
|
trainer = Trainer(gradient_clip_val=0)
|
|
|
|
|
|
|
|
# clip gradients with norm above 0.5
|
|
|
|
trainer = Trainer(gradient_clip_val=0.5)
|
2020-05-09 12:28:36 +00:00
|
|
|
|
2020-06-19 06:38:10 +00:00
|
|
|
----------
|
|
|
|
|
2020-05-09 12:28:36 +00:00
|
|
|
Auto scaling of batch size
|
|
|
|
--------------------------
|
|
|
|
Auto scaling of batch size may be enabled to find the largest batch size that fits into
|
|
|
|
memory. Larger batch size often yields better estimates of gradients, but may also result in
|
2020-05-29 05:57:50 +00:00
|
|
|
longer training time. Inspired by https://github.com/BlackHC/toma.
|
2020-05-09 12:28:36 +00:00
|
|
|
|
|
|
|
.. seealso:: :class:`~pytorch_lightning.trainer.trainer.Trainer`
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
# DEFAULT (ie: don't scale batch size automatically)
|
|
|
|
trainer = Trainer(auto_scale_batch_size=None)
|
|
|
|
|
|
|
|
# Autoscale batch size
|
|
|
|
trainer = Trainer(auto_scale_batch_size=None|'power'|'binsearch')
|
|
|
|
|
2020-08-31 21:36:09 +00:00
|
|
|
# find the batch size
|
|
|
|
trainer.tune(model)
|
|
|
|
|
2020-05-09 12:28:36 +00:00
|
|
|
Currently, this feature supports two modes `'power'` scaling and `'binsearch'`
|
|
|
|
scaling. In `'power'` scaling, starting from a batch size of 1 keeps doubling
|
|
|
|
the batch size until an out-of-memory (OOM) error is encountered. Setting the
|
|
|
|
argument to `'binsearch'` continues to finetune the batch size by performing
|
|
|
|
a binary search.
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
This feature expects that a `batch_size` field in the `hparams` of your model, i.e.,
|
|
|
|
`model.hparams.batch_size` should exist and will be overridden by the results of this
|
|
|
|
algorithm. Additionally, your `train_dataloader()` method should depend on this field
|
|
|
|
for this feature to work i.e.
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
def train_dataloader(self):
|
2020-05-24 22:59:08 +00:00
|
|
|
return DataLoader(train_dataset, batch_size=self.batch_size)
|
2020-05-09 12:28:36 +00:00
|
|
|
|
|
|
|
.. warning::
|
|
|
|
|
2020-05-14 15:06:03 +00:00
|
|
|
Due to these constraints, this features does *NOT* work when passing dataloaders directly
|
2020-05-09 12:28:36 +00:00
|
|
|
to `.fit()`.
|
|
|
|
|
|
|
|
The scaling algorithm has a number of parameters that the user can control by
|
|
|
|
invoking the trainer method `.scale_batch_size` themself (see description below).
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
# Use default in trainer construction
|
|
|
|
trainer = Trainer()
|
2020-09-07 20:45:31 +00:00
|
|
|
tuner = Tuner(trainer)
|
2020-05-09 12:28:36 +00:00
|
|
|
|
|
|
|
# Invoke method
|
2020-09-07 20:45:31 +00:00
|
|
|
new_batch_size = tuner.scale_batch_size(model, ...)
|
2020-05-09 12:28:36 +00:00
|
|
|
|
|
|
|
# Override old batch size
|
|
|
|
model.hparams.batch_size = new_batch_size
|
|
|
|
|
|
|
|
# Fit as normal
|
|
|
|
trainer.fit(model)
|
|
|
|
|
|
|
|
The algorithm in short works by:
|
|
|
|
1. Dumping the current state of the model and trainer
|
|
|
|
2. Iteratively until convergence or maximum number of tries `max_trials` (default 25) has been reached:
|
|
|
|
- Call `fit()` method of trainer. This evaluates `steps_per_trial` (default 3) number of
|
|
|
|
training steps. Each training step can trigger an OOM error if the tensors
|
|
|
|
(training batch, weights, gradients ect.) allocated during the steps have a
|
|
|
|
too large memory footprint.
|
|
|
|
- If an OOM error is encountered, decrease batch size else increase it.
|
|
|
|
How much the batch size is increased/decreased is determined by the choosen
|
|
|
|
stratrgy.
|
|
|
|
3. The found batch size is saved to `model.hparams.batch_size`
|
|
|
|
4. Restore the initial state of model and trainer
|
|
|
|
|
|
|
|
.. autoclass:: pytorch_lightning.trainer.training_tricks.TrainerTrainingTricksMixin
|
|
|
|
:members: scale_batch_size
|
|
|
|
:noindex:
|
2020-05-14 15:06:03 +00:00
|
|
|
|
|
|
|
.. warning:: Batch size finder is not supported for DDP yet, it is coming soon.
|