Skip to content
Snippets Groups Projects
Commit ae4ee4d8 authored by William Falcon's avatar William Falcon
Browse files

updated seed

parent 965ab2ed
Branches
No related tags found
No related merge requests found
...@@ -120,3 +120,8 @@ venv.bak/ ...@@ -120,3 +120,8 @@ venv.bak/
# IDEs # IDEs
.idea .idea
# seed project
lightning_logs/
MNIST
.DS_Store
...@@ -47,19 +47,20 @@ pip install -r requirements.txt ...@@ -47,19 +47,20 @@ pip install -r requirements.txt
Next, navigate to [Your Main Contribution (MNIST here)] and run it. Next, navigate to [Your Main Contribution (MNIST here)] and run it.
```bash ```bash
# module folder # module folder
cd research_seed/mnist/ cd src/
# run module (example: mnist as your main contribution) # run module (example: mnist as your main contribution)
python mnist_trainer.py python simplest_mnist.py
``` ```
## Main Contribution ## Main Contribution
List your modules here. Each module contains all code for a full system including how to run instructions. List your modules here. Each module contains all code for a full system including how to run instructions.
- [MNIST](https://github.com/williamFalcon/pytorch-lightning-conference-seed/tree/master/research_seed/mnist) - [Production MNIST](https://github.com/PyTorchLightning/pytorch-lightning-conference-seed/tree/master/src/produtcion_mnist)
- [Research MNIST](https://github.com/PyTorchLightning/pytorch-lightning-conference-seed/tree/master/src/research_mnist)
## Baselines ## Baselines
List your baselines here. List your baselines here.
- [MNIST_baseline](https://github.com/williamFalcon/pytorch-lightning-conference-seed/tree/master/research_seed/baselines/mnist_baseline) - [Research MNIST](https://github.com/PyTorchLightning/pytorch-lightning-conference-seed/tree/master/src/research_mnist)
### Citation ### Citation
``` ```
......
## Baselines
Set up a folder for each baseline. Each baseline needs a trainer and LightningModule
## MNIST Baseline
In this readme, give instructions on how to run your code.
#### CPU
```bash
python mnist_baseline_trainer.py
```
#### Multiple-GPUs
```bash
python mnist_baseline_trainer.py --gpus '0,1,2,3'
```
#### On multiple nodes
```bash
python mnist_baseline_trainer.py --gpus '0,1,2,3' --nodes 4
```
"""
This file defines the core research contribution
"""
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
from argparse import ArgumentParser
import pytorch_lightning as pl
class CoolSystem(pl.LightningModule):
def __init__(self, hparams):
super(CoolSystem, self).__init__()
# not the best model...
self.hparams = hparams
self.l1 = torch.nn.Linear(28 * 28, 10)
def forward(self, x):
return torch.relu(self.l1(x.view(x.size(0), -1)))
def training_step(self, batch, batch_idx):
# REQUIRED
x, y = batch
y_hat = self.forward(x)
return {'loss': F.cross_entropy(y_hat, y)}
def validation_step(self, batch, batch_idx):
# OPTIONAL
x, y = batch
y_hat = self.forward(x)
return {'val_loss': F.cross_entropy(y_hat, y)}
def validation_end(self, outputs):
# OPTIONAL
avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean()
return {'avg_val_loss': avg_loss}
def configure_optimizers(self):
# REQUIRED
# can return multiple optimizers and learning_rate schedulers
return torch.optim.Adam(self.parameters(), lr=self.hparams.learning_rate)
def train_dataloader(self):
# REQUIRED
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=self.hparams.batch_size)
def val_dataloader(self):
# OPTIONAL
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=self.hparams.batch_size)
def test_dataloader(self):
# OPTIONAL
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=self.hparams.batch_size)
@staticmethod
def add_model_specific_args(parent_parser):
"""
Specify the hyperparams for this LightningModule
"""
# MODEL specific
parser = ArgumentParser(parents=[parent_parser])
parser.add_argument('--learning_rate', default=0.02, type=float)
parser.add_argument('--batch_size', default=32, type=int)
# training specific (for this model)
parser.add_argument('--max_nb_epochs', default=2, type=int)
return parser
"""
This file runs the main training/val loop, etc... using Lightning Trainer
"""
from pytorch_lightning import Trainer
from argparse import ArgumentParser
from research_seed.mnist.mnist import CoolSystem
def main(hparams):
# init module
model = CoolSystem(hparams)
# most basic trainer, uses good defaults
trainer = Trainer(
max_nb_epochs=hparams.max_nb_epochs,
gpus=hparams.gpus,
nb_gpu_nodes=hparams.nodes,
)
trainer.fit(model)
if __name__ == '__main__':
parser = ArgumentParser(add_help=False)
parser.add_argument('--gpus', type=str, default=None)
parser.add_argument('--nodes', type=int, default=1)
# give the module a chance to add own params
# good practice to define LightningModule speficic params in the module
parser = CoolSystem.add_model_specific_args(parser)
# parse params
hparams = parser.parse_args()
main(hparams)
...@@ -46,6 +46,19 @@ class CoolSystem(pl.LightningModule): ...@@ -46,6 +46,19 @@ class CoolSystem(pl.LightningModule):
tensorboard_logs = {'avg_val_loss': avg_loss} tensorboard_logs = {'avg_val_loss': avg_loss}
return {'val_loss': avg_loss, 'log': tensorboard_logs} return {'val_loss': avg_loss, 'log': tensorboard_logs}
def test_step(self, batch, batch_idx):
# OPTIONAL
x, y = batch
y_hat = self.forward(x)
return {'test_loss': F.cross_entropy(y_hat, y)}
def test_epoch_end(self, outputs):
# OPTIONAL
avg_loss = torch.stack([x['test_loss'] for x in outputs]).mean()
tensorboard_logs = {'test_val_loss': avg_loss}
return {'test_loss': avg_loss, 'log': tensorboard_logs}
def configure_optimizers(self): def configure_optimizers(self):
# REQUIRED # REQUIRED
# can return multiple optimizers and learning_rate schedulers # can return multiple optimizers and learning_rate schedulers
......
...@@ -3,7 +3,7 @@ This file runs the main training/val loop, etc... using Lightning Trainer ...@@ -3,7 +3,7 @@ This file runs the main training/val loop, etc... using Lightning Trainer
""" """
from pytorch_lightning import Trainer, seed_everything from pytorch_lightning import Trainer, seed_everything
from argparse import ArgumentParser from argparse import ArgumentParser
from srv.mnist.mnist import CoolSystem from src.research_mnist.mnist import CoolSystem
# sets seeds for numpy, torch, etc... # sets seeds for numpy, torch, etc...
# must do for DDP to work well # must do for DDP to work well
...@@ -17,6 +17,8 @@ def main(args): ...@@ -17,6 +17,8 @@ def main(args):
trainer = Trainer.from_argparse_args(args) trainer = Trainer.from_argparse_args(args)
trainer.fit(model) trainer.fit(model)
trainer.test()
if __name__ == '__main__': if __name__ == '__main__':
parser = ArgumentParser(add_help=False) parser = ArgumentParser(add_help=False)
......
...@@ -8,7 +8,6 @@ from torch.utils.data import DataLoader ...@@ -8,7 +8,6 @@ from torch.utils.data import DataLoader
from torchvision.datasets import MNIST from torchvision.datasets import MNIST
import torchvision.transforms as transforms import torchvision.transforms as transforms
from argparse import ArgumentParser from argparse import ArgumentParser
import pytorch_lightning as pl import pytorch_lightning as pl
pl.seed_everything(123) pl.seed_everything(123)
...@@ -18,7 +17,6 @@ class CoolSystem(pl.LightningModule): ...@@ -18,7 +17,6 @@ class CoolSystem(pl.LightningModule):
def __init__(self, hparams): def __init__(self, hparams):
super(CoolSystem, self).__init__() super(CoolSystem, self).__init__()
# not the best model...
self.hparams = hparams self.hparams = hparams
self.l1 = torch.nn.Linear(28 * 28, 10) self.l1 = torch.nn.Linear(28 * 28, 10)
...@@ -26,70 +24,26 @@ class CoolSystem(pl.LightningModule): ...@@ -26,70 +24,26 @@ class CoolSystem(pl.LightningModule):
return torch.relu(self.l1(x.view(x.size(0), -1))) return torch.relu(self.l1(x.view(x.size(0), -1)))
def training_step(self, batch, batch_idx): def training_step(self, batch, batch_idx):
# REQUIRED
x, y = batch x, y = batch
y_hat = self.forward(x) y_hat = self(x)
loss = F.cross_entropy(y_hat, y) loss = F.cross_entropy(y_hat, y)
tensorboard_logs = {'train_loss': loss} tensorboard_logs = {'train_loss': loss}
return {'loss': loss, 'log': tensorboard_logs} return {'loss': loss, 'log': tensorboard_logs}
def validation_step(self, batch, batch_idx):
# OPTIONAL
x, y = batch
y_hat = self.forward(x)
return {'val_loss': F.cross_entropy(y_hat, y)}
def validation_epoch_end(self, outputs):
# OPTIONAL
avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean()
tensorboard_logs = {'avg_val_loss': avg_loss}
return {'val_loss': avg_loss, 'log': tensorboard_logs}
def configure_optimizers(self): def configure_optimizers(self):
# REQUIRED # REQUIRED
# can return multiple optimizers and learning_rate schedulers # can return multiple optimizers and learning_rate schedulers
return torch.optim.Adam(self.parameters(), lr=self.hparams.learning_rate) return torch.optim.Adam(self.parameters(), lr=self.hparams.learning_rate)
def train_dataloader(self):
# REQUIRED
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=self.hparams.batch_size)
def val_dataloader(self):
# OPTIONAL
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=self.hparams.batch_size)
def test_dataloader(self):
# OPTIONAL
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=self.hparams.batch_size)
@staticmethod
def add_model_specific_args(parent_parser):
"""
Specify the hyperparams for this LightningModule
"""
# MODEL specific
parser = ArgumentParser(parents=[parent_parser], add_help=False)
parser.add_argument('--learning_rate', default=0.02, type=float)
parser.add_argument('--batch_size', default=32, type=int)
# training specific (for this model)
parser.add_argument('--max_nb_epochs', default=2, type=int)
return parser
if __name__ == '__main__': if __name__ == '__main__':
train_data = DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32)
parser = ArgumentParser(add_help=False) parser = ArgumentParser(add_help=False)
parser.add_argument('--learning_rate', default=0.02, type=float)
# add args from trainer # add args from trainer
parser = Trainer.add_argparse_args(parser) parser = pl.Trainer.add_argparse_args(parser)
# give the module a chance to add own params
# good practice to define LightningModule speficic params in the module
parser = CoolSystem.add_model_specific_args(parser)
# parse params # parse params
args = parser.parse_args() args = parser.parse_args()
...@@ -99,6 +53,6 @@ if __name__ == '__main__': ...@@ -99,6 +53,6 @@ if __name__ == '__main__':
# most basic trainer, uses good defaults # most basic trainer, uses good defaults
trainer = pl.Trainer.from_argparse_args(args) trainer = pl.Trainer.from_argparse_args(args)
trainer.fit(model) trainer.fit(model, train_data)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment