본문 바로가기

CS/AI

[PyTorch] 모델 불러오기 / PyTorch 모니터링

반응형

이 글은 간단하게 작성하겠습니다.

 

아래 모든 내용은 부스트캠프 AI Tech 프리코스에서 가져왔습니다.


파이토치의 모델을 저장하고 싶다면 어떻게 해야 할까?

 

나도 열심히 몇개의 에폭을 돌린 모델을 매번 노트북 켤 때마다 학습시키는 건 아닐테니 방법이 있겠거니 생각했고,

역시 model.save()를 사용하면 되는 것이었다.

 

모델의 상태를 확인하는 방법은 state_dict()를 사용하는 방법이 있다.

state_dict()는 모델 상태를 OrderedDict 타입으로 반환한다.

또는 torchsummary를 통해서 할 수도 있다. keras는 summary() 함수를 자체 제공한다.

Checkpoint

 

early stop 기법을 사용하게 되면 에폭 중간에 학습을 멈추게 될 수 있습니다.

갑자기 오차율이 더 증가하는 이상현상이 일어난다거나...

 

그럼 중간에 멈추고 이전 값을 갖고 와야 하는데 그 이전 값을 어떻게 가져오죠?

# 모델의 상태와 옵티마이저의 상태를 저장합니다.
torch.save({
    'epoch': e,
    'model_state_dict': model.state_dict(),
    'optimizer_state_dict': optimizer.state_dict(),
    'loss': epoch_loss,
    }, f"saved/checkpoint_model_{e}_{epoch_loss/len(dataloader)}_{epoch_acc/len(dataloader)}.pt")

# 에폭별 손실과 정확도를 출력합니다.
print(f'Epoch {e+0:03}: | Loss: {epoch_loss/len(dataloader):.5f} | Acc: {epoch_acc/len(dataloader):.3f}')

 

이렇게 보면 모델의 상태를 에폭마다 저장할 수 있습니다.

그러면 학습이 종료됐을 때 가장 정확도가 높았던 걸로 모델을 결정하면 되겠죠.

# 이진 분류 정확도를 계산하는 함수입니다.
def binary_acc(y_pred, y_test):
    y_pred_tag = torch.round(torch.sigmoid(y_pred))
    correct_results_sum = (y_pred_tag == y_test).sum().float()
    acc = correct_results_sum/y_test.shape[0]
    acc = torch.round(acc * 100)
    return acc

 

이건 그냥 이진 분류 함수인데

torch.sigmoid() 를 쓰면 예측치에 시그모이드 함수를 쓸 수 있다는 것을 알게 되어 첨부합니다.

 

지식이 늘었다

 

아무튼 체크포인트를 지정을 해주면 특정 지점을 저장할 수도 있습니다.

오차가 줄거나 정확도가 올랐을 때만 저장하는 등 입맛에 맞게 코드를 바꿀 수도 있겠지요

 

Transfer models

요즘엔 그냥 특정 데이터에 대한 다른 모델을 가져와서 파인튜닝하거나 해서 씁니다.

 

허깅페이스나 토치비전 같은 거 다 아시는 것처럼 씁니다...

 

Freezing이라는 것은 Pretrained model을 특정 부분은 고정시켜두는 것을 의미합니다.

그러면 역전파 같은 걸 막아놔서 기본적인 틀은 고정해줄 수가 있습니다.

 

예를 들어 VGG16 같은 걸 불러와서 몇몇 층을 달아줬는데,

VGG16 모델 부분만큼은 역전파를 안 할 수 있죠.


모니터링

 

모니터링도 중요합니다.

백엔드 서버를 돌릴 때나, 클라우드 작업을 할 때, 아니면 다른 어떤 작업을 하든간에 콘솔창에 현재 어떤 작업이 일어나고 있다는 것을 시각적으로 볼 수 있으면 편한데요.

 

딥러닝을 할 때도 지금 어떤 일이 일어나고 있는지 정확도가 어떤지 중간에 확인을 해서 이건 영 아니다 싶을 때 학습을 꺼버리고 다른 방법을 찾을 수도 있겠죠.

일반적으로 로그를 찍고 csv 등으로 저장할 수도 있지만 또 보기 좋은 모니터링 툴들도 잘 나와있습니다.

(아마 streamlit 이런 거일듯)

 

그런 모니터링 툴에 대해 알아보겠습니다.

 

Tensorboard

Tensorboard는 텐서플로우에서 개발된 시각화 도구고요..

텐서플로우 말고도 다른 딥러닝 라이브러리들도 적극적으로 활용하여 ML계의 표준이 된 듯 합니다.

 

scalar: 에폭의 각 수치들을 표시

graph: 이런 수치들을 computational graph로 표시해줍니다.

히스토그램으로 분포도를 그릴 수도 있고,

image, mesh 등도 다 다룹니다.

 

import os
from tensorboard import notebook
from torch.utils.tensorboard import SummaryWriter

# 로그를 저장할 기본 디렉토리를 설정합니다.
logs_base_dir = "logs"
os.makedirs(logs_base_dir, exist_ok=True)

# 특정 실험에 대한 로그 디렉토리를 설정합니다.
exp  = f"{logs_base_dir}/ex3"
writer = SummaryWriter(exp)

# 임의의 손실 및 정확도 값을 로그에 기록합니다.
for n_iter in range(100):
    writer.add_scalar('Loss/train', np.random.random(), n_iter)
    writer.add_scalar('Loss/test', np.random.random(), n_iter)
    writer.add_scalar('Accuracy/train', np.random.random(), n_iter)
    writer.add_scalar('Accuracy/test', np.random.random(), n_iter)
writer.flush()

 

이런 식으로 텐서보드에 스칼라로 표시해줄 값을 매 에폭마다 (위 코드에선 그냥 랜덤값을 넣긴 하지만)

로그에 넣어주고,

 

%tensorboard --logdir "logs"

 

텐서보드를 실행시키면 시각적으로 볼 수 있는 인터페이스가 생성됩니다.

 

여러 로그에 대하여 한 번에 불러와 실험들을 비교해볼 수도 있기 때문에 수월합니다.

 

Weight & biases

 

Weight & biases 는 일단 유료 프로젝트긴 한데 무료로도 일부 기능을 간단하게 사용할 수 있습니다.

 

이건 웹사이트 형식이어서 API 키를 받아서 하면 됩니다.

 

https://wandb.ai/site/ko/

 

Weights & Biases: The AI Developer Platform

Weights & Biases는 모델을 학습 및 파인튜닝하고, 실험부터 생산까지 모델을 관리하며, LLM으로 구동되는 GenAI 애플리케이션을 추적 및 평가할 수 있는 선도적인 AI 개발자 플랫폼입니다.

wandb.ai

이건 팀끼리 공유하기 좋은 시스템이기 때문에 과금해서 사용해도 좋을 것 같네요.