boostcampaitech3 / final-project-level3-cv-18

final-project-level3-cv-18 created by GitHub Classroom
0 stars 4 forks source link

MLflow 사용법 #5

Open kimkihoon0515 opened 2 years ago

kimkihoon0515 commented 2 years ago

우선 필요한 라이브러리들을 설치합니다.

pip install mlflow sklearn google-cloud-storage

인증용 JSON파일을 받는 방법입니다.

구글 클라우드 플랫폼 페이지에 가셔서 좌측 상단 메뉴바를 눌러보시면 API 및 서비스가 있습니다. 그 다음 사용자 인증 정보를 누릅니다.

image

그리고 중앙 상단에 보시면 사용자 인증 정보 만들기를 누르셔서 새로운 서비스 계정을 만듭니다.

image

편한 이름 설정하시고 확인버튼 누르시면 새롭게 서비스 계정이 생성됩니다.
방금 만드신 계정을 누르셔서 다음과 같은 화면으로 만들어 줍니다.

image

키를 누르시고 키추가를 누르시면 JSON형태로 저장할지 P12 형태로 저장할지 화면이 나오는데 여기서 JSON으로 저장하시고 작업하시는 폴더에 upload 합니다.

mlflow를 사용하는 방법입니다.

설치한 mlflow를 baseline 코드의 맨 윗단에 import 시킵니다.

import os
import json

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import torch
import timm
import cv2
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import albumentations as A
from albumentations.pytorch import ToTensorV2
from torch.utils.data import Dataset, DataLoader 
import mlflow
import mlflow.sklearn

바로 그 아래에 다음 코드들을 작성합니다.

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/opt/ml/input/artlab/premium-bearing-350511-1d17b9b89c55.json' # 인증용 JSON 파일 경로로 본인 파일명,경로 등을 수정해 주셔야 합니다.
from google.cloud import storage
client = storage.Client()

다음으로 train 코드에 다음과 같이 추가적인 부분들을 작성해주시면 됩니다.

import copy

train_loss_list = []                                                # 이후 학습 그래프를 그리기 위해 선언한 리스트 들이다. loss값과 accuracy값을 각각 저장한다.
train_acc_list = []
val_loss_list = []
val_acc_list = []

total_train_image = len(train_dataset)                              # 총 학습 이미지의 개수를 의미한다.
total_train_batch = len(train_loader)                               # 각 에포크 당 미니 배치 개수를 의미한다.
total_val_image = len(valid_dataset)    
total_val_batch = len(valid_loader)

experiment_name = 'resnet18' # 본인이 실험명을 정할 수 있습니다. 이 실험명에 따라서 아래에 있는 experiment_id가 정해지게 됩니다.  

if not mlflow.get_experiment_by_name(experiment_name): # 추가
  mlflow.create_experiment(name=experiment_name)
experiment = mlflow.get_experiment_by_name(experiment_name)

mlflow.set_tracking_uri('http://34.64.140.177:5000/') # 제 GCP 서버 주소입니다.

best_accuracy = 0
with mlflow.start_run(experiment_id=experiment.experiment_id): # 추가
  for epoch in range(total_epoch):                                    # total_epoch 값 만큼 epoch 실행한다.
    model.train()                                                     # model 학습 모드로 변경한다.
    train_accuracy = 0                                                # 해당 epoch의 accuracy와 loss를 저장할 변수 선언한다.
    train_loss = 0                        
    for images, labels in train_loader:   
      images = images.to(device)
      labels = labels.to(device)

      hypothesis = model(images)                                      
      loss = criterion(hypothesis, labels)                            

      optimizer.zero_grad()
      loss.backward()
      optimizer.step()

      prediction = torch.argmax(hypothesis, 1)                        # 학습 이미지에 대해 모델이 예측한 label을 저장한다.
      correct = (prediction == labels)                                # 정답 label들과 비교한다.
      train_accuracy += correct.sum().item() / total_train_image      # accuracy 값을 갱신한다.
      train_loss += loss.item() / total_train_batch                   # loss 값을 갱신한다.

    model.eval()
    val_accuracy = 0
    val_loss = 0
    for images, labels in valid_loader:
      images = images.to(device)
      labels = labels.to(device)

      prediction = model(images)
      loss = criterion(prediction, labels)
      correct = (torch.argmax(prediction, 1) == labels)
      val_accuracy += correct.sum().item() / total_val_image
      val_loss += loss.item() / total_val_batch

    print(f'epoch: {epoch}/{total_epoch} train_loss: {train_loss:.5} train_accuracy: {train_accuracy:.5} val_loss: {val_loss:.5} val_accuracy: {val_accuracy:.5}')

    train_acc_list.append(train_accuracy)
    train_loss_list.append(train_loss)
    val_acc_list.append(val_accuracy)
    val_loss_list.append(val_loss)
    mlflow.log_param('learning-rate',learning_rate) # log_param은 파라미터를 기록하는 함수입니다.
    mlflow.log_param('epoch',total_epoch)
    mlflow.log_param('batch_size',batch_size)
    mlflow.log_param('seed',seed)
    mlflow.log_metric('train_accuracy',train_accuracy) # log_metric은 metric을 기록하는 함수입니다.
    mlflow.log_metric('train_loss',train_loss)
    mlflow.log_metric('val_accuracy',val_accuracy)
    mlflow.log_metric('val_loss',val_loss)
    mlflow.sklearn.log_model(model,'model') # model을 기록하여 저장합니다.
    artifact_uri = mlflow.get_artifact_uri() #여기까지 추가하시면 됩니다.

    if best_accuracy < val_accuracy:
      torch.save(model.state_dict(), 'model.pt')
      best_accuracy = val_accuracy
      best_epoch = epoch
      best_model_wts = copy.deepcopy(model.state_dict())
      print(f"Save Model(Epoch: {epoch}, Accuracy: {best_accuracy:.5})")

print(f'Best Accuracy: {best_accuracy:.5}')

MLflow 모델 확인하는방법

http://34.64.140.177:5000/ 로 들어가서 본인이 설정한 실험 이름을 찾아 들어갑니다.

image

그리고 네모 친 부분을 누르면 다음과 같은 화면으로 이동하게 됩니다.
parameter, metric 등 정보를 확인할 수 있습니다.

image

그래프 등으로 시각적으로 표현도 해줍니다.

image
ed-kyu commented 2 years ago

혹시라도 403 error가 뜨신다면 다음 방법으로 해보시면 됩니다.

  1. 기훈님이 보내주신 구글 메일 초대 링크로 프로젝트 들어가기

  2. 위 방법과 동일한데 '인증용 JSON파일을 받는 방법' 에서 그냥 만드시지 마시고 다음과 같은 방법으로 해주세요

2-1. 그냥 생성 버튼 누르지 마시고 '만들고 계속하기' 버튼 누르시고 화면 캡처 2022-05-22 141203

2-2. 다음과 같이 역할을 3개 주시면 됩니다. 화면 캡처 2022-05-22 141257

  1. 생성 이후 json 만드는 방법이나 다른 사용방법은 같습니다.