본문 바로가기
딥러닝

[MLOps][딥러닝][실험] Wandb 간단한 사용법

by 방구석 데이터사이언티스트 2022. 12. 12.
728x90
반응형

안녕하세요. 오늘은 머신러닝/딥러닝을 하는데 많은 도움이 될 수 있는 Wandb에 대해 간단히 알아보고

실질적으로 제가 사용한 경험을 토대로 간단한 사용법에 대해 얘기해보도록 하겠습니다.

 

1. wandb란?

wandb는 머신러닝/딥러닝 작업을 하는데 다양한 서비스를 제공하는 MLOps 플랫폼입니다.

 

저는 엔지니어쪽과는 거리가 있어 MLOps라는 단어를 많이 듣기는 했지만 관심을 가지고 알아본 적은 없었습니다.

하지만 저는 이미 wandb를 사용하고 있었고 MLOps도 이미 많이 상용화된 것을 보고 놀랐습니다.

 

그렇다면 MLOps는 무엇이고 wandb에서 제공하는 서비스는 무엇일까요??

 

MLOps는 머신러닝 작업 프로세스를 간소화하고 이후 유지관리 및 모니터링을 하는 작업을 도와주는 서비스이며, 협업이 가능한 서비스입니다. 따라서 엔지니어, 사이언티스트 등 직무 종사자들에게도 필요한 부분일 것 같네요

구체적으로 wandb에서는 아래와 같은 서비스를 제공합니다.

- Experiment tracking

- Collaborative dashboards

- Dataset and model versioning

- Interactive data visualization

- Hyperparameter optimization

- Centralized model registry

- Automated ML workflows

"모델중심AI시대가 아닌 데이터 중심의 AI시대가 도래할 것이다. 따라서 체계적인 데이터관리를 위해 MLOps가 중요하다"

-앤드류 응-

 

2. wandb 사용법

wandb의 위와 같이 다양한 기능들이 있지만 저는 이 중에서 Experiment tracking(실험 추적, 실험 관리) 기능에 대해 알려드리겠습니다. 

 

먼저 wandb에 가입하시면 아래와 같은 화면이 보입니다.

pytorch, keras 등 여러 프레임워크에 따라 사용예시를 보여줍니다. 

저는 pytorch를 자주 사용하기에 pytorch에 대한 예시로 설명드리겠습니다.

pip install wandb
wandb login

첫 번째는 wandb를 설치하고 로그인하는 코드입니다.

 

import wandb

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

두 번째는 wandb import 및 init 설정입니다. 

wandb.config = {
  "learning_rate": 0.001,
  "epochs": 100,
  "batch_size": 128
}

세 번째는 파라미터에 따른 config를 지정해줍니다.

wandb.log({"loss": loss})

# Optional
wandb.watch(model)

마지막으로 평가지표를 로그로 남깁니다. 해당 예시는 loss이지만 경우에 따라 acc, F1, rmse 등이 될 수 도 있고 여러 지표를 동시에 로그로 남길 수 도 있습니다.

그리고 Optional은 한번도 안써봤습니다ㅎㅎ

 

3. 실제 활용 예시

!wandb login
import wandb
wandb.init(project="project_1", entity="taeyang")
CFG = {
    'EPOCHS': 10,
    'LEARNING_RATE':1e-5,
    'BATCH_SIZE':8,
    'SEED':41
}

wandb.config = CFG
def train(model, optimizer, train_loader, test_loader, device):

    model.to(device)

    criterion = nn.CrossEntropyLoss().to(device)

    best_score = 0
  
    for epoch_num in range(CFG["EPOCHS"]):

        model.train()
        train_loss = []
        for input_ids, token_type_ids, attention_mask, train_label in tqdm(train_loader):
            optimizer.zero_grad()

            train_label = train_label.to(device)
            input_id = input_ids.to(device)
            mask = attention_mask.to(device)

            output = model(input_id, mask)     
    
            batch_loss = criterion(output, train_label.long()) 
            train_loss.append(batch_loss.item())
            
            batch_loss.backward()
            optimizer.step()

        test_loss, test_score, test_weight_score = validation(model, criterion, test_loader, device)
        print(f'Epoch [{epoch_num}], Train Loss : [{np.mean(train_loss) :.5f}] test Loss : [{np.mean(test_loss) :.5f}] test F1 Score : [{test_score:.5f}] test Weighted F1 Score : [{test_weight_score:.5f}]')
        
        wandb.log({
            "Epoch": epoch_num,
            "Train Loss": np.mean(train_loss),
            "Test Loss": np.mean(test_loss),
            "Test Macro F1": test_score,
            "Test Weighted F1": test_weight_score
        })
        
        if best_score < test_score:
            best_model = model
            best_score = test_score
        
    return best_model

코드를 전체 공개하기에는 너무 길어서 wandb가 사용되는 일부분만 가져왔습니다. 

로그인과 init은 코드 초반부에 넣어주시면 되며, 저같은 경우 모듈 import 전에 작성했습니다.

config의 경우 hyperparameter 설정 부분에 넣어 줍니다.

마지막으로 log 부분은 위와같이 train/validation 평가를 위해 train/validation 성능이 측정되는 부분에 log를 작성합니다.

위와같이 저는 train, test 구분없이, 다양한 지표를 log로 남겼습니다.

 

이렇게해서 코드를 돌리고 나면 wandb 페이지에서 실험 결과를 그래프와 수치로 확인할 수 있습니다. 

728x90
반응형

댓글