brunch

PyTorch 쓰세요(2).

#콜백 #callback #pytorch_lightning

by 유윤식

콜백을 지정해서 checkpoint, earlystop, 등등 컨트롤하는 방법.


어제에 이어서 Mnist 예제 코드를 그대로 활용하는데,

바뀌는 부분에 대해서만 설명을 적어보자면,



def configure_optimizers(self):

optimizer = torch.optim.Adam(self.parameters(), lr=self.learning_rate)

scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, patience=3, factor=0.9, verbose=True)


return {

"optimizer": optimizer,

"lr_scheduler": {

"scheduler": scheduler,

"monitor": "val_acc",

"strict": True,

"name": "mnist_lr"

}

}


스케쥴러를 정의하고 사용하는데,

뒤에 따라붙는 옵션이 중요하다.


어제의 성능이나 오늘의 성능이 딱히 중요하지는 않지만...

비교를 위해서 어제의 성능을 잠시 다시 확인해보면,


스크린샷 2021-08-10 21.42.05.png

validation loss 가 0.147 정도를 기록했다.


어제와 오늘은 랜덤이기 때문에 이 부분부터 집고 넘어가자면,

아래와 같은 코드를 impot 구문 아래에서 선언해주면 된다.



def seed_everything(seed = 7):

random.seed(seed)

os.environ['PYTHONHASHSEED'] = str(seed)

np.random.seed(seed)

torch.manual_seed(seed)

torch.cuda.manual_seed(seed)

torch.backends.cudnn.deterministic = True


seed_everything()


이건 인터넷에 떠도는 옵션이다.


이어서 콜백을 선언해볼텐데,

3가지!



from pytorch_lightning.callbacks import ModelCheckpoint, EarlyStopping, LearningRateMonitor


chk_callback = ModelCheckpoint(

dirpath='./lightning_chks',

filename='sample-mnist-epoch{epoch:02d}-val_loss{val-loss:.2f}',

verbose=True,

save_last=True,

save_top_k=5,

monitor='val_loss',

mode='min'

)


earlystop_callback = EarlyStopping(

monitor='val_loss',

patience=5,

verbose=True,

mode='min'

)


lrmonitor_callback = LearningRateMonitor(logging_interval='step')


쉽다.

그냥 선언해서 사용하면 된다.


trainer 선언부에 callback 옵션을 넘겨준다.



trainer = Trainer(

gpus=AVAIL_GPUS,

accelerator="dp",

max_epochs=50,

progress_bar_refresh_rate=10,

callbacks=[chk_callback, earlystop_callback, lrmonitor_callback]

)



이제 학습을 돌리는데,

earlystop 이 걸릴 수 있다.


epochs 를 50 까지 확 늘려서 실험한다.


스크린샷 2021-08-12 00.08.20.png

33번째 학습에서 멈췄다.

잘 하고 있는듯 하다.


이제 test 를 돌려보면,


trainer.test()


결과는,

스크린샷 2021-08-12 00.09.38.png

오늘의 나는 어제의 나를 넘어섰다.


이후 스텝은 메뉴얼하게 체크포인트를 저장하고 다시 불러와서 같은 값을 도출하는지 확인했다.


요즘은 BERT를 진행하고 있어서,

이후 예제는 Mnist 게임을 벗어던지고 새로운 게임을 포스팅한다.


keyword
작가의 이전글PyTorch 쓰세요.