Pytorch Lightning ์์ํ๊ธฐ
๐ย pytorch์ ๋ํ high-level ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
GPU๋ TPU, 16bit precision, ๋ถ์ฐํ์ต ๋ฑ ๋์ฑ ๋ณต์กํ ์กฐ๊ฑด์์ ์คํํ๊ฒ ๋ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค.
pytorch lightning์ ๋ชฉ์ ์ ์ฝ๋์ ์ถ์ํ๋ฅผ ํตํด ์ข ๋ ์ ๋๋๊ณ ๊ฐ๊ฒฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ์ ์๋ค.
pytorch lightning์ Lightning Model class ๋ด์ DataLoader, Model, optimizer, Training roof ๋ฑ์ ํ๋ฒ์ ๊ตฌํํ๋๋ก ๋์ด ์๋ค. ํด๋์ค ๋ด๋ถ์ ์๋ ํจ์๋ช ์ ๋๊ฐ์ด ์จ์ผํ๊ณ ๊ทธ ๋ชฉ์ ์ ๋ง๊ฒ ์ฝ๋ฉํ๋ฉด ๋๋ค
pytorch lightning์ ํฌ๊ฒ Trainer์ Lightning Module๋ก ๋๋ ์ ์๋ค.
Lightning Module์ ๋ชจ๋ธ ๋ด๋ถ์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ research & science ํด๋์ค๋ผ๊ณ ์๊ฐํ ์ ์๋ค. ๋ชจ๋ธ์ ๊ตฌ์กฐ๋ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ, ์์คํจ์ ๋ฑ์ ์ค์ ์ ํตํด ๋ชจ๋ธ์ ์ด๊ธฐํํ๋ค. ์ค์ ๋ก ์ฝ๋์์๋ pl.LightningModule ํด๋์ค๋ฅผ ์์๋ฐ์ ์๋ก์ด LightningModule ํด๋์ค๋ฅผ ์์ฑํ๋ค. ๊ธฐ์กด PyTorch์ nn.Module๊ณผ ๊ฐ์ ๋ฐฉ์์ด๋ผ๊ณ ๋ณด๋ฉด๋๋ค.
Trainer๋ ๋ชจ๋ธ์ ํ์ต์ ๋ด๋นํ๋ ํด๋์ค๋ผ๊ณ ๋ณผ ์ ์๋ค. ๋ชจ๋ธ์ ํ์ต epoch์ด๋ batch ๋ฑ์ ์ํ๋ฟ๋ง ์๋๋ผ, ๋ชจ๋ธ์ ์ ์ฅํด ๋ก๊ทธ๋ฅผ ์์ฑํ๋ ๋ถ๋ถ๊น์ง ๋ด๋นํ๋ค. ์ค์ ๋ก ์ฝ๋์์๋ pl.Trainer()๋ผ๊ณ ์ ์ํ๋ฉด ๋์ด๋ค.
pytorch lightning์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ๊ฐ๋จํ ์ค์นํ ์ ์๋ค
pip install pytorch-lightning
pytorch lightning์ ํตํด ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ์์ฑํ๋ ์์๋ ์๋์ ๊ฐ๋ค.
- lightning module์์ ์์๋ ์๋ก์ด Lightning Module ํด๋์ค๋ฅผ ์์ฑํ๋ค.
- DataLoader๋ฅผ ํตํด ํ์ตํ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ค.
- Trainer ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ทธ Trainer์ ๋ฐ์ดํฐ์ Lightning Module ํด๋์ค๋ฅผ ์ฃผ์ด ํ์ตํ๋ค.
Lightning Module Class
lightning module์ trainer์ model์ด ์ํธ์์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ตฌํ์ฒด์ด๋ค.
๊ธฐ์กด pytorch์ ๋ฌ๋ฆฌ, DataLoader, Model, optimizer, Training loof ๋ฑ์ Lightning Module Class ์์ ํ๋ฒ์ ๊ตฌํํ๋๋ก ๋์ด์๋ค.
๋ชจ๋ ์ ์๋ฅผ ์ํด LightningModule ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ํ์ต์ ํ์ํ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํ๋ค.
Lightning Module์ ์๋ 6๊ฐ์ง๋ก ๊ตฌ์ฑ๋๋ค
-
Computations (
__init__)- ์ด๊ธฐํ ๋ฉ์๋
- Lightning Module Calss์์ ์ฌ์ฉํ ์ ๊ฒฝ๋ง์ ์ ์ํ๋ค
- ์ ๊ฒฝ๋ง ๋ ์ด์ด๋ฅผ ์์ฑํ๋ ค๋ฉด
torch.nn.module์์ ๋ถ๋ฌ์ค๊ฑฐ๋ ํ์ฅํด์ผํ๋ค
-
Train loop (
training_step)-
ํ์ต ๋ฃจํ์ body ๋ถ๋ถ์ ๋ํ๋ธ๋ค.
-
nn.Module์forward์ ์ ์ฌํ์ง๋ง, ๋จ์ผ ๋ฐฐ์น์์์ loss๋ฅผ ๋ฐํํด์ผํ๋ฉฐ, ์ด๋ train loop๋ก ์๋ ๋ฐ๋ณต๋๋ค -
์ด ๋ฉ์๋์์๋ argument๋ก training dataloader๊ฐ ์ ๊ณตํ๋ batch์ ํด๋น batch์ index๊ฐ ์ฃผ์ด์ง๊ณ , ํ์ต loss๋ฅผ ๊ณ์ฐํ์ฌ ๋ฐํํ๋ค.
-
lightning์์๋ batch์ tensor๋ฅผ cpu/gpu tensor๋ก ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ๋ฐ๋ก ์ถ๊ฐํ์ง ์์๋ trainer์ ์ค์ ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ ์ ํ ํ์ ์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค.
-
epoch level metric์ ๊ณ์ฐํ๊ณ log๋ฅผ ์ถ์ ํ๋ ค๋ฉด
.log๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ๋ง์ฝ, training_step์ ๊ฒฐ๊ณผ๋ฅผ ๋ฌด์์ธ๊ฐ ํ ์ผ์ด ์์ผ๋ฉดtraining_epoch_end๋ฉ์๋๋ฅผ ์์ฑํ๋ค.def training_step(self, batch, batch_idx): x, y = batch y_hat = self.model(x) loss = F.cross_entropy(y_hat, y) # logs metrics for each training_step, # and the average across the epoch, to the progress bar and logger self.log("train_loss", loss, on_step=True, on_epoch=True, prog_bar=True, logger=True) return loss def training_epoch_end(self, training_step_outputs): for pred in training_step_outputs: ...
-
-
Validation loop (
validation_step)-
loss ๋ฐ metric logging์ ์ํ validation_step๋ฐ test_step์ ์ถ๊ฐํ ์ ์๋ค.
-
validation_step์ ํ์ต ์ค๊ฐ์ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ฒดํฌํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.
-
training_step๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก validation ๋ฐ์ดํฐ๋ก๋์์ ์ ๊ณตํ๋ ๋ฐฐ์น๋ฅผ ๊ฐ์ง๊ณ ํ์ธํ๊ณ ์ ํ๋ ํต๊ณ๋์ ๊ธฐ๋กํ ์ ์์ต๋๋ค.
-
๋ง์ฝ์ ๊ฐ validation_step์ ๊ฒฐ๊ณผ๋ก ๋ฌด์์ธ๊ฐ ํ ์ผ์ด ์์ผ๋ฉด validation_epoch_end ๋ฉ์๋์ ์์ฑํฉ๋๋ค.
def validation_step(self, batch, batch_idx): x, y = batch y_hat = self.model(x) loss = F.cross_entropy(y_hat, y) self.log("val_loss", loss) pred = ... return pred def validation_epoch_end(self, validation_step_outputs): for pred in validation_step_outputs: ...
-
-
Test loop (
test_step)-
test_step์ ์์ ๋ ํจ์์ ๋น์ทํ๊ฒ test ๋ฐ์ดํฐ๋ก๋์์ ์ ๊ณตํ๋ ๋ฐฐ์น๋ฅผ ๊ฐ์ง๊ณ ํ์ธํ๊ณ ์ถ์ ํต๊ณ๋์ ๊ธฐ๋กํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ค.
-
test loop ์ฝ๋๋ validation loop ์ฝ๋์ ๊ฑฐ์ ๋์ผํ๋ค.
-
ํธ์ถํ ๋๋ test_step()๋ฉ์๋ ๋ฅผ ์ฌ์ ์ํด์ผํ๋ค.
# call after training trainer = Trainer() trainer.fit(model) # automatically auto-loads the best weights from the previous run trainer.test(dataloaders=test_dataloader)
-
-
Prediction loop (
predict_step) -
Optimizers (
configure_optimizers)
์๋๋ ๋ผ๋ ์ฝ๋์ด๋ค
import pytorch_lightning as pl
class Classifier(pl.LightningModule):
def __init__(self):
super().__init__()
self.model = nn.Sequential(
...
)
def forward(self, x):
pass
def training_step(self, batch, batch_idx):
pass
def validation_step(self, batch, batch_idx):
pass
def test_step(self, batch, batch_idx):
pass
def configure_optimizers(self):
pass
reference