From 69a655280a9733730607c7032af5b9d504d50d91 Mon Sep 17 00:00:00 2001 From: William Falcon Date: Mon, 5 Aug 2019 00:21:12 -0500 Subject: [PATCH] Deployed 5fd0bf8 with MkDocs version: 1.0.4 --- .../RequiredTrainerInterface/index.html | 23 +++++++ Trainer/Logging/index.html | 4 +- Trainer/index.html | 56 +++++++++--------- search/search_index.json | 2 +- sitemap.xml | 28 ++++----- sitemap.xml.gz | Bin 204 -> 205 bytes source/_static/overview_flat.jpg | Bin 0 -> 419859 bytes 7 files changed, 68 insertions(+), 45 deletions(-) create mode 100644 source/_static/overview_flat.jpg diff --git a/LightningModule/RequiredTrainerInterface/index.html b/LightningModule/RequiredTrainerInterface/index.html index 447054c4..e79efdea 100644 --- a/LightningModule/RequiredTrainerInterface/index.html +++ b/LightningModule/RequiredTrainerInterface/index.html @@ -280,6 +280,13 @@ Minimal example + + +
  • + + How do these methods fit into the broader training? + +
  • @@ -696,6 +703,13 @@ Minimal example +
  • + +
  • + + How do these methods fit into the broader training? + +
  • @@ -980,6 +994,15 @@ class CoolModel(ptl.LightningModule): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) +
    +

    How do these methods fit into the broader training?

    +

    The LightningModule interface is on the right. Each method corresponds to a part of a research project. Lightning automates everything not in blue.

    +

    + + + +

    +

    training_step

    def training_step(self, data_batch, batch_nb)
    diff --git a/Trainer/Logging/index.html b/Trainer/Logging/index.html
    index 0c31d771..d4ecb057 100644
    --- a/Trainer/Logging/index.html
    +++ b/Trainer/Logging/index.html
    @@ -657,7 +657,7 @@ trainer = Trainer(process_position=1)
     

    Save a snapshot of all hyperparameters

    Whenever you call .save() on the test-tube experiment it logs all the hyperparameters in current use. Give lightning a test-tube Experiment object to automate this for you.

    -
    from test-tube import Experiment
    +
    from test_tube import Experiment
     
     exp = Experiment(...)
     Trainer(experiment=exp)
    @@ -667,7 +667,7 @@ Trainer(experiment=exp)
     

    Snapshot code for a training run

    Whenever you call .save() on the test-tube experiment it snapshows all code and pushes to a git tag. Give lightning a test-tube Experiment object to automate this for you.

    -
    from test-tube import Experiment
    +
    from test_tube import Experiment
     
     exp = Experiment(create_git_tag=True)
     Trainer(experiment=exp)
    diff --git a/Trainer/index.html b/Trainer/index.html
    index f81d00b4..7b06145f 100644
    --- a/Trainer/index.html
    +++ b/Trainer/index.html
    @@ -506,40 +506,40 @@ trainer.fit(model)
     

    But of course the fun is in all the advanced things it can do:

    Checkpointing

    Computing cluster (SLURM)

    Debugging

    Distributed training

    Experiment Logging

    Training loop

    Validation loop

    diff --git a/search/search_index.json b/search/search_index.json index e52132c3..8cc0560a 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"New project Quick Start To start a new project you define two files, a LightningModule and a Trainer file. A separate trainer file allows to run many LightningModules. Each LightningModule has the core logic to a particular research project. For example, one lightningModule could be an image classifier, the other one could be a seq-2-seq model, both (optionally) ran by the same trainer file. MNIST LightningModule Trainer Basic CPU Trainer Template Multi-GPU Trainer Template GPU cluster Trainer Template Docs shortcuts LightningModule Trainer Quick start examples CPU example Hyperparameter search on single GPU Hyperparameter search on multiple GPUs on same node Hyperparameter search on a SLURM HPC cluster Checkpointing Model saving Model loading Computing cluster (SLURM) Running grid search on a cluster Walltime auto-resubmit Debugging Fast dev run Inspect gradient norms Log GPU usage Make model overfit on subset of data Print the parameter count by layer Pring which gradients are nan Distributed training 16-bit mixed precision Multi-GPU Multi-node Single GPU Self-balancing architecture Experiment Logging Display metrics in progress bar Log metric row every k batches Process position Tensorboard support Save a snapshot of all hyperparameters Snapshot code for a training run Write logs file to csv every k batches Training loop Accumulate gradients Force training for min or max epochs Force disable early stop Gradient Clipping Hooks Learning rate scheduling Use multiple optimizers (like GANs) Set how much of the training set to check (1-100%) Validation loop Check validation every n epochs Hooks Set how much of the validation set to check Set how much of the test set to check Set validation check frequency within 1 training epoch Set the number of validation sanity steps","title":"Home"},{"location":"#new-project-quick-start","text":"To start a new project you define two files, a LightningModule and a Trainer file. A separate trainer file allows to run many LightningModules. Each LightningModule has the core logic to a particular research project. For example, one lightningModule could be an image classifier, the other one could be a seq-2-seq model, both (optionally) ran by the same trainer file. MNIST LightningModule Trainer Basic CPU Trainer Template Multi-GPU Trainer Template GPU cluster Trainer Template","title":"New project Quick Start"},{"location":"#docs-shortcuts","text":"LightningModule Trainer","title":"Docs shortcuts"},{"location":"#quick-start-examples","text":"CPU example Hyperparameter search on single GPU Hyperparameter search on multiple GPUs on same node Hyperparameter search on a SLURM HPC cluster","title":"Quick start examples"},{"location":"#checkpointing","text":"Model saving Model loading","title":"Checkpointing"},{"location":"#computing-cluster-slurm","text":"Running grid search on a cluster Walltime auto-resubmit","title":"Computing cluster (SLURM)"},{"location":"#debugging","text":"Fast dev run Inspect gradient norms Log GPU usage Make model overfit on subset of data Print the parameter count by layer Pring which gradients are nan","title":"Debugging"},{"location":"#distributed-training","text":"16-bit mixed precision Multi-GPU Multi-node Single GPU Self-balancing architecture","title":"Distributed training"},{"location":"#experiment-logging","text":"Display metrics in progress bar Log metric row every k batches Process position Tensorboard support Save a snapshot of all hyperparameters Snapshot code for a training run Write logs file to csv every k batches","title":"Experiment Logging"},{"location":"#training-loop","text":"Accumulate gradients Force training for min or max epochs Force disable early stop Gradient Clipping Hooks Learning rate scheduling Use multiple optimizers (like GANs) Set how much of the training set to check (1-100%)","title":"Training loop"},{"location":"#validation-loop","text":"Check validation every n epochs Hooks Set how much of the validation set to check Set how much of the test set to check Set validation check frequency within 1 training epoch Set the number of validation sanity steps","title":"Validation loop"},{"location":"LightningModule/RequiredTrainerInterface/","text":"Lightning Module interface [ Github Code ] A lightning module is a strict superclass of nn.Module, it provides a standard interface for the trainer to interact with the model. The easiest thing to do is copy the minimal example below and modify accordingly. Otherwise, to Define a Lightning Module, implement the following methods: Required : training_step validation_step validation_end configure_optimizers tng_dataloader tng_dataloader test_dataloader Optional : on_save_checkpoint on_load_checkpoint update_tng_log_metrics add_model_specific_args Minimal example import os import torch from torch.nn import functional as F from torch.utils.data import DataLoader from torchvision.datasets import MNIST import torchvision.transforms as transforms import pytorch_lightning as ptl class CoolModel(ptl.LightningModule): def __init__(self): super(CoolModel, self).__init__() # not the best model... self.l1 = torch.nn.Linear(28 * 28, 10) def forward(self, x): return torch.relu(self.l1(x.view(x.size(0), -1))) def my_loss(self, y_hat, y): return F.cross_entropy(y_hat, y) def training_step(self, batch, batch_nb): x, y = batch y_hat = self.forward(x) return {'loss': self.my_loss(y_hat, y)} def validation_step(self, batch, batch_nb): x, y = batch y_hat = self.forward(x) return {'val_loss': self.my_loss(y_hat, y)} def validation_end(self, outputs): avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean() return {'avg_val_loss': avg_loss} def configure_optimizers(self): return [torch.optim.Adam(self.parameters(), lr=0.02)] @ptl.data_loader def tng_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) @ptl.data_loader def val_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) @ptl.data_loader def test_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) training_step def training_step(self, data_batch, batch_nb) In this step you'd normally do the forward pass and calculate the loss for a batch. You can also do fancier things like multiple forward passes or something specific to your model. Params Param description data_batch The output of your dataloader. A tensor, tuple or list batch_nb Integer displaying which batch this is Return Dictionary or OrderedDict key value is required loss tensor scalar Y prog Dict for progress bar display. Must have only tensors N Example def training_step(self, data_batch, batch_nb): x, y, z = data_batch # implement your own out = self.forward(x) loss = self.loss(out, x) output = { 'loss': loss, # required 'prog': {'tng_loss': loss, 'batch_nb': batch_nb} # optional } # return a dict return output validation_step def validation_step(self, data_batch, batch_nb) In this step you'd normally do the forward pass and calculate the loss for a batch. You can also do fancier things like multiple forward passes or something specific to your model. This is most likely the same as your training_step. But unlike training step, the outputs from here will go to validation_end for collation. Params Param description data_batch The output of your dataloader. A tensor, tuple or list batch_nb Integer displaying which batch this is Return Return description optional dict Dict of OrderedDict with metrics to display in progress bar. All keys must be tensors. Y Example def validation_step(self, data_batch, batch_nb): x, y, z = data_batch # implement your own out = self.forward(x) loss = self.loss(out, x) # calculate acc labels_hat = torch.argmax(out, dim=1) val_acc = torch.sum(y == labels_hat).item() / (len(y) * 1.0) # all optional... # return whatever you need for the collation function validation_end output = OrderedDict({ 'val_loss': loss_val, 'val_acc': torch.tensor(val_acc), # everything must be a tensor }) # return an optional dict return output validation_end def validation_end(self, outputs) Called at the end of the validation loop with the output of each validation_step. Params Param description outputs List of outputs you defined in validation_step Return Return description optional dict Dict of OrderedDict with metrics to display in progress bar Y Example def validation_end(self, outputs): \"\"\" Called at the end of validation to aggregate outputs :param outputs: list of individual outputs of each validation step :return: \"\"\" val_loss_mean = 0 val_acc_mean = 0 for output in outputs: val_loss_mean += output['val_loss'] val_acc_mean += output['val_acc'] val_loss_mean /= len(outputs) val_acc_mean /= len(outputs) tqdm_dic = {'val_loss': val_loss_mean.item(), 'val_acc': val_acc_mean.item()} return tqdm_dic configure_optimizers def configure_optimizers(self) Set up as many optimizers and (optionally) learning rate schedulers as you need. Normally you'd need one. But in the case of GANs or something more esoteric you might have multiple. Lightning will call .backward() and .step() on each one in every epoch. If you use 16 bit precision it will also handle that. Return List or Tuple - List of optimizers with an optional second list of learning-rate schedulers Example # most cases def configure_optimizers(self): opt = Adam(self.parameters(), lr=0.01) return [opt] # gan example, with scheduler for discriminator def configure_optimizers(self): generator_opt = Adam(self.model_gen.parameters(), lr=0.01) disriminator_opt = Adam(self.model_disc.parameters(), lr=0.02) discriminator_sched = CosineAnnealing(discriminator_opt, T_max=10) return [generator_opt, disriminator_opt], [discriminator_sched] on_save_checkpoint def on_save_checkpoint(self, checkpoint) Called by lightning to checkpoint your model. Lightning saves the training state (current epoch, global_step, etc) and also saves the model state_dict. If you want to save anything else, use this method to add your own key-value pair. Return Nothing Example def on_save_checkpoint(self, checkpoint): # 99% of use cases you don't need to implement this method checkpoint['something_cool_i_want_to_save'] = my_cool_pickable_object on_load_checkpoint def on_load_checkpoint(self, checkpoint) Called by lightning to restore your model. Lighting auto-restores global step, epoch, etc... It also restores the model state_dict. If you saved something with on_save_checkpoint this is your chance to restore this. Return Nothing Example def on_load_checkpoint(self, checkpoint): # 99% of the time you don't need to implement this method self.something_cool_i_want_to_save = checkpoint['something_cool_i_want_to_save'] tng_dataloader @ptl.data_loader def tng_dataloader(self) Called by lightning during training loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed. Return PyTorch DataLoader Example @ptl.data_loader def tng_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=True, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader val_dataloader @ptl.data_loader def tng_dataloader(self) Called by lightning during validation loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed. Return PyTorch DataLoader Example @ptl.data_loader def val_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=False, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader test_dataloader @ptl.data_loader def test_dataloader(self) Called by lightning during test loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed. Return PyTorch DataLoader Example @ptl.data_loader def test_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=False, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader update_tng_log_metrics def update_tng_log_metrics(self, logs) Called by lightning right before it logs metrics for this batch. This is a chance to ammend or add to the metrics about to be logged. Return Dict Example def update_tng_log_metrics(self, logs): # modify or add to logs return logs add_model_specific_args @staticmethod def add_model_specific_args(parent_parser, root_dir) Lightning has a list of default argparse commands. This method is your chance to add or modify commands specific to your model. The hyperparameter argument parser is available anywhere in your model by calling self.hparams. Return An argument parser Example @staticmethod def add_model_specific_args(parent_parser, root_dir): parser = HyperOptArgumentParser(strategy=parent_parser.strategy, parents=[parent_parser]) # param overwrites # parser.set_defaults(gradient_clip=5.0) # network params parser.opt_list('--drop_prob', default=0.2, options=[0.2, 0.5], type=float, tunable=False) parser.add_argument('--in_features', default=28*28) parser.add_argument('--out_features', default=10) parser.add_argument('--hidden_dim', default=50000) # use 500 for CPU, 50000 for GPU to see speed difference # data parser.add_argument('--data_root', default=os.path.join(root_dir, 'mnist'), type=str) # training params (opt) parser.opt_list('--learning_rate', default=0.001, type=float, options=[0.0001, 0.0005, 0.001, 0.005], tunable=False) parser.opt_list('--batch_size', default=256, type=int, options=[32, 64, 128, 256], tunable=False) parser.opt_list('--optimizer_name', default='adam', type=str, options=['adam'], tunable=False) return parser","title":"Lightning Module interface"},{"location":"LightningModule/RequiredTrainerInterface/#lightning-module-interface","text":"[ Github Code ] A lightning module is a strict superclass of nn.Module, it provides a standard interface for the trainer to interact with the model. The easiest thing to do is copy the minimal example below and modify accordingly. Otherwise, to Define a Lightning Module, implement the following methods: Required : training_step validation_step validation_end configure_optimizers tng_dataloader tng_dataloader test_dataloader Optional : on_save_checkpoint on_load_checkpoint update_tng_log_metrics add_model_specific_args","title":"Lightning Module interface"},{"location":"LightningModule/RequiredTrainerInterface/#minimal-example","text":"import os import torch from torch.nn import functional as F from torch.utils.data import DataLoader from torchvision.datasets import MNIST import torchvision.transforms as transforms import pytorch_lightning as ptl class CoolModel(ptl.LightningModule): def __init__(self): super(CoolModel, self).__init__() # not the best model... self.l1 = torch.nn.Linear(28 * 28, 10) def forward(self, x): return torch.relu(self.l1(x.view(x.size(0), -1))) def my_loss(self, y_hat, y): return F.cross_entropy(y_hat, y) def training_step(self, batch, batch_nb): x, y = batch y_hat = self.forward(x) return {'loss': self.my_loss(y_hat, y)} def validation_step(self, batch, batch_nb): x, y = batch y_hat = self.forward(x) return {'val_loss': self.my_loss(y_hat, y)} def validation_end(self, outputs): avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean() return {'avg_val_loss': avg_loss} def configure_optimizers(self): return [torch.optim.Adam(self.parameters(), lr=0.02)] @ptl.data_loader def tng_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) @ptl.data_loader def val_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) @ptl.data_loader def test_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32)","title":"Minimal example"},{"location":"LightningModule/RequiredTrainerInterface/#training_step","text":"def training_step(self, data_batch, batch_nb) In this step you'd normally do the forward pass and calculate the loss for a batch. You can also do fancier things like multiple forward passes or something specific to your model. Params Param description data_batch The output of your dataloader. A tensor, tuple or list batch_nb Integer displaying which batch this is Return Dictionary or OrderedDict key value is required loss tensor scalar Y prog Dict for progress bar display. Must have only tensors N Example def training_step(self, data_batch, batch_nb): x, y, z = data_batch # implement your own out = self.forward(x) loss = self.loss(out, x) output = { 'loss': loss, # required 'prog': {'tng_loss': loss, 'batch_nb': batch_nb} # optional } # return a dict return output","title":"training_step"},{"location":"LightningModule/RequiredTrainerInterface/#validation_step","text":"def validation_step(self, data_batch, batch_nb) In this step you'd normally do the forward pass and calculate the loss for a batch. You can also do fancier things like multiple forward passes or something specific to your model. This is most likely the same as your training_step. But unlike training step, the outputs from here will go to validation_end for collation. Params Param description data_batch The output of your dataloader. A tensor, tuple or list batch_nb Integer displaying which batch this is Return Return description optional dict Dict of OrderedDict with metrics to display in progress bar. All keys must be tensors. Y Example def validation_step(self, data_batch, batch_nb): x, y, z = data_batch # implement your own out = self.forward(x) loss = self.loss(out, x) # calculate acc labels_hat = torch.argmax(out, dim=1) val_acc = torch.sum(y == labels_hat).item() / (len(y) * 1.0) # all optional... # return whatever you need for the collation function validation_end output = OrderedDict({ 'val_loss': loss_val, 'val_acc': torch.tensor(val_acc), # everything must be a tensor }) # return an optional dict return output","title":"validation_step"},{"location":"LightningModule/RequiredTrainerInterface/#validation_end","text":"def validation_end(self, outputs) Called at the end of the validation loop with the output of each validation_step. Params Param description outputs List of outputs you defined in validation_step Return Return description optional dict Dict of OrderedDict with metrics to display in progress bar Y Example def validation_end(self, outputs): \"\"\" Called at the end of validation to aggregate outputs :param outputs: list of individual outputs of each validation step :return: \"\"\" val_loss_mean = 0 val_acc_mean = 0 for output in outputs: val_loss_mean += output['val_loss'] val_acc_mean += output['val_acc'] val_loss_mean /= len(outputs) val_acc_mean /= len(outputs) tqdm_dic = {'val_loss': val_loss_mean.item(), 'val_acc': val_acc_mean.item()} return tqdm_dic","title":"validation_end"},{"location":"LightningModule/RequiredTrainerInterface/#configure_optimizers","text":"def configure_optimizers(self) Set up as many optimizers and (optionally) learning rate schedulers as you need. Normally you'd need one. But in the case of GANs or something more esoteric you might have multiple. Lightning will call .backward() and .step() on each one in every epoch. If you use 16 bit precision it will also handle that.","title":"configure_optimizers"},{"location":"LightningModule/RequiredTrainerInterface/#return","text":"List or Tuple - List of optimizers with an optional second list of learning-rate schedulers Example # most cases def configure_optimizers(self): opt = Adam(self.parameters(), lr=0.01) return [opt] # gan example, with scheduler for discriminator def configure_optimizers(self): generator_opt = Adam(self.model_gen.parameters(), lr=0.01) disriminator_opt = Adam(self.model_disc.parameters(), lr=0.02) discriminator_sched = CosineAnnealing(discriminator_opt, T_max=10) return [generator_opt, disriminator_opt], [discriminator_sched]","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#on_save_checkpoint","text":"def on_save_checkpoint(self, checkpoint) Called by lightning to checkpoint your model. Lightning saves the training state (current epoch, global_step, etc) and also saves the model state_dict. If you want to save anything else, use this method to add your own key-value pair.","title":"on_save_checkpoint"},{"location":"LightningModule/RequiredTrainerInterface/#return_1","text":"Nothing Example def on_save_checkpoint(self, checkpoint): # 99% of use cases you don't need to implement this method checkpoint['something_cool_i_want_to_save'] = my_cool_pickable_object","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#on_load_checkpoint","text":"def on_load_checkpoint(self, checkpoint) Called by lightning to restore your model. Lighting auto-restores global step, epoch, etc... It also restores the model state_dict. If you saved something with on_save_checkpoint this is your chance to restore this.","title":"on_load_checkpoint"},{"location":"LightningModule/RequiredTrainerInterface/#return_2","text":"Nothing Example def on_load_checkpoint(self, checkpoint): # 99% of the time you don't need to implement this method self.something_cool_i_want_to_save = checkpoint['something_cool_i_want_to_save']","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#tng_dataloader","text":"@ptl.data_loader def tng_dataloader(self) Called by lightning during training loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed.","title":"tng_dataloader"},{"location":"LightningModule/RequiredTrainerInterface/#return_3","text":"PyTorch DataLoader Example @ptl.data_loader def tng_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=True, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#val_dataloader","text":"@ptl.data_loader def tng_dataloader(self) Called by lightning during validation loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed.","title":"val_dataloader"},{"location":"LightningModule/RequiredTrainerInterface/#return_4","text":"PyTorch DataLoader Example @ptl.data_loader def val_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=False, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#test_dataloader","text":"@ptl.data_loader def test_dataloader(self) Called by lightning during test loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed.","title":"test_dataloader"},{"location":"LightningModule/RequiredTrainerInterface/#return_5","text":"PyTorch DataLoader Example @ptl.data_loader def test_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=False, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#update_tng_log_metrics","text":"def update_tng_log_metrics(self, logs) Called by lightning right before it logs metrics for this batch. This is a chance to ammend or add to the metrics about to be logged.","title":"update_tng_log_metrics"},{"location":"LightningModule/RequiredTrainerInterface/#return_6","text":"Dict Example def update_tng_log_metrics(self, logs): # modify or add to logs return logs","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#add_model_specific_args","text":"@staticmethod def add_model_specific_args(parent_parser, root_dir) Lightning has a list of default argparse commands. This method is your chance to add or modify commands specific to your model. The hyperparameter argument parser is available anywhere in your model by calling self.hparams.","title":"add_model_specific_args"},{"location":"LightningModule/RequiredTrainerInterface/#return_7","text":"An argument parser Example @staticmethod def add_model_specific_args(parent_parser, root_dir): parser = HyperOptArgumentParser(strategy=parent_parser.strategy, parents=[parent_parser]) # param overwrites # parser.set_defaults(gradient_clip=5.0) # network params parser.opt_list('--drop_prob', default=0.2, options=[0.2, 0.5], type=float, tunable=False) parser.add_argument('--in_features', default=28*28) parser.add_argument('--out_features', default=10) parser.add_argument('--hidden_dim', default=50000) # use 500 for CPU, 50000 for GPU to see speed difference # data parser.add_argument('--data_root', default=os.path.join(root_dir, 'mnist'), type=str) # training params (opt) parser.opt_list('--learning_rate', default=0.001, type=float, options=[0.0001, 0.0005, 0.001, 0.005], tunable=False) parser.opt_list('--batch_size', default=256, type=int, options=[32, 64, 128, 256], tunable=False) parser.opt_list('--optimizer_name', default='adam', type=str, options=['adam'], tunable=False) return parser","title":"Return"},{"location":"LightningModule/methods/","text":"Lightning modules are strict superclasses of torch.nn.Module. A LightningModule offers the following in addition to that API. freeze Freeze all params for inference model = MyLightningModule(...) model.freeze() load_from_metrics This is the easiest/fastest way which uses the meta_tags.csv file from test-tube to rebuild the model. The meta_tags.csv file can be found in the test-tube experiment save_dir. pretrained_model = MyLightningModule.load_from_metrics( weights_path='/path/to/pytorch_checkpoint.ckpt', tags_csv='/path/to/test_tube/experiment/version/meta_tags.csv', on_gpu=True, map_location=None ) # predict pretrained_model.eval() pretrained_model.freeze() y_hat = pretrained_model(x) Params Param description weights_path Path to a PyTorch checkpoint tags_csv Path to meta_tags.csv file generated by the test-tube Experiment on_gpu if True, puts model on GPU. Make sure to use transforms option if model devices have changed map_location A dictionary mapping saved weight GPU devices to new GPU devices Returns LightningModule - The pretrained LightningModule unfreeze Unfreeze all params for inference model = MyLightningModule(...) model.unfreeze()","title":"Methods"},{"location":"LightningModule/methods/#freeze","text":"Freeze all params for inference model = MyLightningModule(...) model.freeze()","title":"freeze"},{"location":"LightningModule/methods/#load_from_metrics","text":"This is the easiest/fastest way which uses the meta_tags.csv file from test-tube to rebuild the model. The meta_tags.csv file can be found in the test-tube experiment save_dir. pretrained_model = MyLightningModule.load_from_metrics( weights_path='/path/to/pytorch_checkpoint.ckpt', tags_csv='/path/to/test_tube/experiment/version/meta_tags.csv', on_gpu=True, map_location=None ) # predict pretrained_model.eval() pretrained_model.freeze() y_hat = pretrained_model(x) Params Param description weights_path Path to a PyTorch checkpoint tags_csv Path to meta_tags.csv file generated by the test-tube Experiment on_gpu if True, puts model on GPU. Make sure to use transforms option if model devices have changed map_location A dictionary mapping saved weight GPU devices to new GPU devices Returns LightningModule - The pretrained LightningModule","title":"load_from_metrics"},{"location":"LightningModule/methods/#unfreeze","text":"Unfreeze all params for inference model = MyLightningModule(...) model.unfreeze()","title":"unfreeze"},{"location":"LightningModule/properties/","text":"A LightningModule has the following properties which you can access at any time current_epoch The current epoch dtype Current dtype experiment An instance of test-tube Experiment which you can use to log anything for tensorboarX. self.experiment.add_embedding(...) self.experiment.log({'val_loss': 0.9}) self.experiment.add_scalars(...) global_step Total training batches seen across all epochs gradient_clip The current gradient clip value on_gpu True if your model is currently running on GPUs. Useful to set flags around the LightningModule for different CPU vs GPU behavior. trainer Last resort access to any state the trainer has. Changing certain properties here could affect your training run. self.trainer.optimizers self.trainer.current_epoch ...","title":"Properties"},{"location":"LightningModule/properties/#current_epoch","text":"The current epoch","title":"current_epoch"},{"location":"LightningModule/properties/#dtype","text":"Current dtype","title":"dtype"},{"location":"LightningModule/properties/#experiment","text":"An instance of test-tube Experiment which you can use to log anything for tensorboarX. self.experiment.add_embedding(...) self.experiment.log({'val_loss': 0.9}) self.experiment.add_scalars(...)","title":"experiment"},{"location":"LightningModule/properties/#global_step","text":"Total training batches seen across all epochs","title":"global_step"},{"location":"LightningModule/properties/#gradient_clip","text":"The current gradient clip value","title":"gradient_clip"},{"location":"LightningModule/properties/#on_gpu","text":"True if your model is currently running on GPUs. Useful to set flags around the LightningModule for different CPU vs GPU behavior.","title":"on_gpu"},{"location":"LightningModule/properties/#trainer","text":"Last resort access to any state the trainer has. Changing certain properties here could affect your training run. self.trainer.optimizers self.trainer.current_epoch ...","title":"trainer"},{"location":"Trainer/","text":"Trainer [ Github Code ] The lightning trainer abstracts best practices for running a training, val, test routine. It calls parts of your model when it wants to hand over full control and otherwise makes training assumptions which are now standard practice in AI research. This is the basic use of the trainer: from pytorch_lightning import Trainer model = LightningTemplate() trainer = Trainer() trainer.fit(model) But of course the fun is in all the advanced things it can do: Checkpointing Model saving Model loading Computing cluster (SLURM) Running grid search on a cluster Walltime auto-resubmit Debugging Fast dev run Inspect gradient norms Log GPU usage Make model overfit on subset of data Print the parameter count by layer Pring which gradients are nan Distributed training 16-bit mixed precision Multi-GPU Multi-node Single GPU Self-balancing architecture Experiment Logging Display metrics in progress bar Log metric row every k batches Process position Tensorboard support Save a snapshot of all hyperparameters Snapshot code for a training run Write logs file to csv every k batches Training loop Accumulate gradients Force training for min or max epochs Force disable early stop Gradient Clipping Hooks Learning rate scheduling Use multiple optimizers (like GANs) Set how much of the training set to check (1-100%) Validation loop Check validation every n epochs Hooks Set how much of the validation set to check Set how much of the test set to check Set validation check frequency within 1 training epoch Set the number of validation sanity steps","title":"Trainer"},{"location":"Trainer/#trainer","text":"[ Github Code ] The lightning trainer abstracts best practices for running a training, val, test routine. It calls parts of your model when it wants to hand over full control and otherwise makes training assumptions which are now standard practice in AI research. This is the basic use of the trainer: from pytorch_lightning import Trainer model = LightningTemplate() trainer = Trainer() trainer.fit(model) But of course the fun is in all the advanced things it can do: Checkpointing Model saving Model loading Computing cluster (SLURM) Running grid search on a cluster Walltime auto-resubmit Debugging Fast dev run Inspect gradient norms Log GPU usage Make model overfit on subset of data Print the parameter count by layer Pring which gradients are nan Distributed training 16-bit mixed precision Multi-GPU Multi-node Single GPU Self-balancing architecture Experiment Logging Display metrics in progress bar Log metric row every k batches Process position Tensorboard support Save a snapshot of all hyperparameters Snapshot code for a training run Write logs file to csv every k batches Training loop Accumulate gradients Force training for min or max epochs Force disable early stop Gradient Clipping Hooks Learning rate scheduling Use multiple optimizers (like GANs) Set how much of the training set to check (1-100%) Validation loop Check validation every n epochs Hooks Set how much of the validation set to check Set how much of the test set to check Set validation check frequency within 1 training epoch Set the number of validation sanity steps","title":"Trainer"},{"location":"Trainer/Checkpointing/","text":"Lightning can automate saving and loading checkpoints. Model saving To enable checkpointing, define the checkpoint callback and give it to the trainer. from pytorch_lightning.utils.pt_callbacks import ModelCheckpoint checkpoint_callback = ModelCheckpoint( filepath='/path/to/store/weights.ckpt', save_best_only=True, verbose=True, monitor='val_loss', mode='min' ) trainer = Trainer(checkpoint_callback=checkpoint_callback)","title":"Checkpointing"},{"location":"Trainer/Checkpointing/#model-saving","text":"To enable checkpointing, define the checkpoint callback and give it to the trainer. from pytorch_lightning.utils.pt_callbacks import ModelCheckpoint checkpoint_callback = ModelCheckpoint( filepath='/path/to/store/weights.ckpt', save_best_only=True, verbose=True, monitor='val_loss', mode='min' ) trainer = Trainer(checkpoint_callback=checkpoint_callback)","title":"Model saving"},{"location":"Trainer/Distributed training/","text":"Lightning makes multi-gpu training and 16 bit training trivial. Note: None of the flags below require changing anything about your lightningModel definition. Choosing a backend Lightning supports two backends. DataParallel and DistributedDataParallel. Both can be used for single-node multi-GPU training. For multi-node training you must use DistributedDataParallel. You can toggle between each mode by setting this flag. # DEFAULT uses DataParallel trainer = Trainer(distributed_backend='dp') # change to distributed data parallel trainer = Trainer(distributed_backend='ddp') If you request multiple nodes, the back-end will auto-switch to ddp. We recommend you use DistributedDataparallel even for single-node multi-GPU training. It is MUCH faster than DP but may have configuration issues depending on your cluster. For a deeper understanding of what lightning is doing, feel free to read this guide . CUDA flags CUDA flags make certain GPUs visible to your script. Lightning sets these for you automatically, there's NO NEED to do this yourself. # lightning will set according to what you give the trainer # os.environ[\"CUDA_DEVICE_ORDER\"] = \"PCI_BUS_ID\" # os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\" 16-bit mixed precision 16 bit precision can cut your memory footprint by half. If using volta architecture GPUs it can give a dramatic training speed-up as well. First, install apex (if install fails, look here ): $ git clone https://github.com/NVIDIA/apex $ cd apex $ pip install -v --no-cache-dir --global-option=\"--cpp_ext\" --global-option=\"--cuda_ext\" ./ then set this use_amp to True. # DEFAULT trainer = Trainer(amp_level='O2', use_amp=False) Single-gpu Make sure you're on a GPU machine. # DEFAULT trainer = Trainer(gpus=[0]) multi-gpu Make sure you're on a GPU machine. You can set as many GPUs as you want. In this setting, the model will run on all 8 GPUs at once using DataParallel under the hood. # to use DataParallel (default) trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], distributed_backend='dp') # RECOMMENDED use DistributedDataParallel trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], distributed_backend='ddp') Multi-node Multi-node training is easily done by specifying these flags. # train on 12*8 GPUs trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], nb_gpu_nodes=12) In addition, make sure to set up your SLURM job correctly via the SlurmClusterObject . In particular, specify the number of tasks per node correctly. cluster = SlurmCluster( hyperparam_optimizer=test_tube.HyperOptArgumentParser(), log_path='/some/path/to/save', ) # OPTIONAL FLAGS WHICH MAY BE CLUSTER DEPENDENT # which interface your nodes use for communication cluster.add_command('export NCCL_SOCKET_IFNAME=^docker0,lo') # see output of the NCCL connection process # NCCL is how the nodes talk to each other cluster.add_command('export NCCL_DEBUG=INFO') # setting a master port here is a good idea. cluster.add_command(f'export MASTER_PORT={PORT}') # good to load the latest NCCL version cluster.load_modules(['NCCL/2.4.7-1-cuda.10.0']) # configure cluster cluster.per_experiment_nb_nodes = 12 cluster.per_experiment_nb_gpus = 8 cluster.add_slurm_cmd(cmd='ntasks-per-node', value=8, comment='1 task per gpu') Finally, make sure to add a distributed sampler to your dataset. The distributed sampler copies a portion of your dataset onto each GPU. (World_size = gpus_per_node * nb_nodes). # ie: this: dataset = myDataset() dataloader = Dataloader(dataset) # becomes: dataset = myDataset() dist_sampler = torch.utils.data.distributed.DistributedSampler(dataset) dataloader = Dataloader(dataset, sampler=dist_sampler) Self-balancing architecture Here lightning distributes parts of your module across available GPUs to optimize for speed and memory. COMING SOON.","title":"Distributed training"},{"location":"Trainer/Distributed training/#choosing-a-backend","text":"Lightning supports two backends. DataParallel and DistributedDataParallel. Both can be used for single-node multi-GPU training. For multi-node training you must use DistributedDataParallel. You can toggle between each mode by setting this flag. # DEFAULT uses DataParallel trainer = Trainer(distributed_backend='dp') # change to distributed data parallel trainer = Trainer(distributed_backend='ddp') If you request multiple nodes, the back-end will auto-switch to ddp. We recommend you use DistributedDataparallel even for single-node multi-GPU training. It is MUCH faster than DP but may have configuration issues depending on your cluster. For a deeper understanding of what lightning is doing, feel free to read this guide .","title":"Choosing a backend"},{"location":"Trainer/Distributed training/#cuda-flags","text":"CUDA flags make certain GPUs visible to your script. Lightning sets these for you automatically, there's NO NEED to do this yourself. # lightning will set according to what you give the trainer # os.environ[\"CUDA_DEVICE_ORDER\"] = \"PCI_BUS_ID\" # os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"","title":"CUDA flags"},{"location":"Trainer/Distributed training/#16-bit-mixed-precision","text":"16 bit precision can cut your memory footprint by half. If using volta architecture GPUs it can give a dramatic training speed-up as well. First, install apex (if install fails, look here ): $ git clone https://github.com/NVIDIA/apex $ cd apex $ pip install -v --no-cache-dir --global-option=\"--cpp_ext\" --global-option=\"--cuda_ext\" ./ then set this use_amp to True. # DEFAULT trainer = Trainer(amp_level='O2', use_amp=False)","title":"16-bit mixed precision"},{"location":"Trainer/Distributed training/#single-gpu","text":"Make sure you're on a GPU machine. # DEFAULT trainer = Trainer(gpus=[0])","title":"Single-gpu"},{"location":"Trainer/Distributed training/#multi-gpu","text":"Make sure you're on a GPU machine. You can set as many GPUs as you want. In this setting, the model will run on all 8 GPUs at once using DataParallel under the hood. # to use DataParallel (default) trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], distributed_backend='dp') # RECOMMENDED use DistributedDataParallel trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], distributed_backend='ddp')","title":"multi-gpu"},{"location":"Trainer/Distributed training/#multi-node","text":"Multi-node training is easily done by specifying these flags. # train on 12*8 GPUs trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], nb_gpu_nodes=12) In addition, make sure to set up your SLURM job correctly via the SlurmClusterObject . In particular, specify the number of tasks per node correctly. cluster = SlurmCluster( hyperparam_optimizer=test_tube.HyperOptArgumentParser(), log_path='/some/path/to/save', ) # OPTIONAL FLAGS WHICH MAY BE CLUSTER DEPENDENT # which interface your nodes use for communication cluster.add_command('export NCCL_SOCKET_IFNAME=^docker0,lo') # see output of the NCCL connection process # NCCL is how the nodes talk to each other cluster.add_command('export NCCL_DEBUG=INFO') # setting a master port here is a good idea. cluster.add_command(f'export MASTER_PORT={PORT}') # good to load the latest NCCL version cluster.load_modules(['NCCL/2.4.7-1-cuda.10.0']) # configure cluster cluster.per_experiment_nb_nodes = 12 cluster.per_experiment_nb_gpus = 8 cluster.add_slurm_cmd(cmd='ntasks-per-node', value=8, comment='1 task per gpu') Finally, make sure to add a distributed sampler to your dataset. The distributed sampler copies a portion of your dataset onto each GPU. (World_size = gpus_per_node * nb_nodes). # ie: this: dataset = myDataset() dataloader = Dataloader(dataset) # becomes: dataset = myDataset() dist_sampler = torch.utils.data.distributed.DistributedSampler(dataset) dataloader = Dataloader(dataset, sampler=dist_sampler)","title":"Multi-node"},{"location":"Trainer/Distributed training/#self-balancing-architecture","text":"Here lightning distributes parts of your module across available GPUs to optimize for speed and memory. COMING SOON.","title":"Self-balancing architecture"},{"location":"Trainer/Logging/","text":"Lighting offers a few options for logging information about model, gpu usage, etc (via test-tube). It also offers printing options for training monitoring. Display metrics in progress bar # DEFAULT trainer = Trainer(progress_bar=True) Log metric row every k batches Every k batches lightning will make an entry in the metrics log # DEFAULT (ie: save a .csv log file every 10 batches) trainer = Trainer(add_log_row_interval=10) Process position When running multiple models on the same machine we want to decide which progress bar to use. Lightning will stack progress bars according to this value. # DEFAULT trainer = Trainer(process_position=0) # if this is the second model on the node, show the second progress bar below trainer = Trainer(process_position=1) Save a snapshot of all hyperparameters Whenever you call .save() on the test-tube experiment it logs all the hyperparameters in current use. Give lightning a test-tube Experiment object to automate this for you. from test-tube import Experiment exp = Experiment(...) Trainer(experiment=exp) Snapshot code for a training run Whenever you call .save() on the test-tube experiment it snapshows all code and pushes to a git tag. Give lightning a test-tube Experiment object to automate this for you. from test-tube import Experiment exp = Experiment(create_git_tag=True) Trainer(experiment=exp) Tensorboard support The experiment object is a strict subclass of PyTorch SummaryWriter. However, this class also snapshots every detail about the experiment (data folder paths, code, hyperparams), and allows you to visualize it using tensorboard. from test_tube import Experiment, HyperOptArgumentParser # exp hyperparams args = HyperOptArgumentParser() hparams = args.parse_args() # this is a summaryWriter with nicer logging structure exp = Experiment(save_dir='/some/path', create_git_tag=True) # track experiment details (must be ArgumentParser or HyperOptArgumentParser). # each option in the parser is tracked exp.argparse(hparams) exp.tag({'description': 'running demo'}) # trainer uses the exp object to log exp data trainer = Trainer(experiment=exp) trainer.fit(model) # view logs at: # tensorboard --logdir /some/path Write logs file to csv every k batches Every k batches, lightning will write the new logs to disk # DEFAULT (ie: save a .csv log file every 100 batches) trainer = Trainer(log_save_interval=100)","title":"Logging"},{"location":"Trainer/Logging/#display-metrics-in-progress-bar","text":"# DEFAULT trainer = Trainer(progress_bar=True)","title":"Display metrics in progress bar"},{"location":"Trainer/Logging/#log-metric-row-every-k-batches","text":"Every k batches lightning will make an entry in the metrics log # DEFAULT (ie: save a .csv log file every 10 batches) trainer = Trainer(add_log_row_interval=10)","title":"Log metric row every k batches"},{"location":"Trainer/Logging/#process-position","text":"When running multiple models on the same machine we want to decide which progress bar to use. Lightning will stack progress bars according to this value. # DEFAULT trainer = Trainer(process_position=0) # if this is the second model on the node, show the second progress bar below trainer = Trainer(process_position=1)","title":"Process position"},{"location":"Trainer/Logging/#save-a-snapshot-of-all-hyperparameters","text":"Whenever you call .save() on the test-tube experiment it logs all the hyperparameters in current use. Give lightning a test-tube Experiment object to automate this for you. from test-tube import Experiment exp = Experiment(...) Trainer(experiment=exp)","title":"Save a snapshot of all hyperparameters"},{"location":"Trainer/Logging/#snapshot-code-for-a-training-run","text":"Whenever you call .save() on the test-tube experiment it snapshows all code and pushes to a git tag. Give lightning a test-tube Experiment object to automate this for you. from test-tube import Experiment exp = Experiment(create_git_tag=True) Trainer(experiment=exp)","title":"Snapshot code for a training run"},{"location":"Trainer/Logging/#tensorboard-support","text":"The experiment object is a strict subclass of PyTorch SummaryWriter. However, this class also snapshots every detail about the experiment (data folder paths, code, hyperparams), and allows you to visualize it using tensorboard. from test_tube import Experiment, HyperOptArgumentParser # exp hyperparams args = HyperOptArgumentParser() hparams = args.parse_args() # this is a summaryWriter with nicer logging structure exp = Experiment(save_dir='/some/path', create_git_tag=True) # track experiment details (must be ArgumentParser or HyperOptArgumentParser). # each option in the parser is tracked exp.argparse(hparams) exp.tag({'description': 'running demo'}) # trainer uses the exp object to log exp data trainer = Trainer(experiment=exp) trainer.fit(model) # view logs at: # tensorboard --logdir /some/path","title":"Tensorboard support"},{"location":"Trainer/Logging/#write-logs-file-to-csv-every-k-batches","text":"Every k batches, lightning will write the new logs to disk # DEFAULT (ie: save a .csv log file every 100 batches) trainer = Trainer(log_save_interval=100)","title":"Write logs file to csv every k batches"},{"location":"Trainer/SLURM Managed Cluster/","text":"Lightning supports model training on a cluster managed by SLURM in the following cases: Training on single or multi-cpus only. Training on single or multi-gpus on the same node. Coming SOON: Training across multiple nodes. Running grid search on a cluster To use lightning to run a hyperparameter search (grid-search or random-search) on a cluster do 4 things: (1). Define the parameters for the grid search from test_tube import HyperOptArgumentParser # subclass of argparse parser = HyperOptArgumentParser(strategy='random_search') parser.add_argument('--learning_rate', default=0.002, type=float, help='the learning rate') # let's enable optimizing over the number of layers in the network parser.opt_list('--nb_layers', default=2, type=int, tunable=True, options=[2, 4, 8]) hparams = parser.parse_args() (2). Define the cluster options in the SlurmCluster object (over 5 nodes and 8 gpus) from test_tube.hpc import SlurmCluster # hyperparameters is a test-tube hyper params object # see https://williamfalcon.github.io/test-tube/hyperparameter_optimization/HyperOptArgumentParser/ hyperparams = args.parse() # init cluster cluster = SlurmCluster( hyperparam_optimizer=hyperparams, log_path='/path/to/log/results/to', python_cmd='python3' ) # let the cluster know where to email for a change in job status (ie: complete, fail, etc...) cluster.notify_job_status(email='some@email.com', on_done=True, on_fail=True) # set the job options. In this instance, we'll run 20 different models # each with its own set of hyperparameters giving each one 1 GPU (ie: taking up 20 GPUs) cluster.per_experiment_nb_gpus = 8 cluster.per_experiment_nb_nodes = 5 # we'll request 10GB of memory per node cluster.memory_mb_per_node = 10000 # set a walltime of 10 minues cluster.job_time = '10:00' (3). Give trainer the cluster_manager in your main function: from pytorch_lightning import Trainer def train_fx(trial_hparams, cluster_manager, _): # hparams has a specific set of hyperparams my_model = MyLightningModel() # give the trainer the cluster object trainer = Trainer(cluster=cluster_manager) trainer.fit(my_model) (4). Start the grid search # run the models on the cluster cluster.optimize_parallel_cluster_gpu( train_fx, nb_trials=20, job_name='my_grid_search_exp_name', job_display_name='my_exp') That's it! The SlurmCluster object will automatically checkpoint the lightning model and resubmit if it runs into the walltime! Walltime auto-resubmit Lightning automatically resubmits jobs when they reach the walltime. You get this behavior for free if you give lightning a slurm cluster object. def my_main_fx(hparams, slurm_manager, _): trainer = Trainer(cluster=slurm_manager) (See the grid search example above for cluster configuration). With this feature lightning will: automatically checkpoint the model checkpoint the trainer session resubmit a continuation job. load the checkpoint and trainer session in the new model","title":"SLURM Managed Cluster"},{"location":"Trainer/SLURM Managed Cluster/#running-grid-search-on-a-cluster","text":"To use lightning to run a hyperparameter search (grid-search or random-search) on a cluster do 4 things: (1). Define the parameters for the grid search from test_tube import HyperOptArgumentParser # subclass of argparse parser = HyperOptArgumentParser(strategy='random_search') parser.add_argument('--learning_rate', default=0.002, type=float, help='the learning rate') # let's enable optimizing over the number of layers in the network parser.opt_list('--nb_layers', default=2, type=int, tunable=True, options=[2, 4, 8]) hparams = parser.parse_args() (2). Define the cluster options in the SlurmCluster object (over 5 nodes and 8 gpus) from test_tube.hpc import SlurmCluster # hyperparameters is a test-tube hyper params object # see https://williamfalcon.github.io/test-tube/hyperparameter_optimization/HyperOptArgumentParser/ hyperparams = args.parse() # init cluster cluster = SlurmCluster( hyperparam_optimizer=hyperparams, log_path='/path/to/log/results/to', python_cmd='python3' ) # let the cluster know where to email for a change in job status (ie: complete, fail, etc...) cluster.notify_job_status(email='some@email.com', on_done=True, on_fail=True) # set the job options. In this instance, we'll run 20 different models # each with its own set of hyperparameters giving each one 1 GPU (ie: taking up 20 GPUs) cluster.per_experiment_nb_gpus = 8 cluster.per_experiment_nb_nodes = 5 # we'll request 10GB of memory per node cluster.memory_mb_per_node = 10000 # set a walltime of 10 minues cluster.job_time = '10:00' (3). Give trainer the cluster_manager in your main function: from pytorch_lightning import Trainer def train_fx(trial_hparams, cluster_manager, _): # hparams has a specific set of hyperparams my_model = MyLightningModel() # give the trainer the cluster object trainer = Trainer(cluster=cluster_manager) trainer.fit(my_model) (4). Start the grid search # run the models on the cluster cluster.optimize_parallel_cluster_gpu( train_fx, nb_trials=20, job_name='my_grid_search_exp_name', job_display_name='my_exp') That's it! The SlurmCluster object will automatically checkpoint the lightning model and resubmit if it runs into the walltime!","title":"Running grid search on a cluster"},{"location":"Trainer/SLURM Managed Cluster/#walltime-auto-resubmit","text":"Lightning automatically resubmits jobs when they reach the walltime. You get this behavior for free if you give lightning a slurm cluster object. def my_main_fx(hparams, slurm_manager, _): trainer = Trainer(cluster=slurm_manager) (See the grid search example above for cluster configuration). With this feature lightning will: automatically checkpoint the model checkpoint the trainer session resubmit a continuation job. load the checkpoint and trainer session in the new model","title":"Walltime auto-resubmit"},{"location":"Trainer/Training Loop/","text":"The lightning training loop handles everything except the actual computations of your model. To decide what will happen in your training loop, define the training_step function . Below are all the things lightning automates for you in the training loop. Accumulated gradients 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. # DEFAULT (ie: no accumulated grads) trainer = Trainer(accumulate_grad_batches=1) Force training for min or max epochs It can be useful to force training for a minimum number of epochs or limit to a max number # DEFAULT trainer = Trainer(min_nb_epochs=1, max_nb_epochs=1000) Force disable early stop Use this to turn off early stopping and run training to the max_epoch # DEFAULT trainer = Trainer(enable_early_stop=True) Gradient Clipping Use this to turn off early stopping and run training to the max_epoch # DEFAULT (ie: don't clip) trainer = Trainer(gradient_clip=0) Inspect gradient norms Looking at grad norms can help you figure out where training might be going wrong. # DEFAULT (-1 doesn't track norms) trainer = Trainer(track_grad_norm=-1) # track the LP norm (P=2 here) trainer = Trainer(track_grad_norm=2) Set how much of the training set to check If you don't want to check 100% of the training set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(train_percent_check=1.0) # check 10% only trainer = Trainer(train_percent_check=0.1)","title":"Training Loop"},{"location":"Trainer/Training Loop/#accumulated-gradients","text":"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. # DEFAULT (ie: no accumulated grads) trainer = Trainer(accumulate_grad_batches=1)","title":"Accumulated gradients"},{"location":"Trainer/Training Loop/#force-training-for-min-or-max-epochs","text":"It can be useful to force training for a minimum number of epochs or limit to a max number # DEFAULT trainer = Trainer(min_nb_epochs=1, max_nb_epochs=1000)","title":"Force training for min or max epochs"},{"location":"Trainer/Training Loop/#force-disable-early-stop","text":"Use this to turn off early stopping and run training to the max_epoch # DEFAULT trainer = Trainer(enable_early_stop=True)","title":"Force disable early stop"},{"location":"Trainer/Training Loop/#gradient-clipping","text":"Use this to turn off early stopping and run training to the max_epoch # DEFAULT (ie: don't clip) trainer = Trainer(gradient_clip=0)","title":"Gradient Clipping"},{"location":"Trainer/Training Loop/#inspect-gradient-norms","text":"Looking at grad norms can help you figure out where training might be going wrong. # DEFAULT (-1 doesn't track norms) trainer = Trainer(track_grad_norm=-1) # track the LP norm (P=2 here) trainer = Trainer(track_grad_norm=2)","title":"Inspect gradient norms"},{"location":"Trainer/Training Loop/#set-how-much-of-the-training-set-to-check","text":"If you don't want to check 100% of the training set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(train_percent_check=1.0) # check 10% only trainer = Trainer(train_percent_check=0.1)","title":"Set how much of the training set to check"},{"location":"Trainer/Validation loop/","text":"The lightning validation loop handles everything except the actual computations of your model. To decide what will happen in your validation loop, define the validation_step function . Below are all the things lightning automates for you in the validation loop. Note Lightning will run 5 steps of validation in the beginning of training as a sanity check so you don't have to wait until a full epoch to catch possible validation issues. Check validation every n epochs If you have a small dataset you might want to check validation every n epochs # DEFAULT trainer = Trainer(check_val_every_n_epoch=1) Set how much of the validation set to check If you don't want to check 100% of the validation set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(val_percent_check=1.0) # check 10% only trainer = Trainer(val_percent_check=0.1) Set how much of the test set to check If you don't want to check 100% of the test set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(test_percent_check=1.0) # check 10% only trainer = Trainer(test_percent_check=0.1) Set validation check frequency within 1 training epoch For large datasets it's often desirable to check validation multiple times within a training loop # DEFAULT trainer = Trainer(val_check_interval=0.95) # check every .25 of an epoch trainer = Trainer(val_check_interval=0.25) Set the number of validation sanity steps Lightning runs a few steps of validation in the beginning of training. This avoids crashing in the validation loop sometime deep into a lengthy training loop. # DEFAULT trainer = Trainer(nb_sanity_val_steps=5)","title":"Validation loop"},{"location":"Trainer/Validation loop/#check-validation-every-n-epochs","text":"If you have a small dataset you might want to check validation every n epochs # DEFAULT trainer = Trainer(check_val_every_n_epoch=1)","title":"Check validation every n epochs"},{"location":"Trainer/Validation loop/#set-how-much-of-the-validation-set-to-check","text":"If you don't want to check 100% of the validation set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(val_percent_check=1.0) # check 10% only trainer = Trainer(val_percent_check=0.1)","title":"Set how much of the validation set to check"},{"location":"Trainer/Validation loop/#set-how-much-of-the-test-set-to-check","text":"If you don't want to check 100% of the test set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(test_percent_check=1.0) # check 10% only trainer = Trainer(test_percent_check=0.1)","title":"Set how much of the test set to check"},{"location":"Trainer/Validation loop/#set-validation-check-frequency-within-1-training-epoch","text":"For large datasets it's often desirable to check validation multiple times within a training loop # DEFAULT trainer = Trainer(val_check_interval=0.95) # check every .25 of an epoch trainer = Trainer(val_check_interval=0.25)","title":"Set validation check frequency within 1 training epoch"},{"location":"Trainer/Validation loop/#set-the-number-of-validation-sanity-steps","text":"Lightning runs a few steps of validation in the beginning of training. This avoids crashing in the validation loop sometime deep into a lengthy training loop. # DEFAULT trainer = Trainer(nb_sanity_val_steps=5)","title":"Set the number of validation sanity steps"},{"location":"Trainer/debugging/","text":"These flags are useful to help debug a model. Fast dev run This flag is meant for debugging a full train/val/test loop. It'll activate callbacks, everything but only with 1 training and 1 validation batch. Use this to debug a full run of your program quickly # DEFAULT trainer = Trainer(fast_dev_run=False) Inspect gradient norms Looking at grad norms can help you figure out where training might be going wrong. # DEFAULT (-1 doesn't track norms) trainer = Trainer(track_grad_norm=-1) # track the LP norm (P=2 here) trainer = Trainer(track_grad_norm=2) Make model overfit on subset of data A useful debugging trick is to make your model overfit a tiny fraction of the data. # DEFAULT don't overfit (ie: normal training) trainer = Trainer(overfit_pct=0.0) # overfit on 1% of data trainer = Trainer(overfit_pct=0.01) Print the parameter count by layer By default lightning prints a list of parameters and submodules when it starts training. Print which gradients are nan This option prints a list of tensors with nan gradients. # DEFAULT trainer = Trainer(print_nan_grads=False) Log GPU usage Lightning automatically logs gpu usage to the test tube logs. It'll only do it at the metric logging interval, so it doesn't slow down training.","title":"Debugging"},{"location":"Trainer/debugging/#fast-dev-run","text":"This flag is meant for debugging a full train/val/test loop. It'll activate callbacks, everything but only with 1 training and 1 validation batch. Use this to debug a full run of your program quickly # DEFAULT trainer = Trainer(fast_dev_run=False)","title":"Fast dev run"},{"location":"Trainer/debugging/#inspect-gradient-norms","text":"Looking at grad norms can help you figure out where training might be going wrong. # DEFAULT (-1 doesn't track norms) trainer = Trainer(track_grad_norm=-1) # track the LP norm (P=2 here) trainer = Trainer(track_grad_norm=2)","title":"Inspect gradient norms"},{"location":"Trainer/debugging/#make-model-overfit-on-subset-of-data","text":"A useful debugging trick is to make your model overfit a tiny fraction of the data. # DEFAULT don't overfit (ie: normal training) trainer = Trainer(overfit_pct=0.0) # overfit on 1% of data trainer = Trainer(overfit_pct=0.01)","title":"Make model overfit on subset of data"},{"location":"Trainer/debugging/#print-the-parameter-count-by-layer","text":"By default lightning prints a list of parameters and submodules when it starts training.","title":"Print the parameter count by layer"},{"location":"Trainer/debugging/#print-which-gradients-are-nan","text":"This option prints a list of tensors with nan gradients. # DEFAULT trainer = Trainer(print_nan_grads=False)","title":"Print which gradients are nan"},{"location":"Trainer/debugging/#log-gpu-usage","text":"Lightning automatically logs gpu usage to the test tube logs. It'll only do it at the metric logging interval, so it doesn't slow down training.","title":"Log GPU usage"},{"location":"Trainer/hooks/","text":"Hooks [ Github Code ] There are cases when you might want to do something different at different parts of the training/validation loop. To enable a hook, simply override the method in your LightningModule and the trainer will call it at the correct time. Contributing If there's a hook you'd like to add, simply: 1. Fork PyTorchLightning. 2. Add the hook here . 3. Add the correct place in the Trainer where it should be called. on_epoch_start Called in the training loop at the very beginning of the epoch. def on_epoch_start(self): # do something when the epoch starts on_batch_end Called in the training loop at the very end of the epoch. def on_epoch_end(self): # do something when the epoch ends on_batch_start Called in the training loop before anything happens for that batch. def on_batch_start(self): # do something when the batch starts on_pre_performance_check Called at the very beginning of the validation loop. def on_pre_performance_check(self): # do something before validation starts on_post_performance_check Called at the very end of the validation loop. def on_post_performance_check(self): # do something before validation end on_tng_metrics Called in the training loop, right before metrics are logged. Although you can log at any time by using self.experiment, you can use this callback to modify what will be logged. def on_tng_metrics(self, metrics): # do something before validation end on_before_zero_grad Called in the training loop after taking an optimizer step and before zeroing grads. Good place to inspect weight information with weights updated. Called once per optimizer def on_before_zero_grad(self, optimizer): # do something with the optimizer or inspect it. on_after_backward Called in the training loop after model.backward() This is the ideal place to inspect or log gradient information def on_after_backward(self): # example to inspect gradient information in tensorboard if self.trainer.global_step % 25 == 0: # don't make the tf file huge params = self.state_dict() for k, v in params.items(): grads = v name = k self.experiment.add_histogram(tag=name, values=grads, global_step=self.trainer.global_step)","title":"Hooks"},{"location":"Trainer/hooks/#hooks","text":"[ Github Code ] There are cases when you might want to do something different at different parts of the training/validation loop. To enable a hook, simply override the method in your LightningModule and the trainer will call it at the correct time. Contributing If there's a hook you'd like to add, simply: 1. Fork PyTorchLightning. 2. Add the hook here . 3. Add the correct place in the Trainer where it should be called.","title":"Hooks"},{"location":"Trainer/hooks/#on_epoch_start","text":"Called in the training loop at the very beginning of the epoch. def on_epoch_start(self): # do something when the epoch starts","title":"on_epoch_start"},{"location":"Trainer/hooks/#on_batch_end","text":"Called in the training loop at the very end of the epoch. def on_epoch_end(self): # do something when the epoch ends","title":"on_batch_end"},{"location":"Trainer/hooks/#on_batch_start","text":"Called in the training loop before anything happens for that batch. def on_batch_start(self): # do something when the batch starts","title":"on_batch_start"},{"location":"Trainer/hooks/#on_pre_performance_check","text":"Called at the very beginning of the validation loop. def on_pre_performance_check(self): # do something before validation starts","title":"on_pre_performance_check"},{"location":"Trainer/hooks/#on_post_performance_check","text":"Called at the very end of the validation loop. def on_post_performance_check(self): # do something before validation end","title":"on_post_performance_check"},{"location":"Trainer/hooks/#on_tng_metrics","text":"Called in the training loop, right before metrics are logged. Although you can log at any time by using self.experiment, you can use this callback to modify what will be logged. def on_tng_metrics(self, metrics): # do something before validation end","title":"on_tng_metrics"},{"location":"Trainer/hooks/#on_before_zero_grad","text":"Called in the training loop after taking an optimizer step and before zeroing grads. Good place to inspect weight information with weights updated. Called once per optimizer def on_before_zero_grad(self, optimizer): # do something with the optimizer or inspect it.","title":"on_before_zero_grad"},{"location":"Trainer/hooks/#on_after_backward","text":"Called in the training loop after model.backward() This is the ideal place to inspect or log gradient information def on_after_backward(self): # example to inspect gradient information in tensorboard if self.trainer.global_step % 25 == 0: # don't make the tf file huge params = self.state_dict() for k, v in params.items(): grads = v name = k self.experiment.add_histogram(tag=name, values=grads, global_step=self.trainer.global_step)","title":"on_after_backward"},{"location":"examples/Examples/","text":"Template model definition In 99% of cases you want to just copy this template to start a new lightningModule and change the core of what your model is actually trying to do. # get a copy of the module template wget https://github.com/williamFalcon/pytorch-lightning/blob/master/examples/new_project_templates/lightning_module_template.py Trainer Example __main__ function Normally, we want to let the __main__ function start the training. Inside the main we parse training arguments with whatever hyperparameters we want. Your LightningModule will have a chance to add hyperparameters. from test_tube import HyperOptArgumentParser if __name__ == '__main__': # use default args given by lightning root_dir = os.path.split(os.path.dirname(sys.modules['__main__'].__file__))[0] parent_parser = HyperOptArgumentParser(strategy='random_search', add_help=False) add_default_args(parent_parser, root_dir) # allow model to overwrite or extend args parser = ExampleModel.add_model_specific_args(parent_parser) hyperparams = parser.parse_args() # train model main(hyperparams) Main Function The main function is your entry into the program. This is where you init your model, checkpoint directory, and launch the training. The main function should have 3 arguments: - hparams: a configuration of hyperparameters. - slurm_manager: Slurm cluster manager object (can be None) - dict: for you to return any values you want (useful in meta-learning, otherwise set to _) def main(hparams, cluster, results_dict): \"\"\" Main training routine specific for this project :param hparams: :return: \"\"\" # init experiment log_dir = os.path.dirname(os.path.realpath(__file__)) exp = Experiment( name='test_tube_exp', debug=True, save_dir=log_dir, version=0, autosave=False, description='test demo' ) # set the hparams for the experiment exp.argparse(hparams) exp.save() # build model model = MyLightningModule(hparams) # callbacks early_stop = EarlyStopping( monitor=hparams.early_stop_metric, patience=hparams.early_stop_patience, verbose=True, mode=hparams.early_stop_mode ) model_save_path = '{}/{}/{}'.format(hparams.model_save_path, exp.name, exp.version) checkpoint = ModelCheckpoint( filepath=model_save_path, save_function=None, save_best_only=True, verbose=True, monitor=hparams.model_save_monitor_value, mode=hparams.model_save_monitor_mode ) # configure trainer trainer = Trainer( experiment=exp, cluster=cluster, checkpoint_callback=checkpoint, early_stop_callback=early_stop, ) # train model trainer.fit(model) The main function will start training on your main function. If you use the HyperParameterOptimizer in hyper parameter optimization mode, this main function will get one set of hyperparameters. If you use it as a simple argument parser you get the default arguments in the argument parser. So, calling main(hyperparams) runs the model with the default argparse arguments. main(hyperparams) CPU hyperparameter search # run a grid search over 20 hyperparameter combinations. hyperparams.optimize_parallel_cpu( main_local, nb_trials=20, nb_workers=1 ) Hyperparameter search on a single or multiple GPUs # run a grid search over 20 hyperparameter combinations. hyperparams.optimize_parallel_gpu( main_local, nb_trials=20, nb_workers=1, gpus=[0,1,2,3] ) Hyperparameter search on a SLURM HPC cluster def optimize_on_cluster(hyperparams): # enable cluster training cluster = SlurmCluster( hyperparam_optimizer=hyperparams, log_path=hyperparams.tt_save_path, test_tube_exp_name=hyperparams.tt_name ) # email for cluster coms cluster.notify_job_status(email='add_email_here', on_done=True, on_fail=True) # configure cluster cluster.per_experiment_nb_gpus = hyperparams.per_experiment_nb_gpus cluster.job_time = '48:00:00' cluster.gpu_type = '1080ti' cluster.memory_mb_per_node = 48000 # any modules for code to run in env cluster.add_command('source activate pytorch_lightning') # name of exp job_display_name = hyperparams.tt_name.split('_')[0] job_display_name = job_display_name[0:3] # run hopt print('submitting jobs...') cluster.optimize_parallel_cluster_gpu( main, nb_trials=hyperparams.nb_hopt_trials, job_name=job_display_name ) # run cluster hyperparameter search optimize_on_cluster(hyperparams)","title":"Examples"},{"location":"examples/Examples/#template-model-definition","text":"In 99% of cases you want to just copy this template to start a new lightningModule and change the core of what your model is actually trying to do. # get a copy of the module template wget https://github.com/williamFalcon/pytorch-lightning/blob/master/examples/new_project_templates/lightning_module_template.py","title":"Template model definition"},{"location":"examples/Examples/#trainer-example","text":"__main__ function Normally, we want to let the __main__ function start the training. Inside the main we parse training arguments with whatever hyperparameters we want. Your LightningModule will have a chance to add hyperparameters. from test_tube import HyperOptArgumentParser if __name__ == '__main__': # use default args given by lightning root_dir = os.path.split(os.path.dirname(sys.modules['__main__'].__file__))[0] parent_parser = HyperOptArgumentParser(strategy='random_search', add_help=False) add_default_args(parent_parser, root_dir) # allow model to overwrite or extend args parser = ExampleModel.add_model_specific_args(parent_parser) hyperparams = parser.parse_args() # train model main(hyperparams) Main Function The main function is your entry into the program. This is where you init your model, checkpoint directory, and launch the training. The main function should have 3 arguments: - hparams: a configuration of hyperparameters. - slurm_manager: Slurm cluster manager object (can be None) - dict: for you to return any values you want (useful in meta-learning, otherwise set to _) def main(hparams, cluster, results_dict): \"\"\" Main training routine specific for this project :param hparams: :return: \"\"\" # init experiment log_dir = os.path.dirname(os.path.realpath(__file__)) exp = Experiment( name='test_tube_exp', debug=True, save_dir=log_dir, version=0, autosave=False, description='test demo' ) # set the hparams for the experiment exp.argparse(hparams) exp.save() # build model model = MyLightningModule(hparams) # callbacks early_stop = EarlyStopping( monitor=hparams.early_stop_metric, patience=hparams.early_stop_patience, verbose=True, mode=hparams.early_stop_mode ) model_save_path = '{}/{}/{}'.format(hparams.model_save_path, exp.name, exp.version) checkpoint = ModelCheckpoint( filepath=model_save_path, save_function=None, save_best_only=True, verbose=True, monitor=hparams.model_save_monitor_value, mode=hparams.model_save_monitor_mode ) # configure trainer trainer = Trainer( experiment=exp, cluster=cluster, checkpoint_callback=checkpoint, early_stop_callback=early_stop, ) # train model trainer.fit(model) The main function will start training on your main function. If you use the HyperParameterOptimizer in hyper parameter optimization mode, this main function will get one set of hyperparameters. If you use it as a simple argument parser you get the default arguments in the argument parser. So, calling main(hyperparams) runs the model with the default argparse arguments. main(hyperparams)","title":"Trainer Example"},{"location":"examples/Examples/#cpu-hyperparameter-search","text":"# run a grid search over 20 hyperparameter combinations. hyperparams.optimize_parallel_cpu( main_local, nb_trials=20, nb_workers=1 )","title":"CPU hyperparameter search"},{"location":"examples/Examples/#hyperparameter-search-on-a-single-or-multiple-gpus","text":"# run a grid search over 20 hyperparameter combinations. hyperparams.optimize_parallel_gpu( main_local, nb_trials=20, nb_workers=1, gpus=[0,1,2,3] )","title":"Hyperparameter search on a single or multiple GPUs"},{"location":"examples/Examples/#hyperparameter-search-on-a-slurm-hpc-cluster","text":"def optimize_on_cluster(hyperparams): # enable cluster training cluster = SlurmCluster( hyperparam_optimizer=hyperparams, log_path=hyperparams.tt_save_path, test_tube_exp_name=hyperparams.tt_name ) # email for cluster coms cluster.notify_job_status(email='add_email_here', on_done=True, on_fail=True) # configure cluster cluster.per_experiment_nb_gpus = hyperparams.per_experiment_nb_gpus cluster.job_time = '48:00:00' cluster.gpu_type = '1080ti' cluster.memory_mb_per_node = 48000 # any modules for code to run in env cluster.add_command('source activate pytorch_lightning') # name of exp job_display_name = hyperparams.tt_name.split('_')[0] job_display_name = job_display_name[0:3] # run hopt print('submitting jobs...') cluster.optimize_parallel_cluster_gpu( main, nb_trials=hyperparams.nb_hopt_trials, job_name=job_display_name ) # run cluster hyperparameter search optimize_on_cluster(hyperparams)","title":"Hyperparameter search on a SLURM HPC cluster"}]} \ No newline at end of file +{"config":{"lang":["en"],"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"New project Quick Start To start a new project you define two files, a LightningModule and a Trainer file. A separate trainer file allows to run many LightningModules. Each LightningModule has the core logic to a particular research project. For example, one lightningModule could be an image classifier, the other one could be a seq-2-seq model, both (optionally) ran by the same trainer file. MNIST LightningModule Trainer Basic CPU Trainer Template Multi-GPU Trainer Template GPU cluster Trainer Template Docs shortcuts LightningModule Trainer Quick start examples CPU example Hyperparameter search on single GPU Hyperparameter search on multiple GPUs on same node Hyperparameter search on a SLURM HPC cluster Checkpointing Model saving Model loading Computing cluster (SLURM) Running grid search on a cluster Walltime auto-resubmit Debugging Fast dev run Inspect gradient norms Log GPU usage Make model overfit on subset of data Print the parameter count by layer Pring which gradients are nan Distributed training 16-bit mixed precision Multi-GPU Multi-node Single GPU Self-balancing architecture Experiment Logging Display metrics in progress bar Log metric row every k batches Process position Tensorboard support Save a snapshot of all hyperparameters Snapshot code for a training run Write logs file to csv every k batches Training loop Accumulate gradients Force training for min or max epochs Force disable early stop Gradient Clipping Hooks Learning rate scheduling Use multiple optimizers (like GANs) Set how much of the training set to check (1-100%) Validation loop Check validation every n epochs Hooks Set how much of the validation set to check Set how much of the test set to check Set validation check frequency within 1 training epoch Set the number of validation sanity steps","title":"Home"},{"location":"#new-project-quick-start","text":"To start a new project you define two files, a LightningModule and a Trainer file. A separate trainer file allows to run many LightningModules. Each LightningModule has the core logic to a particular research project. For example, one lightningModule could be an image classifier, the other one could be a seq-2-seq model, both (optionally) ran by the same trainer file. MNIST LightningModule Trainer Basic CPU Trainer Template Multi-GPU Trainer Template GPU cluster Trainer Template","title":"New project Quick Start"},{"location":"#docs-shortcuts","text":"LightningModule Trainer","title":"Docs shortcuts"},{"location":"#quick-start-examples","text":"CPU example Hyperparameter search on single GPU Hyperparameter search on multiple GPUs on same node Hyperparameter search on a SLURM HPC cluster","title":"Quick start examples"},{"location":"#checkpointing","text":"Model saving Model loading","title":"Checkpointing"},{"location":"#computing-cluster-slurm","text":"Running grid search on a cluster Walltime auto-resubmit","title":"Computing cluster (SLURM)"},{"location":"#debugging","text":"Fast dev run Inspect gradient norms Log GPU usage Make model overfit on subset of data Print the parameter count by layer Pring which gradients are nan","title":"Debugging"},{"location":"#distributed-training","text":"16-bit mixed precision Multi-GPU Multi-node Single GPU Self-balancing architecture","title":"Distributed training"},{"location":"#experiment-logging","text":"Display metrics in progress bar Log metric row every k batches Process position Tensorboard support Save a snapshot of all hyperparameters Snapshot code for a training run Write logs file to csv every k batches","title":"Experiment Logging"},{"location":"#training-loop","text":"Accumulate gradients Force training for min or max epochs Force disable early stop Gradient Clipping Hooks Learning rate scheduling Use multiple optimizers (like GANs) Set how much of the training set to check (1-100%)","title":"Training loop"},{"location":"#validation-loop","text":"Check validation every n epochs Hooks Set how much of the validation set to check Set how much of the test set to check Set validation check frequency within 1 training epoch Set the number of validation sanity steps","title":"Validation loop"},{"location":"LightningModule/RequiredTrainerInterface/","text":"Lightning Module interface [ Github Code ] A lightning module is a strict superclass of nn.Module, it provides a standard interface for the trainer to interact with the model. The easiest thing to do is copy the minimal example below and modify accordingly. Otherwise, to Define a Lightning Module, implement the following methods: Required : training_step validation_step validation_end configure_optimizers tng_dataloader tng_dataloader test_dataloader Optional : on_save_checkpoint on_load_checkpoint update_tng_log_metrics add_model_specific_args Minimal example import os import torch from torch.nn import functional as F from torch.utils.data import DataLoader from torchvision.datasets import MNIST import torchvision.transforms as transforms import pytorch_lightning as ptl class CoolModel(ptl.LightningModule): def __init__(self): super(CoolModel, self).__init__() # not the best model... self.l1 = torch.nn.Linear(28 * 28, 10) def forward(self, x): return torch.relu(self.l1(x.view(x.size(0), -1))) def my_loss(self, y_hat, y): return F.cross_entropy(y_hat, y) def training_step(self, batch, batch_nb): x, y = batch y_hat = self.forward(x) return {'loss': self.my_loss(y_hat, y)} def validation_step(self, batch, batch_nb): x, y = batch y_hat = self.forward(x) return {'val_loss': self.my_loss(y_hat, y)} def validation_end(self, outputs): avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean() return {'avg_val_loss': avg_loss} def configure_optimizers(self): return [torch.optim.Adam(self.parameters(), lr=0.02)] @ptl.data_loader def tng_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) @ptl.data_loader def val_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) @ptl.data_loader def test_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) How do these methods fit into the broader training? The LightningModule interface is on the right. Each method corresponds to a part of a research project. Lightning automates everything not in blue. training_step def training_step(self, data_batch, batch_nb) In this step you'd normally do the forward pass and calculate the loss for a batch. You can also do fancier things like multiple forward passes or something specific to your model. Params Param description data_batch The output of your dataloader. A tensor, tuple or list batch_nb Integer displaying which batch this is Return Dictionary or OrderedDict key value is required loss tensor scalar Y prog Dict for progress bar display. Must have only tensors N Example def training_step(self, data_batch, batch_nb): x, y, z = data_batch # implement your own out = self.forward(x) loss = self.loss(out, x) output = { 'loss': loss, # required 'prog': {'tng_loss': loss, 'batch_nb': batch_nb} # optional } # return a dict return output validation_step def validation_step(self, data_batch, batch_nb) In this step you'd normally do the forward pass and calculate the loss for a batch. You can also do fancier things like multiple forward passes or something specific to your model. This is most likely the same as your training_step. But unlike training step, the outputs from here will go to validation_end for collation. Params Param description data_batch The output of your dataloader. A tensor, tuple or list batch_nb Integer displaying which batch this is Return Return description optional dict Dict of OrderedDict with metrics to display in progress bar. All keys must be tensors. Y Example def validation_step(self, data_batch, batch_nb): x, y, z = data_batch # implement your own out = self.forward(x) loss = self.loss(out, x) # calculate acc labels_hat = torch.argmax(out, dim=1) val_acc = torch.sum(y == labels_hat).item() / (len(y) * 1.0) # all optional... # return whatever you need for the collation function validation_end output = OrderedDict({ 'val_loss': loss_val, 'val_acc': torch.tensor(val_acc), # everything must be a tensor }) # return an optional dict return output validation_end def validation_end(self, outputs) Called at the end of the validation loop with the output of each validation_step. Params Param description outputs List of outputs you defined in validation_step Return Return description optional dict Dict of OrderedDict with metrics to display in progress bar Y Example def validation_end(self, outputs): \"\"\" Called at the end of validation to aggregate outputs :param outputs: list of individual outputs of each validation step :return: \"\"\" val_loss_mean = 0 val_acc_mean = 0 for output in outputs: val_loss_mean += output['val_loss'] val_acc_mean += output['val_acc'] val_loss_mean /= len(outputs) val_acc_mean /= len(outputs) tqdm_dic = {'val_loss': val_loss_mean.item(), 'val_acc': val_acc_mean.item()} return tqdm_dic configure_optimizers def configure_optimizers(self) Set up as many optimizers and (optionally) learning rate schedulers as you need. Normally you'd need one. But in the case of GANs or something more esoteric you might have multiple. Lightning will call .backward() and .step() on each one in every epoch. If you use 16 bit precision it will also handle that. Return List or Tuple - List of optimizers with an optional second list of learning-rate schedulers Example # most cases def configure_optimizers(self): opt = Adam(self.parameters(), lr=0.01) return [opt] # gan example, with scheduler for discriminator def configure_optimizers(self): generator_opt = Adam(self.model_gen.parameters(), lr=0.01) disriminator_opt = Adam(self.model_disc.parameters(), lr=0.02) discriminator_sched = CosineAnnealing(discriminator_opt, T_max=10) return [generator_opt, disriminator_opt], [discriminator_sched] on_save_checkpoint def on_save_checkpoint(self, checkpoint) Called by lightning to checkpoint your model. Lightning saves the training state (current epoch, global_step, etc) and also saves the model state_dict. If you want to save anything else, use this method to add your own key-value pair. Return Nothing Example def on_save_checkpoint(self, checkpoint): # 99% of use cases you don't need to implement this method checkpoint['something_cool_i_want_to_save'] = my_cool_pickable_object on_load_checkpoint def on_load_checkpoint(self, checkpoint) Called by lightning to restore your model. Lighting auto-restores global step, epoch, etc... It also restores the model state_dict. If you saved something with on_save_checkpoint this is your chance to restore this. Return Nothing Example def on_load_checkpoint(self, checkpoint): # 99% of the time you don't need to implement this method self.something_cool_i_want_to_save = checkpoint['something_cool_i_want_to_save'] tng_dataloader @ptl.data_loader def tng_dataloader(self) Called by lightning during training loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed. Return PyTorch DataLoader Example @ptl.data_loader def tng_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=True, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader val_dataloader @ptl.data_loader def tng_dataloader(self) Called by lightning during validation loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed. Return PyTorch DataLoader Example @ptl.data_loader def val_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=False, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader test_dataloader @ptl.data_loader def test_dataloader(self) Called by lightning during test loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed. Return PyTorch DataLoader Example @ptl.data_loader def test_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=False, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader update_tng_log_metrics def update_tng_log_metrics(self, logs) Called by lightning right before it logs metrics for this batch. This is a chance to ammend or add to the metrics about to be logged. Return Dict Example def update_tng_log_metrics(self, logs): # modify or add to logs return logs add_model_specific_args @staticmethod def add_model_specific_args(parent_parser, root_dir) Lightning has a list of default argparse commands. This method is your chance to add or modify commands specific to your model. The hyperparameter argument parser is available anywhere in your model by calling self.hparams. Return An argument parser Example @staticmethod def add_model_specific_args(parent_parser, root_dir): parser = HyperOptArgumentParser(strategy=parent_parser.strategy, parents=[parent_parser]) # param overwrites # parser.set_defaults(gradient_clip=5.0) # network params parser.opt_list('--drop_prob', default=0.2, options=[0.2, 0.5], type=float, tunable=False) parser.add_argument('--in_features', default=28*28) parser.add_argument('--out_features', default=10) parser.add_argument('--hidden_dim', default=50000) # use 500 for CPU, 50000 for GPU to see speed difference # data parser.add_argument('--data_root', default=os.path.join(root_dir, 'mnist'), type=str) # training params (opt) parser.opt_list('--learning_rate', default=0.001, type=float, options=[0.0001, 0.0005, 0.001, 0.005], tunable=False) parser.opt_list('--batch_size', default=256, type=int, options=[32, 64, 128, 256], tunable=False) parser.opt_list('--optimizer_name', default='adam', type=str, options=['adam'], tunable=False) return parser","title":"Lightning Module interface"},{"location":"LightningModule/RequiredTrainerInterface/#lightning-module-interface","text":"[ Github Code ] A lightning module is a strict superclass of nn.Module, it provides a standard interface for the trainer to interact with the model. The easiest thing to do is copy the minimal example below and modify accordingly. Otherwise, to Define a Lightning Module, implement the following methods: Required : training_step validation_step validation_end configure_optimizers tng_dataloader tng_dataloader test_dataloader Optional : on_save_checkpoint on_load_checkpoint update_tng_log_metrics add_model_specific_args","title":"Lightning Module interface"},{"location":"LightningModule/RequiredTrainerInterface/#minimal-example","text":"import os import torch from torch.nn import functional as F from torch.utils.data import DataLoader from torchvision.datasets import MNIST import torchvision.transforms as transforms import pytorch_lightning as ptl class CoolModel(ptl.LightningModule): def __init__(self): super(CoolModel, self).__init__() # not the best model... self.l1 = torch.nn.Linear(28 * 28, 10) def forward(self, x): return torch.relu(self.l1(x.view(x.size(0), -1))) def my_loss(self, y_hat, y): return F.cross_entropy(y_hat, y) def training_step(self, batch, batch_nb): x, y = batch y_hat = self.forward(x) return {'loss': self.my_loss(y_hat, y)} def validation_step(self, batch, batch_nb): x, y = batch y_hat = self.forward(x) return {'val_loss': self.my_loss(y_hat, y)} def validation_end(self, outputs): avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean() return {'avg_val_loss': avg_loss} def configure_optimizers(self): return [torch.optim.Adam(self.parameters(), lr=0.02)] @ptl.data_loader def tng_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) @ptl.data_loader def val_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32) @ptl.data_loader def test_dataloader(self): return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32)","title":"Minimal example"},{"location":"LightningModule/RequiredTrainerInterface/#how-do-these-methods-fit-into-the-broader-training","text":"The LightningModule interface is on the right. Each method corresponds to a part of a research project. Lightning automates everything not in blue.","title":"How do these methods fit into the broader training?"},{"location":"LightningModule/RequiredTrainerInterface/#training_step","text":"def training_step(self, data_batch, batch_nb) In this step you'd normally do the forward pass and calculate the loss for a batch. You can also do fancier things like multiple forward passes or something specific to your model. Params Param description data_batch The output of your dataloader. A tensor, tuple or list batch_nb Integer displaying which batch this is Return Dictionary or OrderedDict key value is required loss tensor scalar Y prog Dict for progress bar display. Must have only tensors N Example def training_step(self, data_batch, batch_nb): x, y, z = data_batch # implement your own out = self.forward(x) loss = self.loss(out, x) output = { 'loss': loss, # required 'prog': {'tng_loss': loss, 'batch_nb': batch_nb} # optional } # return a dict return output","title":"training_step"},{"location":"LightningModule/RequiredTrainerInterface/#validation_step","text":"def validation_step(self, data_batch, batch_nb) In this step you'd normally do the forward pass and calculate the loss for a batch. You can also do fancier things like multiple forward passes or something specific to your model. This is most likely the same as your training_step. But unlike training step, the outputs from here will go to validation_end for collation. Params Param description data_batch The output of your dataloader. A tensor, tuple or list batch_nb Integer displaying which batch this is Return Return description optional dict Dict of OrderedDict with metrics to display in progress bar. All keys must be tensors. Y Example def validation_step(self, data_batch, batch_nb): x, y, z = data_batch # implement your own out = self.forward(x) loss = self.loss(out, x) # calculate acc labels_hat = torch.argmax(out, dim=1) val_acc = torch.sum(y == labels_hat).item() / (len(y) * 1.0) # all optional... # return whatever you need for the collation function validation_end output = OrderedDict({ 'val_loss': loss_val, 'val_acc': torch.tensor(val_acc), # everything must be a tensor }) # return an optional dict return output","title":"validation_step"},{"location":"LightningModule/RequiredTrainerInterface/#validation_end","text":"def validation_end(self, outputs) Called at the end of the validation loop with the output of each validation_step. Params Param description outputs List of outputs you defined in validation_step Return Return description optional dict Dict of OrderedDict with metrics to display in progress bar Y Example def validation_end(self, outputs): \"\"\" Called at the end of validation to aggregate outputs :param outputs: list of individual outputs of each validation step :return: \"\"\" val_loss_mean = 0 val_acc_mean = 0 for output in outputs: val_loss_mean += output['val_loss'] val_acc_mean += output['val_acc'] val_loss_mean /= len(outputs) val_acc_mean /= len(outputs) tqdm_dic = {'val_loss': val_loss_mean.item(), 'val_acc': val_acc_mean.item()} return tqdm_dic","title":"validation_end"},{"location":"LightningModule/RequiredTrainerInterface/#configure_optimizers","text":"def configure_optimizers(self) Set up as many optimizers and (optionally) learning rate schedulers as you need. Normally you'd need one. But in the case of GANs or something more esoteric you might have multiple. Lightning will call .backward() and .step() on each one in every epoch. If you use 16 bit precision it will also handle that.","title":"configure_optimizers"},{"location":"LightningModule/RequiredTrainerInterface/#return","text":"List or Tuple - List of optimizers with an optional second list of learning-rate schedulers Example # most cases def configure_optimizers(self): opt = Adam(self.parameters(), lr=0.01) return [opt] # gan example, with scheduler for discriminator def configure_optimizers(self): generator_opt = Adam(self.model_gen.parameters(), lr=0.01) disriminator_opt = Adam(self.model_disc.parameters(), lr=0.02) discriminator_sched = CosineAnnealing(discriminator_opt, T_max=10) return [generator_opt, disriminator_opt], [discriminator_sched]","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#on_save_checkpoint","text":"def on_save_checkpoint(self, checkpoint) Called by lightning to checkpoint your model. Lightning saves the training state (current epoch, global_step, etc) and also saves the model state_dict. If you want to save anything else, use this method to add your own key-value pair.","title":"on_save_checkpoint"},{"location":"LightningModule/RequiredTrainerInterface/#return_1","text":"Nothing Example def on_save_checkpoint(self, checkpoint): # 99% of use cases you don't need to implement this method checkpoint['something_cool_i_want_to_save'] = my_cool_pickable_object","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#on_load_checkpoint","text":"def on_load_checkpoint(self, checkpoint) Called by lightning to restore your model. Lighting auto-restores global step, epoch, etc... It also restores the model state_dict. If you saved something with on_save_checkpoint this is your chance to restore this.","title":"on_load_checkpoint"},{"location":"LightningModule/RequiredTrainerInterface/#return_2","text":"Nothing Example def on_load_checkpoint(self, checkpoint): # 99% of the time you don't need to implement this method self.something_cool_i_want_to_save = checkpoint['something_cool_i_want_to_save']","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#tng_dataloader","text":"@ptl.data_loader def tng_dataloader(self) Called by lightning during training loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed.","title":"tng_dataloader"},{"location":"LightningModule/RequiredTrainerInterface/#return_3","text":"PyTorch DataLoader Example @ptl.data_loader def tng_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=True, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#val_dataloader","text":"@ptl.data_loader def tng_dataloader(self) Called by lightning during validation loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed.","title":"val_dataloader"},{"location":"LightningModule/RequiredTrainerInterface/#return_4","text":"PyTorch DataLoader Example @ptl.data_loader def val_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=False, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#test_dataloader","text":"@ptl.data_loader def test_dataloader(self) Called by lightning during test loop. Make sure to use the @ptl.data_loader decorator, this ensures not calling this function until the data are needed.","title":"test_dataloader"},{"location":"LightningModule/RequiredTrainerInterface/#return_5","text":"PyTorch DataLoader Example @ptl.data_loader def test_dataloader(self): transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (1.0,))]) dataset = MNIST(root='/path/to/mnist/', train=False, transform=transform, download=True) loader = torch.utils.data.DataLoader( dataset=dataset, batch_size=self.hparams.batch_size, shuffle=True ) return loader","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#update_tng_log_metrics","text":"def update_tng_log_metrics(self, logs) Called by lightning right before it logs metrics for this batch. This is a chance to ammend or add to the metrics about to be logged.","title":"update_tng_log_metrics"},{"location":"LightningModule/RequiredTrainerInterface/#return_6","text":"Dict Example def update_tng_log_metrics(self, logs): # modify or add to logs return logs","title":"Return"},{"location":"LightningModule/RequiredTrainerInterface/#add_model_specific_args","text":"@staticmethod def add_model_specific_args(parent_parser, root_dir) Lightning has a list of default argparse commands. This method is your chance to add or modify commands specific to your model. The hyperparameter argument parser is available anywhere in your model by calling self.hparams.","title":"add_model_specific_args"},{"location":"LightningModule/RequiredTrainerInterface/#return_7","text":"An argument parser Example @staticmethod def add_model_specific_args(parent_parser, root_dir): parser = HyperOptArgumentParser(strategy=parent_parser.strategy, parents=[parent_parser]) # param overwrites # parser.set_defaults(gradient_clip=5.0) # network params parser.opt_list('--drop_prob', default=0.2, options=[0.2, 0.5], type=float, tunable=False) parser.add_argument('--in_features', default=28*28) parser.add_argument('--out_features', default=10) parser.add_argument('--hidden_dim', default=50000) # use 500 for CPU, 50000 for GPU to see speed difference # data parser.add_argument('--data_root', default=os.path.join(root_dir, 'mnist'), type=str) # training params (opt) parser.opt_list('--learning_rate', default=0.001, type=float, options=[0.0001, 0.0005, 0.001, 0.005], tunable=False) parser.opt_list('--batch_size', default=256, type=int, options=[32, 64, 128, 256], tunable=False) parser.opt_list('--optimizer_name', default='adam', type=str, options=['adam'], tunable=False) return parser","title":"Return"},{"location":"LightningModule/methods/","text":"Lightning modules are strict superclasses of torch.nn.Module. A LightningModule offers the following in addition to that API. freeze Freeze all params for inference model = MyLightningModule(...) model.freeze() load_from_metrics This is the easiest/fastest way which uses the meta_tags.csv file from test-tube to rebuild the model. The meta_tags.csv file can be found in the test-tube experiment save_dir. pretrained_model = MyLightningModule.load_from_metrics( weights_path='/path/to/pytorch_checkpoint.ckpt', tags_csv='/path/to/test_tube/experiment/version/meta_tags.csv', on_gpu=True, map_location=None ) # predict pretrained_model.eval() pretrained_model.freeze() y_hat = pretrained_model(x) Params Param description weights_path Path to a PyTorch checkpoint tags_csv Path to meta_tags.csv file generated by the test-tube Experiment on_gpu if True, puts model on GPU. Make sure to use transforms option if model devices have changed map_location A dictionary mapping saved weight GPU devices to new GPU devices Returns LightningModule - The pretrained LightningModule unfreeze Unfreeze all params for inference model = MyLightningModule(...) model.unfreeze()","title":"Methods"},{"location":"LightningModule/methods/#freeze","text":"Freeze all params for inference model = MyLightningModule(...) model.freeze()","title":"freeze"},{"location":"LightningModule/methods/#load_from_metrics","text":"This is the easiest/fastest way which uses the meta_tags.csv file from test-tube to rebuild the model. The meta_tags.csv file can be found in the test-tube experiment save_dir. pretrained_model = MyLightningModule.load_from_metrics( weights_path='/path/to/pytorch_checkpoint.ckpt', tags_csv='/path/to/test_tube/experiment/version/meta_tags.csv', on_gpu=True, map_location=None ) # predict pretrained_model.eval() pretrained_model.freeze() y_hat = pretrained_model(x) Params Param description weights_path Path to a PyTorch checkpoint tags_csv Path to meta_tags.csv file generated by the test-tube Experiment on_gpu if True, puts model on GPU. Make sure to use transforms option if model devices have changed map_location A dictionary mapping saved weight GPU devices to new GPU devices Returns LightningModule - The pretrained LightningModule","title":"load_from_metrics"},{"location":"LightningModule/methods/#unfreeze","text":"Unfreeze all params for inference model = MyLightningModule(...) model.unfreeze()","title":"unfreeze"},{"location":"LightningModule/properties/","text":"A LightningModule has the following properties which you can access at any time current_epoch The current epoch dtype Current dtype experiment An instance of test-tube Experiment which you can use to log anything for tensorboarX. self.experiment.add_embedding(...) self.experiment.log({'val_loss': 0.9}) self.experiment.add_scalars(...) global_step Total training batches seen across all epochs gradient_clip The current gradient clip value on_gpu True if your model is currently running on GPUs. Useful to set flags around the LightningModule for different CPU vs GPU behavior. trainer Last resort access to any state the trainer has. Changing certain properties here could affect your training run. self.trainer.optimizers self.trainer.current_epoch ...","title":"Properties"},{"location":"LightningModule/properties/#current_epoch","text":"The current epoch","title":"current_epoch"},{"location":"LightningModule/properties/#dtype","text":"Current dtype","title":"dtype"},{"location":"LightningModule/properties/#experiment","text":"An instance of test-tube Experiment which you can use to log anything for tensorboarX. self.experiment.add_embedding(...) self.experiment.log({'val_loss': 0.9}) self.experiment.add_scalars(...)","title":"experiment"},{"location":"LightningModule/properties/#global_step","text":"Total training batches seen across all epochs","title":"global_step"},{"location":"LightningModule/properties/#gradient_clip","text":"The current gradient clip value","title":"gradient_clip"},{"location":"LightningModule/properties/#on_gpu","text":"True if your model is currently running on GPUs. Useful to set flags around the LightningModule for different CPU vs GPU behavior.","title":"on_gpu"},{"location":"LightningModule/properties/#trainer","text":"Last resort access to any state the trainer has. Changing certain properties here could affect your training run. self.trainer.optimizers self.trainer.current_epoch ...","title":"trainer"},{"location":"Trainer/","text":"Trainer [ Github Code ] The lightning trainer abstracts best practices for running a training, val, test routine. It calls parts of your model when it wants to hand over full control and otherwise makes training assumptions which are now standard practice in AI research. This is the basic use of the trainer: from pytorch_lightning import Trainer model = LightningTemplate() trainer = Trainer() trainer.fit(model) But of course the fun is in all the advanced things it can do: Checkpointing Model saving Model loading Computing cluster (SLURM) Running grid search on a cluster Walltime auto-resubmit Debugging Fast dev run Inspect gradient norms Log GPU usage Make model overfit on subset of data Print the parameter count by layer Pring which gradients are nan Distributed training 16-bit mixed precision Multi-GPU Multi-node Single GPU Self-balancing architecture Experiment Logging Display metrics in progress bar Log metric row every k batches Process position Tensorboard support Save a snapshot of all hyperparameters Snapshot code for a training run Write logs file to csv every k batches Training loop Accumulate gradients Force training for min or max epochs Force disable early stop Gradient Clipping Hooks Learning rate scheduling Use multiple optimizers (like GANs) Set how much of the training set to check (1-100%) Validation loop Check validation every n epochs Hooks Set how much of the validation set to check Set how much of the test set to check Set validation check frequency within 1 training epoch Set the number of validation sanity steps","title":"Trainer"},{"location":"Trainer/#trainer","text":"[ Github Code ] The lightning trainer abstracts best practices for running a training, val, test routine. It calls parts of your model when it wants to hand over full control and otherwise makes training assumptions which are now standard practice in AI research. This is the basic use of the trainer: from pytorch_lightning import Trainer model = LightningTemplate() trainer = Trainer() trainer.fit(model) But of course the fun is in all the advanced things it can do: Checkpointing Model saving Model loading Computing cluster (SLURM) Running grid search on a cluster Walltime auto-resubmit Debugging Fast dev run Inspect gradient norms Log GPU usage Make model overfit on subset of data Print the parameter count by layer Pring which gradients are nan Distributed training 16-bit mixed precision Multi-GPU Multi-node Single GPU Self-balancing architecture Experiment Logging Display metrics in progress bar Log metric row every k batches Process position Tensorboard support Save a snapshot of all hyperparameters Snapshot code for a training run Write logs file to csv every k batches Training loop Accumulate gradients Force training for min or max epochs Force disable early stop Gradient Clipping Hooks Learning rate scheduling Use multiple optimizers (like GANs) Set how much of the training set to check (1-100%) Validation loop Check validation every n epochs Hooks Set how much of the validation set to check Set how much of the test set to check Set validation check frequency within 1 training epoch Set the number of validation sanity steps","title":"Trainer"},{"location":"Trainer/Checkpointing/","text":"Lightning can automate saving and loading checkpoints. Model saving To enable checkpointing, define the checkpoint callback and give it to the trainer. from pytorch_lightning.utils.pt_callbacks import ModelCheckpoint checkpoint_callback = ModelCheckpoint( filepath='/path/to/store/weights.ckpt', save_best_only=True, verbose=True, monitor='val_loss', mode='min' ) trainer = Trainer(checkpoint_callback=checkpoint_callback)","title":"Checkpointing"},{"location":"Trainer/Checkpointing/#model-saving","text":"To enable checkpointing, define the checkpoint callback and give it to the trainer. from pytorch_lightning.utils.pt_callbacks import ModelCheckpoint checkpoint_callback = ModelCheckpoint( filepath='/path/to/store/weights.ckpt', save_best_only=True, verbose=True, monitor='val_loss', mode='min' ) trainer = Trainer(checkpoint_callback=checkpoint_callback)","title":"Model saving"},{"location":"Trainer/Distributed training/","text":"Lightning makes multi-gpu training and 16 bit training trivial. Note: None of the flags below require changing anything about your lightningModel definition. Choosing a backend Lightning supports two backends. DataParallel and DistributedDataParallel. Both can be used for single-node multi-GPU training. For multi-node training you must use DistributedDataParallel. You can toggle between each mode by setting this flag. # DEFAULT uses DataParallel trainer = Trainer(distributed_backend='dp') # change to distributed data parallel trainer = Trainer(distributed_backend='ddp') If you request multiple nodes, the back-end will auto-switch to ddp. We recommend you use DistributedDataparallel even for single-node multi-GPU training. It is MUCH faster than DP but may have configuration issues depending on your cluster. For a deeper understanding of what lightning is doing, feel free to read this guide . CUDA flags CUDA flags make certain GPUs visible to your script. Lightning sets these for you automatically, there's NO NEED to do this yourself. # lightning will set according to what you give the trainer # os.environ[\"CUDA_DEVICE_ORDER\"] = \"PCI_BUS_ID\" # os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\" 16-bit mixed precision 16 bit precision can cut your memory footprint by half. If using volta architecture GPUs it can give a dramatic training speed-up as well. First, install apex (if install fails, look here ): $ git clone https://github.com/NVIDIA/apex $ cd apex $ pip install -v --no-cache-dir --global-option=\"--cpp_ext\" --global-option=\"--cuda_ext\" ./ then set this use_amp to True. # DEFAULT trainer = Trainer(amp_level='O2', use_amp=False) Single-gpu Make sure you're on a GPU machine. # DEFAULT trainer = Trainer(gpus=[0]) multi-gpu Make sure you're on a GPU machine. You can set as many GPUs as you want. In this setting, the model will run on all 8 GPUs at once using DataParallel under the hood. # to use DataParallel (default) trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], distributed_backend='dp') # RECOMMENDED use DistributedDataParallel trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], distributed_backend='ddp') Multi-node Multi-node training is easily done by specifying these flags. # train on 12*8 GPUs trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], nb_gpu_nodes=12) In addition, make sure to set up your SLURM job correctly via the SlurmClusterObject . In particular, specify the number of tasks per node correctly. cluster = SlurmCluster( hyperparam_optimizer=test_tube.HyperOptArgumentParser(), log_path='/some/path/to/save', ) # OPTIONAL FLAGS WHICH MAY BE CLUSTER DEPENDENT # which interface your nodes use for communication cluster.add_command('export NCCL_SOCKET_IFNAME=^docker0,lo') # see output of the NCCL connection process # NCCL is how the nodes talk to each other cluster.add_command('export NCCL_DEBUG=INFO') # setting a master port here is a good idea. cluster.add_command(f'export MASTER_PORT={PORT}') # good to load the latest NCCL version cluster.load_modules(['NCCL/2.4.7-1-cuda.10.0']) # configure cluster cluster.per_experiment_nb_nodes = 12 cluster.per_experiment_nb_gpus = 8 cluster.add_slurm_cmd(cmd='ntasks-per-node', value=8, comment='1 task per gpu') Finally, make sure to add a distributed sampler to your dataset. The distributed sampler copies a portion of your dataset onto each GPU. (World_size = gpus_per_node * nb_nodes). # ie: this: dataset = myDataset() dataloader = Dataloader(dataset) # becomes: dataset = myDataset() dist_sampler = torch.utils.data.distributed.DistributedSampler(dataset) dataloader = Dataloader(dataset, sampler=dist_sampler) Self-balancing architecture Here lightning distributes parts of your module across available GPUs to optimize for speed and memory. COMING SOON.","title":"Distributed training"},{"location":"Trainer/Distributed training/#choosing-a-backend","text":"Lightning supports two backends. DataParallel and DistributedDataParallel. Both can be used for single-node multi-GPU training. For multi-node training you must use DistributedDataParallel. You can toggle between each mode by setting this flag. # DEFAULT uses DataParallel trainer = Trainer(distributed_backend='dp') # change to distributed data parallel trainer = Trainer(distributed_backend='ddp') If you request multiple nodes, the back-end will auto-switch to ddp. We recommend you use DistributedDataparallel even for single-node multi-GPU training. It is MUCH faster than DP but may have configuration issues depending on your cluster. For a deeper understanding of what lightning is doing, feel free to read this guide .","title":"Choosing a backend"},{"location":"Trainer/Distributed training/#cuda-flags","text":"CUDA flags make certain GPUs visible to your script. Lightning sets these for you automatically, there's NO NEED to do this yourself. # lightning will set according to what you give the trainer # os.environ[\"CUDA_DEVICE_ORDER\"] = \"PCI_BUS_ID\" # os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"","title":"CUDA flags"},{"location":"Trainer/Distributed training/#16-bit-mixed-precision","text":"16 bit precision can cut your memory footprint by half. If using volta architecture GPUs it can give a dramatic training speed-up as well. First, install apex (if install fails, look here ): $ git clone https://github.com/NVIDIA/apex $ cd apex $ pip install -v --no-cache-dir --global-option=\"--cpp_ext\" --global-option=\"--cuda_ext\" ./ then set this use_amp to True. # DEFAULT trainer = Trainer(amp_level='O2', use_amp=False)","title":"16-bit mixed precision"},{"location":"Trainer/Distributed training/#single-gpu","text":"Make sure you're on a GPU machine. # DEFAULT trainer = Trainer(gpus=[0])","title":"Single-gpu"},{"location":"Trainer/Distributed training/#multi-gpu","text":"Make sure you're on a GPU machine. You can set as many GPUs as you want. In this setting, the model will run on all 8 GPUs at once using DataParallel under the hood. # to use DataParallel (default) trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], distributed_backend='dp') # RECOMMENDED use DistributedDataParallel trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], distributed_backend='ddp')","title":"multi-gpu"},{"location":"Trainer/Distributed training/#multi-node","text":"Multi-node training is easily done by specifying these flags. # train on 12*8 GPUs trainer = Trainer(gpus=[0,1,2,3,4,5,6,7], nb_gpu_nodes=12) In addition, make sure to set up your SLURM job correctly via the SlurmClusterObject . In particular, specify the number of tasks per node correctly. cluster = SlurmCluster( hyperparam_optimizer=test_tube.HyperOptArgumentParser(), log_path='/some/path/to/save', ) # OPTIONAL FLAGS WHICH MAY BE CLUSTER DEPENDENT # which interface your nodes use for communication cluster.add_command('export NCCL_SOCKET_IFNAME=^docker0,lo') # see output of the NCCL connection process # NCCL is how the nodes talk to each other cluster.add_command('export NCCL_DEBUG=INFO') # setting a master port here is a good idea. cluster.add_command(f'export MASTER_PORT={PORT}') # good to load the latest NCCL version cluster.load_modules(['NCCL/2.4.7-1-cuda.10.0']) # configure cluster cluster.per_experiment_nb_nodes = 12 cluster.per_experiment_nb_gpus = 8 cluster.add_slurm_cmd(cmd='ntasks-per-node', value=8, comment='1 task per gpu') Finally, make sure to add a distributed sampler to your dataset. The distributed sampler copies a portion of your dataset onto each GPU. (World_size = gpus_per_node * nb_nodes). # ie: this: dataset = myDataset() dataloader = Dataloader(dataset) # becomes: dataset = myDataset() dist_sampler = torch.utils.data.distributed.DistributedSampler(dataset) dataloader = Dataloader(dataset, sampler=dist_sampler)","title":"Multi-node"},{"location":"Trainer/Distributed training/#self-balancing-architecture","text":"Here lightning distributes parts of your module across available GPUs to optimize for speed and memory. COMING SOON.","title":"Self-balancing architecture"},{"location":"Trainer/Logging/","text":"Lighting offers a few options for logging information about model, gpu usage, etc (via test-tube). It also offers printing options for training monitoring. Display metrics in progress bar # DEFAULT trainer = Trainer(progress_bar=True) Log metric row every k batches Every k batches lightning will make an entry in the metrics log # DEFAULT (ie: save a .csv log file every 10 batches) trainer = Trainer(add_log_row_interval=10) Process position When running multiple models on the same machine we want to decide which progress bar to use. Lightning will stack progress bars according to this value. # DEFAULT trainer = Trainer(process_position=0) # if this is the second model on the node, show the second progress bar below trainer = Trainer(process_position=1) Save a snapshot of all hyperparameters Whenever you call .save() on the test-tube experiment it logs all the hyperparameters in current use. Give lightning a test-tube Experiment object to automate this for you. from test_tube import Experiment exp = Experiment(...) Trainer(experiment=exp) Snapshot code for a training run Whenever you call .save() on the test-tube experiment it snapshows all code and pushes to a git tag. Give lightning a test-tube Experiment object to automate this for you. from test_tube import Experiment exp = Experiment(create_git_tag=True) Trainer(experiment=exp) Tensorboard support The experiment object is a strict subclass of PyTorch SummaryWriter. However, this class also snapshots every detail about the experiment (data folder paths, code, hyperparams), and allows you to visualize it using tensorboard. from test_tube import Experiment, HyperOptArgumentParser # exp hyperparams args = HyperOptArgumentParser() hparams = args.parse_args() # this is a summaryWriter with nicer logging structure exp = Experiment(save_dir='/some/path', create_git_tag=True) # track experiment details (must be ArgumentParser or HyperOptArgumentParser). # each option in the parser is tracked exp.argparse(hparams) exp.tag({'description': 'running demo'}) # trainer uses the exp object to log exp data trainer = Trainer(experiment=exp) trainer.fit(model) # view logs at: # tensorboard --logdir /some/path Write logs file to csv every k batches Every k batches, lightning will write the new logs to disk # DEFAULT (ie: save a .csv log file every 100 batches) trainer = Trainer(log_save_interval=100)","title":"Logging"},{"location":"Trainer/Logging/#display-metrics-in-progress-bar","text":"# DEFAULT trainer = Trainer(progress_bar=True)","title":"Display metrics in progress bar"},{"location":"Trainer/Logging/#log-metric-row-every-k-batches","text":"Every k batches lightning will make an entry in the metrics log # DEFAULT (ie: save a .csv log file every 10 batches) trainer = Trainer(add_log_row_interval=10)","title":"Log metric row every k batches"},{"location":"Trainer/Logging/#process-position","text":"When running multiple models on the same machine we want to decide which progress bar to use. Lightning will stack progress bars according to this value. # DEFAULT trainer = Trainer(process_position=0) # if this is the second model on the node, show the second progress bar below trainer = Trainer(process_position=1)","title":"Process position"},{"location":"Trainer/Logging/#save-a-snapshot-of-all-hyperparameters","text":"Whenever you call .save() on the test-tube experiment it logs all the hyperparameters in current use. Give lightning a test-tube Experiment object to automate this for you. from test_tube import Experiment exp = Experiment(...) Trainer(experiment=exp)","title":"Save a snapshot of all hyperparameters"},{"location":"Trainer/Logging/#snapshot-code-for-a-training-run","text":"Whenever you call .save() on the test-tube experiment it snapshows all code and pushes to a git tag. Give lightning a test-tube Experiment object to automate this for you. from test_tube import Experiment exp = Experiment(create_git_tag=True) Trainer(experiment=exp)","title":"Snapshot code for a training run"},{"location":"Trainer/Logging/#tensorboard-support","text":"The experiment object is a strict subclass of PyTorch SummaryWriter. However, this class also snapshots every detail about the experiment (data folder paths, code, hyperparams), and allows you to visualize it using tensorboard. from test_tube import Experiment, HyperOptArgumentParser # exp hyperparams args = HyperOptArgumentParser() hparams = args.parse_args() # this is a summaryWriter with nicer logging structure exp = Experiment(save_dir='/some/path', create_git_tag=True) # track experiment details (must be ArgumentParser or HyperOptArgumentParser). # each option in the parser is tracked exp.argparse(hparams) exp.tag({'description': 'running demo'}) # trainer uses the exp object to log exp data trainer = Trainer(experiment=exp) trainer.fit(model) # view logs at: # tensorboard --logdir /some/path","title":"Tensorboard support"},{"location":"Trainer/Logging/#write-logs-file-to-csv-every-k-batches","text":"Every k batches, lightning will write the new logs to disk # DEFAULT (ie: save a .csv log file every 100 batches) trainer = Trainer(log_save_interval=100)","title":"Write logs file to csv every k batches"},{"location":"Trainer/SLURM Managed Cluster/","text":"Lightning supports model training on a cluster managed by SLURM in the following cases: Training on single or multi-cpus only. Training on single or multi-gpus on the same node. Coming SOON: Training across multiple nodes. Running grid search on a cluster To use lightning to run a hyperparameter search (grid-search or random-search) on a cluster do 4 things: (1). Define the parameters for the grid search from test_tube import HyperOptArgumentParser # subclass of argparse parser = HyperOptArgumentParser(strategy='random_search') parser.add_argument('--learning_rate', default=0.002, type=float, help='the learning rate') # let's enable optimizing over the number of layers in the network parser.opt_list('--nb_layers', default=2, type=int, tunable=True, options=[2, 4, 8]) hparams = parser.parse_args() (2). Define the cluster options in the SlurmCluster object (over 5 nodes and 8 gpus) from test_tube.hpc import SlurmCluster # hyperparameters is a test-tube hyper params object # see https://williamfalcon.github.io/test-tube/hyperparameter_optimization/HyperOptArgumentParser/ hyperparams = args.parse() # init cluster cluster = SlurmCluster( hyperparam_optimizer=hyperparams, log_path='/path/to/log/results/to', python_cmd='python3' ) # let the cluster know where to email for a change in job status (ie: complete, fail, etc...) cluster.notify_job_status(email='some@email.com', on_done=True, on_fail=True) # set the job options. In this instance, we'll run 20 different models # each with its own set of hyperparameters giving each one 1 GPU (ie: taking up 20 GPUs) cluster.per_experiment_nb_gpus = 8 cluster.per_experiment_nb_nodes = 5 # we'll request 10GB of memory per node cluster.memory_mb_per_node = 10000 # set a walltime of 10 minues cluster.job_time = '10:00' (3). Give trainer the cluster_manager in your main function: from pytorch_lightning import Trainer def train_fx(trial_hparams, cluster_manager, _): # hparams has a specific set of hyperparams my_model = MyLightningModel() # give the trainer the cluster object trainer = Trainer(cluster=cluster_manager) trainer.fit(my_model) (4). Start the grid search # run the models on the cluster cluster.optimize_parallel_cluster_gpu( train_fx, nb_trials=20, job_name='my_grid_search_exp_name', job_display_name='my_exp') That's it! The SlurmCluster object will automatically checkpoint the lightning model and resubmit if it runs into the walltime! Walltime auto-resubmit Lightning automatically resubmits jobs when they reach the walltime. You get this behavior for free if you give lightning a slurm cluster object. def my_main_fx(hparams, slurm_manager, _): trainer = Trainer(cluster=slurm_manager) (See the grid search example above for cluster configuration). With this feature lightning will: automatically checkpoint the model checkpoint the trainer session resubmit a continuation job. load the checkpoint and trainer session in the new model","title":"SLURM Managed Cluster"},{"location":"Trainer/SLURM Managed Cluster/#running-grid-search-on-a-cluster","text":"To use lightning to run a hyperparameter search (grid-search or random-search) on a cluster do 4 things: (1). Define the parameters for the grid search from test_tube import HyperOptArgumentParser # subclass of argparse parser = HyperOptArgumentParser(strategy='random_search') parser.add_argument('--learning_rate', default=0.002, type=float, help='the learning rate') # let's enable optimizing over the number of layers in the network parser.opt_list('--nb_layers', default=2, type=int, tunable=True, options=[2, 4, 8]) hparams = parser.parse_args() (2). Define the cluster options in the SlurmCluster object (over 5 nodes and 8 gpus) from test_tube.hpc import SlurmCluster # hyperparameters is a test-tube hyper params object # see https://williamfalcon.github.io/test-tube/hyperparameter_optimization/HyperOptArgumentParser/ hyperparams = args.parse() # init cluster cluster = SlurmCluster( hyperparam_optimizer=hyperparams, log_path='/path/to/log/results/to', python_cmd='python3' ) # let the cluster know where to email for a change in job status (ie: complete, fail, etc...) cluster.notify_job_status(email='some@email.com', on_done=True, on_fail=True) # set the job options. In this instance, we'll run 20 different models # each with its own set of hyperparameters giving each one 1 GPU (ie: taking up 20 GPUs) cluster.per_experiment_nb_gpus = 8 cluster.per_experiment_nb_nodes = 5 # we'll request 10GB of memory per node cluster.memory_mb_per_node = 10000 # set a walltime of 10 minues cluster.job_time = '10:00' (3). Give trainer the cluster_manager in your main function: from pytorch_lightning import Trainer def train_fx(trial_hparams, cluster_manager, _): # hparams has a specific set of hyperparams my_model = MyLightningModel() # give the trainer the cluster object trainer = Trainer(cluster=cluster_manager) trainer.fit(my_model) (4). Start the grid search # run the models on the cluster cluster.optimize_parallel_cluster_gpu( train_fx, nb_trials=20, job_name='my_grid_search_exp_name', job_display_name='my_exp') That's it! The SlurmCluster object will automatically checkpoint the lightning model and resubmit if it runs into the walltime!","title":"Running grid search on a cluster"},{"location":"Trainer/SLURM Managed Cluster/#walltime-auto-resubmit","text":"Lightning automatically resubmits jobs when they reach the walltime. You get this behavior for free if you give lightning a slurm cluster object. def my_main_fx(hparams, slurm_manager, _): trainer = Trainer(cluster=slurm_manager) (See the grid search example above for cluster configuration). With this feature lightning will: automatically checkpoint the model checkpoint the trainer session resubmit a continuation job. load the checkpoint and trainer session in the new model","title":"Walltime auto-resubmit"},{"location":"Trainer/Training Loop/","text":"The lightning training loop handles everything except the actual computations of your model. To decide what will happen in your training loop, define the training_step function . Below are all the things lightning automates for you in the training loop. Accumulated gradients 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. # DEFAULT (ie: no accumulated grads) trainer = Trainer(accumulate_grad_batches=1) Force training for min or max epochs It can be useful to force training for a minimum number of epochs or limit to a max number # DEFAULT trainer = Trainer(min_nb_epochs=1, max_nb_epochs=1000) Force disable early stop Use this to turn off early stopping and run training to the max_epoch # DEFAULT trainer = Trainer(enable_early_stop=True) Gradient Clipping Use this to turn off early stopping and run training to the max_epoch # DEFAULT (ie: don't clip) trainer = Trainer(gradient_clip=0) Inspect gradient norms Looking at grad norms can help you figure out where training might be going wrong. # DEFAULT (-1 doesn't track norms) trainer = Trainer(track_grad_norm=-1) # track the LP norm (P=2 here) trainer = Trainer(track_grad_norm=2) Set how much of the training set to check If you don't want to check 100% of the training set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(train_percent_check=1.0) # check 10% only trainer = Trainer(train_percent_check=0.1)","title":"Training Loop"},{"location":"Trainer/Training Loop/#accumulated-gradients","text":"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. # DEFAULT (ie: no accumulated grads) trainer = Trainer(accumulate_grad_batches=1)","title":"Accumulated gradients"},{"location":"Trainer/Training Loop/#force-training-for-min-or-max-epochs","text":"It can be useful to force training for a minimum number of epochs or limit to a max number # DEFAULT trainer = Trainer(min_nb_epochs=1, max_nb_epochs=1000)","title":"Force training for min or max epochs"},{"location":"Trainer/Training Loop/#force-disable-early-stop","text":"Use this to turn off early stopping and run training to the max_epoch # DEFAULT trainer = Trainer(enable_early_stop=True)","title":"Force disable early stop"},{"location":"Trainer/Training Loop/#gradient-clipping","text":"Use this to turn off early stopping and run training to the max_epoch # DEFAULT (ie: don't clip) trainer = Trainer(gradient_clip=0)","title":"Gradient Clipping"},{"location":"Trainer/Training Loop/#inspect-gradient-norms","text":"Looking at grad norms can help you figure out where training might be going wrong. # DEFAULT (-1 doesn't track norms) trainer = Trainer(track_grad_norm=-1) # track the LP norm (P=2 here) trainer = Trainer(track_grad_norm=2)","title":"Inspect gradient norms"},{"location":"Trainer/Training Loop/#set-how-much-of-the-training-set-to-check","text":"If you don't want to check 100% of the training set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(train_percent_check=1.0) # check 10% only trainer = Trainer(train_percent_check=0.1)","title":"Set how much of the training set to check"},{"location":"Trainer/Validation loop/","text":"The lightning validation loop handles everything except the actual computations of your model. To decide what will happen in your validation loop, define the validation_step function . Below are all the things lightning automates for you in the validation loop. Note Lightning will run 5 steps of validation in the beginning of training as a sanity check so you don't have to wait until a full epoch to catch possible validation issues. Check validation every n epochs If you have a small dataset you might want to check validation every n epochs # DEFAULT trainer = Trainer(check_val_every_n_epoch=1) Set how much of the validation set to check If you don't want to check 100% of the validation set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(val_percent_check=1.0) # check 10% only trainer = Trainer(val_percent_check=0.1) Set how much of the test set to check If you don't want to check 100% of the test set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(test_percent_check=1.0) # check 10% only trainer = Trainer(test_percent_check=0.1) Set validation check frequency within 1 training epoch For large datasets it's often desirable to check validation multiple times within a training loop # DEFAULT trainer = Trainer(val_check_interval=0.95) # check every .25 of an epoch trainer = Trainer(val_check_interval=0.25) Set the number of validation sanity steps Lightning runs a few steps of validation in the beginning of training. This avoids crashing in the validation loop sometime deep into a lengthy training loop. # DEFAULT trainer = Trainer(nb_sanity_val_steps=5)","title":"Validation loop"},{"location":"Trainer/Validation loop/#check-validation-every-n-epochs","text":"If you have a small dataset you might want to check validation every n epochs # DEFAULT trainer = Trainer(check_val_every_n_epoch=1)","title":"Check validation every n epochs"},{"location":"Trainer/Validation loop/#set-how-much-of-the-validation-set-to-check","text":"If you don't want to check 100% of the validation set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(val_percent_check=1.0) # check 10% only trainer = Trainer(val_percent_check=0.1)","title":"Set how much of the validation set to check"},{"location":"Trainer/Validation loop/#set-how-much-of-the-test-set-to-check","text":"If you don't want to check 100% of the test set (for debugging or if it's huge), set this flag # DEFAULT trainer = Trainer(test_percent_check=1.0) # check 10% only trainer = Trainer(test_percent_check=0.1)","title":"Set how much of the test set to check"},{"location":"Trainer/Validation loop/#set-validation-check-frequency-within-1-training-epoch","text":"For large datasets it's often desirable to check validation multiple times within a training loop # DEFAULT trainer = Trainer(val_check_interval=0.95) # check every .25 of an epoch trainer = Trainer(val_check_interval=0.25)","title":"Set validation check frequency within 1 training epoch"},{"location":"Trainer/Validation loop/#set-the-number-of-validation-sanity-steps","text":"Lightning runs a few steps of validation in the beginning of training. This avoids crashing in the validation loop sometime deep into a lengthy training loop. # DEFAULT trainer = Trainer(nb_sanity_val_steps=5)","title":"Set the number of validation sanity steps"},{"location":"Trainer/debugging/","text":"These flags are useful to help debug a model. Fast dev run This flag is meant for debugging a full train/val/test loop. It'll activate callbacks, everything but only with 1 training and 1 validation batch. Use this to debug a full run of your program quickly # DEFAULT trainer = Trainer(fast_dev_run=False) Inspect gradient norms Looking at grad norms can help you figure out where training might be going wrong. # DEFAULT (-1 doesn't track norms) trainer = Trainer(track_grad_norm=-1) # track the LP norm (P=2 here) trainer = Trainer(track_grad_norm=2) Make model overfit on subset of data A useful debugging trick is to make your model overfit a tiny fraction of the data. # DEFAULT don't overfit (ie: normal training) trainer = Trainer(overfit_pct=0.0) # overfit on 1% of data trainer = Trainer(overfit_pct=0.01) Print the parameter count by layer By default lightning prints a list of parameters and submodules when it starts training. Print which gradients are nan This option prints a list of tensors with nan gradients. # DEFAULT trainer = Trainer(print_nan_grads=False) Log GPU usage Lightning automatically logs gpu usage to the test tube logs. It'll only do it at the metric logging interval, so it doesn't slow down training.","title":"Debugging"},{"location":"Trainer/debugging/#fast-dev-run","text":"This flag is meant for debugging a full train/val/test loop. It'll activate callbacks, everything but only with 1 training and 1 validation batch. Use this to debug a full run of your program quickly # DEFAULT trainer = Trainer(fast_dev_run=False)","title":"Fast dev run"},{"location":"Trainer/debugging/#inspect-gradient-norms","text":"Looking at grad norms can help you figure out where training might be going wrong. # DEFAULT (-1 doesn't track norms) trainer = Trainer(track_grad_norm=-1) # track the LP norm (P=2 here) trainer = Trainer(track_grad_norm=2)","title":"Inspect gradient norms"},{"location":"Trainer/debugging/#make-model-overfit-on-subset-of-data","text":"A useful debugging trick is to make your model overfit a tiny fraction of the data. # DEFAULT don't overfit (ie: normal training) trainer = Trainer(overfit_pct=0.0) # overfit on 1% of data trainer = Trainer(overfit_pct=0.01)","title":"Make model overfit on subset of data"},{"location":"Trainer/debugging/#print-the-parameter-count-by-layer","text":"By default lightning prints a list of parameters and submodules when it starts training.","title":"Print the parameter count by layer"},{"location":"Trainer/debugging/#print-which-gradients-are-nan","text":"This option prints a list of tensors with nan gradients. # DEFAULT trainer = Trainer(print_nan_grads=False)","title":"Print which gradients are nan"},{"location":"Trainer/debugging/#log-gpu-usage","text":"Lightning automatically logs gpu usage to the test tube logs. It'll only do it at the metric logging interval, so it doesn't slow down training.","title":"Log GPU usage"},{"location":"Trainer/hooks/","text":"Hooks [ Github Code ] There are cases when you might want to do something different at different parts of the training/validation loop. To enable a hook, simply override the method in your LightningModule and the trainer will call it at the correct time. Contributing If there's a hook you'd like to add, simply: 1. Fork PyTorchLightning. 2. Add the hook here . 3. Add the correct place in the Trainer where it should be called. on_epoch_start Called in the training loop at the very beginning of the epoch. def on_epoch_start(self): # do something when the epoch starts on_batch_end Called in the training loop at the very end of the epoch. def on_epoch_end(self): # do something when the epoch ends on_batch_start Called in the training loop before anything happens for that batch. def on_batch_start(self): # do something when the batch starts on_pre_performance_check Called at the very beginning of the validation loop. def on_pre_performance_check(self): # do something before validation starts on_post_performance_check Called at the very end of the validation loop. def on_post_performance_check(self): # do something before validation end on_tng_metrics Called in the training loop, right before metrics are logged. Although you can log at any time by using self.experiment, you can use this callback to modify what will be logged. def on_tng_metrics(self, metrics): # do something before validation end on_before_zero_grad Called in the training loop after taking an optimizer step and before zeroing grads. Good place to inspect weight information with weights updated. Called once per optimizer def on_before_zero_grad(self, optimizer): # do something with the optimizer or inspect it. on_after_backward Called in the training loop after model.backward() This is the ideal place to inspect or log gradient information def on_after_backward(self): # example to inspect gradient information in tensorboard if self.trainer.global_step % 25 == 0: # don't make the tf file huge params = self.state_dict() for k, v in params.items(): grads = v name = k self.experiment.add_histogram(tag=name, values=grads, global_step=self.trainer.global_step)","title":"Hooks"},{"location":"Trainer/hooks/#hooks","text":"[ Github Code ] There are cases when you might want to do something different at different parts of the training/validation loop. To enable a hook, simply override the method in your LightningModule and the trainer will call it at the correct time. Contributing If there's a hook you'd like to add, simply: 1. Fork PyTorchLightning. 2. Add the hook here . 3. Add the correct place in the Trainer where it should be called.","title":"Hooks"},{"location":"Trainer/hooks/#on_epoch_start","text":"Called in the training loop at the very beginning of the epoch. def on_epoch_start(self): # do something when the epoch starts","title":"on_epoch_start"},{"location":"Trainer/hooks/#on_batch_end","text":"Called in the training loop at the very end of the epoch. def on_epoch_end(self): # do something when the epoch ends","title":"on_batch_end"},{"location":"Trainer/hooks/#on_batch_start","text":"Called in the training loop before anything happens for that batch. def on_batch_start(self): # do something when the batch starts","title":"on_batch_start"},{"location":"Trainer/hooks/#on_pre_performance_check","text":"Called at the very beginning of the validation loop. def on_pre_performance_check(self): # do something before validation starts","title":"on_pre_performance_check"},{"location":"Trainer/hooks/#on_post_performance_check","text":"Called at the very end of the validation loop. def on_post_performance_check(self): # do something before validation end","title":"on_post_performance_check"},{"location":"Trainer/hooks/#on_tng_metrics","text":"Called in the training loop, right before metrics are logged. Although you can log at any time by using self.experiment, you can use this callback to modify what will be logged. def on_tng_metrics(self, metrics): # do something before validation end","title":"on_tng_metrics"},{"location":"Trainer/hooks/#on_before_zero_grad","text":"Called in the training loop after taking an optimizer step and before zeroing grads. Good place to inspect weight information with weights updated. Called once per optimizer def on_before_zero_grad(self, optimizer): # do something with the optimizer or inspect it.","title":"on_before_zero_grad"},{"location":"Trainer/hooks/#on_after_backward","text":"Called in the training loop after model.backward() This is the ideal place to inspect or log gradient information def on_after_backward(self): # example to inspect gradient information in tensorboard if self.trainer.global_step % 25 == 0: # don't make the tf file huge params = self.state_dict() for k, v in params.items(): grads = v name = k self.experiment.add_histogram(tag=name, values=grads, global_step=self.trainer.global_step)","title":"on_after_backward"},{"location":"examples/Examples/","text":"Template model definition In 99% of cases you want to just copy this template to start a new lightningModule and change the core of what your model is actually trying to do. # get a copy of the module template wget https://github.com/williamFalcon/pytorch-lightning/blob/master/examples/new_project_templates/lightning_module_template.py Trainer Example __main__ function Normally, we want to let the __main__ function start the training. Inside the main we parse training arguments with whatever hyperparameters we want. Your LightningModule will have a chance to add hyperparameters. from test_tube import HyperOptArgumentParser if __name__ == '__main__': # use default args given by lightning root_dir = os.path.split(os.path.dirname(sys.modules['__main__'].__file__))[0] parent_parser = HyperOptArgumentParser(strategy='random_search', add_help=False) add_default_args(parent_parser, root_dir) # allow model to overwrite or extend args parser = ExampleModel.add_model_specific_args(parent_parser) hyperparams = parser.parse_args() # train model main(hyperparams) Main Function The main function is your entry into the program. This is where you init your model, checkpoint directory, and launch the training. The main function should have 3 arguments: - hparams: a configuration of hyperparameters. - slurm_manager: Slurm cluster manager object (can be None) - dict: for you to return any values you want (useful in meta-learning, otherwise set to _) def main(hparams, cluster, results_dict): \"\"\" Main training routine specific for this project :param hparams: :return: \"\"\" # init experiment log_dir = os.path.dirname(os.path.realpath(__file__)) exp = Experiment( name='test_tube_exp', debug=True, save_dir=log_dir, version=0, autosave=False, description='test demo' ) # set the hparams for the experiment exp.argparse(hparams) exp.save() # build model model = MyLightningModule(hparams) # callbacks early_stop = EarlyStopping( monitor=hparams.early_stop_metric, patience=hparams.early_stop_patience, verbose=True, mode=hparams.early_stop_mode ) model_save_path = '{}/{}/{}'.format(hparams.model_save_path, exp.name, exp.version) checkpoint = ModelCheckpoint( filepath=model_save_path, save_function=None, save_best_only=True, verbose=True, monitor=hparams.model_save_monitor_value, mode=hparams.model_save_monitor_mode ) # configure trainer trainer = Trainer( experiment=exp, cluster=cluster, checkpoint_callback=checkpoint, early_stop_callback=early_stop, ) # train model trainer.fit(model) The main function will start training on your main function. If you use the HyperParameterOptimizer in hyper parameter optimization mode, this main function will get one set of hyperparameters. If you use it as a simple argument parser you get the default arguments in the argument parser. So, calling main(hyperparams) runs the model with the default argparse arguments. main(hyperparams) CPU hyperparameter search # run a grid search over 20 hyperparameter combinations. hyperparams.optimize_parallel_cpu( main_local, nb_trials=20, nb_workers=1 ) Hyperparameter search on a single or multiple GPUs # run a grid search over 20 hyperparameter combinations. hyperparams.optimize_parallel_gpu( main_local, nb_trials=20, nb_workers=1, gpus=[0,1,2,3] ) Hyperparameter search on a SLURM HPC cluster def optimize_on_cluster(hyperparams): # enable cluster training cluster = SlurmCluster( hyperparam_optimizer=hyperparams, log_path=hyperparams.tt_save_path, test_tube_exp_name=hyperparams.tt_name ) # email for cluster coms cluster.notify_job_status(email='add_email_here', on_done=True, on_fail=True) # configure cluster cluster.per_experiment_nb_gpus = hyperparams.per_experiment_nb_gpus cluster.job_time = '48:00:00' cluster.gpu_type = '1080ti' cluster.memory_mb_per_node = 48000 # any modules for code to run in env cluster.add_command('source activate pytorch_lightning') # name of exp job_display_name = hyperparams.tt_name.split('_')[0] job_display_name = job_display_name[0:3] # run hopt print('submitting jobs...') cluster.optimize_parallel_cluster_gpu( main, nb_trials=hyperparams.nb_hopt_trials, job_name=job_display_name ) # run cluster hyperparameter search optimize_on_cluster(hyperparams)","title":"Examples"},{"location":"examples/Examples/#template-model-definition","text":"In 99% of cases you want to just copy this template to start a new lightningModule and change the core of what your model is actually trying to do. # get a copy of the module template wget https://github.com/williamFalcon/pytorch-lightning/blob/master/examples/new_project_templates/lightning_module_template.py","title":"Template model definition"},{"location":"examples/Examples/#trainer-example","text":"__main__ function Normally, we want to let the __main__ function start the training. Inside the main we parse training arguments with whatever hyperparameters we want. Your LightningModule will have a chance to add hyperparameters. from test_tube import HyperOptArgumentParser if __name__ == '__main__': # use default args given by lightning root_dir = os.path.split(os.path.dirname(sys.modules['__main__'].__file__))[0] parent_parser = HyperOptArgumentParser(strategy='random_search', add_help=False) add_default_args(parent_parser, root_dir) # allow model to overwrite or extend args parser = ExampleModel.add_model_specific_args(parent_parser) hyperparams = parser.parse_args() # train model main(hyperparams) Main Function The main function is your entry into the program. This is where you init your model, checkpoint directory, and launch the training. The main function should have 3 arguments: - hparams: a configuration of hyperparameters. - slurm_manager: Slurm cluster manager object (can be None) - dict: for you to return any values you want (useful in meta-learning, otherwise set to _) def main(hparams, cluster, results_dict): \"\"\" Main training routine specific for this project :param hparams: :return: \"\"\" # init experiment log_dir = os.path.dirname(os.path.realpath(__file__)) exp = Experiment( name='test_tube_exp', debug=True, save_dir=log_dir, version=0, autosave=False, description='test demo' ) # set the hparams for the experiment exp.argparse(hparams) exp.save() # build model model = MyLightningModule(hparams) # callbacks early_stop = EarlyStopping( monitor=hparams.early_stop_metric, patience=hparams.early_stop_patience, verbose=True, mode=hparams.early_stop_mode ) model_save_path = '{}/{}/{}'.format(hparams.model_save_path, exp.name, exp.version) checkpoint = ModelCheckpoint( filepath=model_save_path, save_function=None, save_best_only=True, verbose=True, monitor=hparams.model_save_monitor_value, mode=hparams.model_save_monitor_mode ) # configure trainer trainer = Trainer( experiment=exp, cluster=cluster, checkpoint_callback=checkpoint, early_stop_callback=early_stop, ) # train model trainer.fit(model) The main function will start training on your main function. If you use the HyperParameterOptimizer in hyper parameter optimization mode, this main function will get one set of hyperparameters. If you use it as a simple argument parser you get the default arguments in the argument parser. So, calling main(hyperparams) runs the model with the default argparse arguments. main(hyperparams)","title":"Trainer Example"},{"location":"examples/Examples/#cpu-hyperparameter-search","text":"# run a grid search over 20 hyperparameter combinations. hyperparams.optimize_parallel_cpu( main_local, nb_trials=20, nb_workers=1 )","title":"CPU hyperparameter search"},{"location":"examples/Examples/#hyperparameter-search-on-a-single-or-multiple-gpus","text":"# run a grid search over 20 hyperparameter combinations. hyperparams.optimize_parallel_gpu( main_local, nb_trials=20, nb_workers=1, gpus=[0,1,2,3] )","title":"Hyperparameter search on a single or multiple GPUs"},{"location":"examples/Examples/#hyperparameter-search-on-a-slurm-hpc-cluster","text":"def optimize_on_cluster(hyperparams): # enable cluster training cluster = SlurmCluster( hyperparam_optimizer=hyperparams, log_path=hyperparams.tt_save_path, test_tube_exp_name=hyperparams.tt_name ) # email for cluster coms cluster.notify_job_status(email='add_email_here', on_done=True, on_fail=True) # configure cluster cluster.per_experiment_nb_gpus = hyperparams.per_experiment_nb_gpus cluster.job_time = '48:00:00' cluster.gpu_type = '1080ti' cluster.memory_mb_per_node = 48000 # any modules for code to run in env cluster.add_command('source activate pytorch_lightning') # name of exp job_display_name = hyperparams.tt_name.split('_')[0] job_display_name = job_display_name[0:3] # run hopt print('submitting jobs...') cluster.optimize_parallel_cluster_gpu( main, nb_trials=hyperparams.nb_hopt_trials, job_name=job_display_name ) # run cluster hyperparameter search optimize_on_cluster(hyperparams)","title":"Hyperparameter search on a SLURM HPC cluster"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index b5243977..d7e9daf1 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,72 +2,72 @@ None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily None - 2019-08-01 + 2019-08-05 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 0d715d1266507fd6c7f8635c417eef3651b2df29..776e35cacd13aa863acc590ec97753f058c9fa84 100644 GIT binary patch literal 205 zcmV;;05bm{iwFqEyhmLE|8r?{Wo=<_E_iKh0PU4Q4#FT1MfaY9urE*(lh#nWbLmPC zKq$5(EmQ`r-d<{}@d_r)X8!#7nYSEXKZYLNwFl#Dg>%9%(pI^~*tWvw(;+KxEjIk- zd(Z*Ju!RbDA&h%Ur)eT!f*#}u#QBzj>f!)&H7O${78?|6KCmdnd#A+FSkZ&vry<4lYj}BfC-p@e+GQF_-n)qd={wv Hn+5;?VDn*x literal 204 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
      T=F-zBFN5!iv4^TXy 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 X${h6Xk-Oj4@V7Pme{2mvcY6OHDUPqr literal 0 HcmV?d00001