Skip to content

Commit

Permalink
Merge branch 'master' into awaelchli-patch-1
Browse files Browse the repository at this point in the history
  • Loading branch information
awaelchli committed Jul 31, 2024
2 parents a4dd3c6 + f0c243b commit 9e2a513
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 6 deletions.
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,14 @@ ______________________________________________________________________
### Examples
Explore various types of training possible with PyTorch Lightning. Pretrain and finetune ANY kind of model to perform ANY task like classification, segmentation, summarization and more:

| Task | Description | Run |
|-------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------|---|
| [Hello world](#hello-simple-model) | Pretrain - Hello world example | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/pytorch-lightning-hello-world"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [Image segmentation](https://lightning.ai/lightning-ai/studios/image-segmentation-with-pytorch-lightning) | Finetune - ResNet-50 model to segment images | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/image-segmentation-with-pytorch-lightning"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [Text classification](https://lightning.ai/lightning-ai/studios/text-classification-with-pytorch-lightning) | Finetune - text classifier (BERT model) | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/text-classification-with-pytorch-lightning"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| Task | Description | Run |
|-------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------|---|
| [Hello world](#hello-simple-model) | Pretrain - Hello world example | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/pytorch-lightning-hello-world"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [Image classification](https://lightning.ai/lightning-ai/studios/image-classification-with-pytorch-lightning) | Finetune - ResNet-34 model to classify images of cars | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/image-classification-with-pytorch-lightning"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [Image segmentation](https://lightning.ai/lightning-ai/studios/image-segmentation-with-pytorch-lightning) | Finetune - ResNet-50 model to segment images | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/image-segmentation-with-pytorch-lightning"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [Text classification](https://lightning.ai/lightning-ai/studios/text-classification-with-pytorch-lightning) | Finetune - text classifier (BERT model) | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/text-classification-with-pytorch-lightning"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [Text summarization](https://lightning.ai/lightning-ai/studios/text-summarization-with-pytorch-lightning) | Finetune - text summarization (Hugging Face transformer model) | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/text-summarization-with-pytorch-lightning"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [Audio generation](https://lightning.ai/lightning-ai/studios/finetune-a-personal-ai-music-generator) | Finetune - audio generator (transformer model) | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/finetune-a-personal-ai-music-generator"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [Audio generation](https://lightning.ai/lightning-ai/studios/finetune-a-personal-ai-music-generator) | Finetune - audio generator (transformer model) | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/finetune-a-personal-ai-music-generator"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |
| [LLM finetuning](https://lightning.ai/lightning-ai/studios/finetune-an-llm-with-pytorch-lightning) | Finetune - LLM (Meta Llama 3.1 8B) | <a target="_blank" href="https://lightning.ai/lightning-ai/studios/finetune-an-llm-with-pytorch-lightning"><img src="https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/app-2/studio-badge.svg" alt="Open In Studio"/></a> |

### Hello simple model
Expand Down
1 change: 1 addition & 0 deletions src/lightning/pytorch/demos/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from lightning.pytorch.demos.lstm import LightningLSTM, SequenceSampler, SimpleLSTM # noqa: F401
from lightning.pytorch.demos.transformer import LightningTransformer, Transformer, WikiText2 # noqa: F401
98 changes: 98 additions & 0 deletions src/lightning/pytorch/demos/lstm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
"""Demo of a simple LSTM language model.
Code is adapted from the PyTorch examples at
https://github.com/pytorch/examples/blob/main/word_language_model
"""

from typing import Iterator, List, Optional, Sized, Tuple

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch import Tensor
from torch.optim import Optimizer
from torch.utils.data import DataLoader, Sampler

from lightning.pytorch.core import LightningModule
from lightning.pytorch.demos.transformer import WikiText2


class SimpleLSTM(nn.Module):
def __init__(
self, vocab_size: int = 33278, ninp: int = 512, nhid: int = 512, nlayers: int = 4, dropout: float = 0.2
):
super().__init__()
self.vocab_size = vocab_size
self.drop = nn.Dropout(dropout)
self.encoder = nn.Embedding(vocab_size, ninp)
self.rnn = nn.LSTM(ninp, nhid, nlayers, dropout=dropout, batch_first=True)
self.decoder = nn.Linear(nhid, vocab_size)
self.nlayers = nlayers
self.nhid = nhid
self.init_weights()

def init_weights(self) -> None:
nn.init.uniform_(self.encoder.weight, -0.1, 0.1)
nn.init.zeros_(self.decoder.bias)
nn.init.uniform_(self.decoder.weight, -0.1, 0.1)

def forward(self, input: Tensor, hidden: Tuple[Tensor, Tensor]) -> Tuple[Tensor, Tensor]:
emb = self.drop(self.encoder(input))
output, hidden = self.rnn(emb, hidden)
output = self.drop(output)
decoded = self.decoder(output).view(-1, self.vocab_size)
return F.log_softmax(decoded, dim=1), hidden

def init_hidden(self, batch_size: int) -> Tuple[Tensor, Tensor]:
weight = next(self.parameters())
return (
weight.new_zeros(self.nlayers, batch_size, self.nhid),
weight.new_zeros(self.nlayers, batch_size, self.nhid),
)


class SequenceSampler(Sampler[List[int]]):
def __init__(self, dataset: Sized, batch_size: int) -> None:
super().__init__()
self.dataset = dataset
self.batch_size = batch_size
self.chunk_size = len(self.dataset) // self.batch_size

def __iter__(self) -> Iterator[List[int]]:
n = len(self.dataset)
for i in range(self.chunk_size):
yield list(range(i, n - (n % self.batch_size), self.chunk_size))

def __len__(self) -> int:
return self.chunk_size


class LightningLSTM(LightningModule):
def __init__(self, vocab_size: int = 33278):
super().__init__()
self.model = SimpleLSTM(vocab_size=vocab_size)
self.hidden: Optional[Tuple[Tensor, Tensor]] = None

def on_train_epoch_end(self) -> None:
self.hidden = None

def training_step(self, batch: Tuple[Tensor, Tensor], batch_idx: int) -> Tensor:
input, target = batch
if self.hidden is None:
self.hidden = self.model.init_hidden(input.size(0))
self.hidden = (self.hidden[0].detach(), self.hidden[1].detach())
output, self.hidden = self.model(input, self.hidden)
loss = F.nll_loss(output, target.view(-1))
self.log("train_loss", loss, prog_bar=True)
return loss

def prepare_data(self) -> None:
WikiText2(download=True)

def train_dataloader(self) -> DataLoader:
dataset = WikiText2()
return DataLoader(dataset, batch_sampler=SequenceSampler(dataset, batch_size=20))

def configure_optimizers(self) -> Optimizer:
return torch.optim.SGD(self.parameters(), lr=20.0)
11 changes: 11 additions & 0 deletions tests/tests_pytorch/demos/lstm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from lightning.pytorch.demos.lstm import SequenceSampler


def test_sequence_sampler():
dataset = list(range(103))
sampler = SequenceSampler(dataset, batch_size=4)
assert len(sampler) == 25
batches = list(sampler)
assert batches[0] == [0, 25, 50, 75]
assert batches[1] == [1, 26, 51, 76]
assert batches[24] == [24, 49, 74, 99]

0 comments on commit 9e2a513

Please sign in to comment.