[WandB] Sweep 사용법

qw4735·2023년 2월 27일
0

WandB

목록 보기
3/3

Sweep이란?

: 하이퍼파라미터를 자동으로 최적화해주는 도구

  • 하이퍼파라미터를 사용자가 선택한 method로 최적화를 진행
    (grid방식, random방식, bayes방식)
  • 선택한 search 방식으로 하이퍼 파라미터 튜닝이 완료되면, Wandb의 웹에서 dashboard로 시각화된 모습을 볼 수 있다.
  • Sweep은 자동으로 tuning해주는 기능 뿐만 아니라, 각각의 하이퍼파라미터들이 metric(accuracy, loss 등)에 얼마나 중요한 지 알려주고 상관관계를 보여준다.

Sweep 사용법( https://docs.wandb.ai/guides/sweeps/define-sweep-configuration )

1. Initialize the sweep
: sweep의 구성요소(Configuration)를 정의하고, sweep api로 초기화

  • Configuration 필수요소(required) : 어디(program)에서 무엇(parameter)을 어떻게(method) \quad \quad \quad \quad \quad \quad \quad\quad \quad \quad \quad \quad \quad최적화 할 것인지 정의해줘야한다.

  • sweep을 초기화하는 코드 : 위에서 정의된 config변수를 입력으로 받고, sweep id를 출력해준다. 이 id는 sweep을 실행시킬 때 고유 식별자로 사용된다.

    sweep_id = wandb.sweep(config.sweep_config)

2. Run the sweep agent
: 함수 또는 프로그램을 wandb 서버에서 실행

  • Configuration을 사용해 Sweep 실행하는 코드

    wandb.agent(sweep_id, function= 정의한 train함수, count = 몇번 sweep을 진행할지 숫자입력)

    다음과 같은 실행화면이 보인다면 성공적으로 Sweep을 실행시킨 것.


wandb의 sweep을 실행시키기 위한 전체 코드

from dataset import SweepDataset
from model import ConvNet
from optimize import build_optimizer
from utils import train_epoch
import wandb
import config
def train():
    wandb.init(config=config.hyperparameter_defaults)
    w_config = wandb.config
	loader = SweepDataset(w_config.batch_size, config.train_transform)
    model = ConvNet(w_config.fc_layer_size, w_config.dropout).to(config.DEVICE)
    optimizer = build_optimizer(model, w_config.optimizer, w_config.learning_rate)
	wandb.watch(model, log='all')
	for epoch in range(w_config.epochs):
        avg_loss = train_epoch(model, loader, optimizer, wandb)
        print(f"TRAIN: EPOCH {epoch + 1:04d} / {w_config.epochs:04d} | Epoch LOSS {avg_loss:.4f}")
        wandb.log({'Epoch': epoch, "loss": avg_loss, "epoch": epoch})     
sweep_id = wandb.sweep(config.sweep_config)
wandb.agent(sweep_id, train, count=2)
  1. hyperparameter의 초기값을 wandb.init에 입력으러 넣어줌
    wandb.init(config = config.hyperparameter_defaults)

  2. sweep을 할 대상 hyperparameter를 w_config로 정의
    w_config = wandb.config

  3. loader, model, optimizer에 w_config를 매개변수로 전달
    e.g) w_config.optimizer

  4. model을 정의하면 wandb.watch 함수로 gradient 추적
    wandb.watch(model, log='all')

  5. epoch별로 나오는 log를 wandb.log에 저장
    wandb.log({'Epoch':epoch, 'loss':avg_loss, 'epoch':epoch})

  6. config 파일에 정의해둔 구성요소를 wandb.sweep에 입력
    sweep_id = wandb.sweep(config.sweep_config)

  7. sweep_id, train함수, count횟수(몇번 sweep을 진행할지)를 wandb.agent에 입력하고, sweep을 실행
    wandb.agent(sweep_id, train, count=2)


Sweep 시각화

  • loss, accuracy 그래프

    wandb.log({"train_loss": avg_loss}, step=epoch)
    wandb.log({'val_loss' : val_loss)
  • model parameter & gradients 그래프
    - log = 'all' : gradient와 parameter를 다 기록할 수 있음

    wandb.watch(model, criterion, log="all", log_freq=10)
  • sweep 그래프

     sweep_id = wandb.sweep(sweep_config, project="project_name", entity='wandb_id')
      wandb.agent(sweep_id, run_sweeep, count=6)

🔗 reference : https://pebpung.github.io/wandb/2021/10/10/WandB-2.html
https://pebpung.github.io/wandb/2021/10/17/WandB-3.html
🔗 code reference : https://github.com/PEBpung/MLOps-Tutorial/blob/master/1.wandb/WandB_pytorch_tutorial.ipynb

0개의 댓글

관련 채용 정보