PyTorch 6, 7강) 모델 불러오기 / Multi-GPU
모델 불러오기
model.save()
# state_dict(): parameter 표시
for param_tensor in model.state_dict():
print(param_tensor, "\t", model.state_dict()[param_tensor].size())
# parameter를 OrderedDict로 저장
torch.save(model.state_dict(), os.path.join(MODEL_PATH, "model.pt"))
# 같은 모델의 형태에서 parameter만 load
new_model = TheModelClass()
new_model.load_state_dict(torch.load(os.path.join(MODEL_PATH, "model.pt")))
# architecture와 save/load
torch.save(model, os.path.join(MODEL_PATH, "model.pt"))
model = torch.load(os.path.join(MODEL_PATH, "model.pt"))
- 모델 형태(architecture)와 parameter 저장
- 중간과정 저장해서 최선의 결과 모델 선택
- 모델을 외부 연구자와 공유해 학습 재연성 향상
Checkpoints
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")
checkpoint = torch.load(PATH)
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
loss = checkpoint['loss']
- 중간과정 저장해서 최선의 결과 모델 선택
- earlystopping 기법 사용시 이전 학습의 결과물을 저장
- 일반적으로 loss, epoch, metric을 함께 저장
Transfer learning
# vgg16 모델을 vgg에 할당
vgg = models.vgg16(pretrainde=True).to(device)
# 모델에 마지막 linear layer 추가
class MyNewNet(nn.Module):
def __init__(self):
super(MyNewNet, self).__init__()
self.vgg19 = models.vgg19(pretrained=True)
self.linear_layers = nn.Linear(1000, 1)
# Defining forward pass
def forward(self, x):
x = self.vgg19(x)
return self.linear_layers(x)
마지막 레이어를 제외하고 frozen
for param in my_model.parameters():
param.require_grad = False
for param in my_model.linear_layers.parameters():
param.require_grad = True
- 남이 만든 모델을 쓰고싶을 때
- 다른 dataset으로 만든 모델을 현재 데이터에 적용
- 대용량 dataset으로 만든 모델의 성능이 보통 좋기 때문에 현재 DL에서는 가장 일반적인 학습방법
- backbone architecture가 잘 학습된 모델에서 일부분만 변경해 학습을 수행
Freezing
# state_dict(): parameter 표시
for param_tensor in model.state_dict():
print(param_tensor, "\t", model.state_dict()[param_tensor].size())
# parameter를 OrderedDict로 저장
torch.save(model.state_dict(), os.path.join(MODEL_PATH, "model.pt"))
# 같은 모델의 형태에서 parameter만 load
new_model = TheModelClass()
new_model.load_state_dict(torch.load(os.path.join(MODEL_PATH, "model.pt")))
# architecture와 save/load
torch.save(model, os.path.join(MODEL_PATH, "model.pt"))
model = torch.load(os.path.join(MODEL_PATH, "model.pt"))
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")
checkpoint = torch.load(PATH)
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
loss = checkpoint['loss']
# vgg16 모델을 vgg에 할당
vgg = models.vgg16(pretrainde=True).to(device)
# 모델에 마지막 linear layer 추가
class MyNewNet(nn.Module):
def __init__(self):
super(MyNewNet, self).__init__()
self.vgg19 = models.vgg19(pretrained=True)
self.linear_layers = nn.Linear(1000, 1)
# Defining forward pass
def forward(self, x):
x = self.vgg19(x)
return self.linear_layers(x)
마지막 레이어를 제외하고 frozen
for param in my_model.parameters():
param.require_grad = False
for param in my_model.linear_layers.parameters():
param.require_grad = True
- Pre-trained model을 사용할 때 parameter의 일부를 고정시킴
Monitoring tools
Tensorboard
#Tensorboard 기록을 위한 directory 생성
import os
logs_base_dir = 'logs'
os.makedirs(logs_base_dir, exist_ok=True)
# 기록 생성 객체 SummaryWriter 생성
from torch.utils.tensorboard import SummaryWriter
import numpy as np
# add_scalar: scalar 값을 기록
# Loss/train: loss category에 train값 넣음
# n_iter: x축의 값
writer = SummaryWriter(logs_base_dir)
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()
# 값 기록(disk에 쓰기)
writer.flush()
# jupyter 상에서 tensorboard 수행
%load_ext tensorboard
# 파일 위치 지정
# 같은 명령어를 콘솔에서도 사용 가능
%tensorboard--logdir {logs_base_dir}
- TensorFlow의 프로젝트로 만들어진 시각화 도구
- 학습 그래프, metric, 학습 결과의 시각화 지원
- PyTorch도 연결 가능 --> DL 시각화의 핵심 도구!
저장할 수 있는 값
- scalar: metric(accuracy, loss 등) 상수 값의 연속(epoch) 표시
- graph: 모델의 computational graph 표시
- histogram: weight 등 값의 분포 표현
- image: 예측 값과 실제 값을 비교 표시
- mesh: 3d 형태의 데이터를 표현
WandB(weight & biases)
!pip install wandb -q
# config 설정
config={"epochs":EPOCHS, "batch_size":BATCH_SIZE, "learning_rate":LEARNING_RATE}
wandb.init(project="testproject", config=config)
# wandb.config.batch_size = BATCH_SIZE
# wandb.config.learning_rate = LEARNING_RATE
for e in range(1, EPOCHS+1):
epoch_loss = 0
epoch_acc = 0
for X_batch, y_batch in train_dataset:
X_batch, Y_batch = X_batch.to(device), y_batch.to(device).type(torch.cuda.FloatTensor)
# ...
optimizer.step()
# ...
# 기록 add_~~ 함수와 동일
wandb.log({'accuracy': train_acc, 'loss':train_loss})
- 머신러닝 실험을 원활히 지원하기 위한 상용도구
- 협업, code versioning, 실험 결과 기록 등 제공
- MLOps의 대표적인 툴로 저변 확대중
Author And Source
이 문제에 관하여(PyTorch 6, 7강) 모델 불러오기 / Multi-GPU), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@hanlyang0522/PyTorch-6-7강-모델-불러오기
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#Tensorboard 기록을 위한 directory 생성
import os
logs_base_dir = 'logs'
os.makedirs(logs_base_dir, exist_ok=True)
# 기록 생성 객체 SummaryWriter 생성
from torch.utils.tensorboard import SummaryWriter
import numpy as np
# add_scalar: scalar 값을 기록
# Loss/train: loss category에 train값 넣음
# n_iter: x축의 값
writer = SummaryWriter(logs_base_dir)
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()
# 값 기록(disk에 쓰기)
writer.flush()
# jupyter 상에서 tensorboard 수행
%load_ext tensorboard
# 파일 위치 지정
# 같은 명령어를 콘솔에서도 사용 가능
%tensorboard--logdir {logs_base_dir}
!pip install wandb -q
# config 설정
config={"epochs":EPOCHS, "batch_size":BATCH_SIZE, "learning_rate":LEARNING_RATE}
wandb.init(project="testproject", config=config)
# wandb.config.batch_size = BATCH_SIZE
# wandb.config.learning_rate = LEARNING_RATE
for e in range(1, EPOCHS+1):
epoch_loss = 0
epoch_acc = 0
for X_batch, y_batch in train_dataset:
X_batch, Y_batch = X_batch.to(device), y_batch.to(device).type(torch.cuda.FloatTensor)
# ...
optimizer.step()
# ...
# 기록 add_~~ 함수와 동일
wandb.log({'accuracy': train_acc, 'loss':train_loss})
Author And Source
이 문제에 관하여(PyTorch 6, 7강) 모델 불러오기 / Multi-GPU), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hanlyang0522/PyTorch-6-7강-모델-불러오기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)