새소식

부스트캠프 AI Tech 4기

[PyTorch] 21. Monitoring tools

  • -

일반적으로 학습을 할 때 긴 학습 시간이 필요하다.

이 긴 시간동안의 기록이 필요한데 이럴 때 도구를 사용할 수 있다.

 

Tensorboard

학습 그래프, metric, 학습 결과의 시각화를 지원해주는 tool이다.

 

Tensorboard는 아래와 같은 값을 보여준다.

  • scalar: metric 등 상수 값을 epoch 단위로 표시
  • graph : 모델의 computational grap를 표시
  • histogram : weight 등 값의 분포를 표현
  • image/text : 예측 값과 실제 값을 비교 표시
  • mesh : 3d 형태의 데이터를 표현하는 도구

 

Tensorboard with pytorch

https://pytorch.org/tutorials/recipes/recipes/tensorboard_with_pytorch.html

 

Tensorboard 기록을 위한 디렉토리 생성

import os

logs_base_dir = "logs"
os.makedirs(logs_base_dir, exist_ok=True)

 

기록 생성 객체인 SummaryWriter를 생성한다.
"app/fashion_mnist_experiment_1"에 기록하겠다는 의미

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter('app/fashion_mnist_experiment_1')

 

Jupyter 상에서 Tensorboard를 실행

%load_ext tensorboard

# app에서 불러오겠다.
%tensorboard --logdir "app"

 

notebook상에서 그린 이미지를 TensorBoard에도 추가할 수 있다.

# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()

# create grid of images
img_grid = torchvision.utils.make_grid(images)
print(img_grid.shape)

# show images
matplotlib_imshow(img_grid, one_channel=True)

notebook 상의 이미지

writer.add_image('four_fashion_mnist_images', img_grid)
writer.close()

 

add_graph로 그래프를 그릴 수 도 있다.

writer.add_graph(net, images)
writer.close()

 

add_scalar로 loss 값을 기록할 수 있다.

running_loss = 0.0
for epoch in range(2):  # loop over the dataset multiple times
    print(epoch)
    for i, data in enumerate(trainloader, 0):

        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 1000 == 999:    # every 1000 mini-batches...

            # ...log the running loss
            writer.add_scalar('training loss',
                            running_loss / 1000,
                            epoch * len(trainloader) + i)

            running_loss = 0.0

 

 

 

weight & biases

https://wandb.ai/site

머신러닝 실험을 원할히 지원하기 위한 상용 도구로 MLOps의 대표적인 툴로 확대 중이다.

협업, code versionong, 실험 결과 기록 등을 제공해준다.

 

!pip install wandb -q
import wandb

wandb.init(project="my-test-project", entity="kimbyeolhee")

 

EPOCHS = 100
BATCH_SIZE = 64
LEARNING_RATE = 0.001

config={"epochs": EPOCHS, "batch_size": BATCH_SIZE, "learning_rate" : LEARNING_RATE}

이렇게 config를 사용할 수 도 있다.

 

# wandb.config.batch_size = BATCH_SIZE
# wandb.config.learning_rate = LEARNING_RATE

 

학습할 때 마다 기록

wandb.init(project="my-test-project", config=config)

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.zero_grad()        
        y_pred = model(X_batch)
               
        loss = criterion(y_pred, y_batch.unsqueeze(1))
        acc = binary_acc(y_pred, y_batch.unsqueeze(1))
        
        loss.backward()
        optimizer.step()
        
        epoch_loss += loss.item()
        epoch_acc += acc.item()
        
        
    train_loss = epoch_loss/len(train_dataset)
    train_acc = epoch_acc/len(train_dataset)
    print(f'Epoch {e+0:03}: | Loss: {train_loss:.5f} | Acc: {train_acc:.3f}')
    
    wandb.log({'accuracy': train_acc, 'loss': train_loss})

 

 


부스트캠프 AI Tech 교육 자료를 참고하였습니다.

728x90
Contents