이 글은 간단하게 작성하겠습니다.
아래 모든 내용은 부스트캠프 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 키를 받아서 하면 됩니다.
Weights & Biases: The AI Developer Platform
Weights & Biases는 모델을 학습 및 파인튜닝하고, 실험부터 생산까지 모델을 관리하며, LLM으로 구동되는 GenAI 애플리케이션을 추적 및 평가할 수 있는 선도적인 AI 개발자 플랫폼입니다.
wandb.ai
이건 팀끼리 공유하기 좋은 시스템이기 때문에 과금해서 사용해도 좋을 것 같네요.
'CS > AI' 카테고리의 다른 글
| [ML] Gradient Descent 자세히 탐구해보기 (0) | 2025.07.22 |
|---|---|
| [ML] Hyperparameter Tuning (0) | 2025.07.11 |
| [ML] AutoGrad, Optimizer, 데이터셋과 데이터 로더 (0) | 2025.07.08 |
| [ML] CNN과 RNN 첫걸음 (0) | 2025.07.01 |
| [부스트캠프 AI Tech 프리코스] 경사하강법과 딥러닝 학습 방법 (0) | 2025.06.24 |
