: 하이퍼파라미터를 자동으로 최적화해주는 도구
1. Initialize the sweep
: sweep의 구성요소(Configuration)를 정의하고, sweep api로 초기화
Configuration 필수요소(required) : 어디(program
)에서 무엇(parameter
)을 어떻게(method
) 최적화 할 것인지 정의해줘야한다.
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을 실행시킨 것.
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)
hyperparameter의 초기값을 wandb.init에 입력으러 넣어줌
wandb.init(config = config.hyperparameter_defaults)
sweep을 할 대상 hyperparameter를 w_config로 정의
w_config = wandb.config
loader, model, optimizer에 w_config를 매개변수로 전달
e.g) w_config.optimizer
model을 정의하면 wandb.watch 함수로 gradient 추적
wandb.watch(model, log='all')
epoch별로 나오는 log를 wandb.log에 저장
wandb.log({'Epoch':epoch, 'loss':avg_loss, 'epoch':epoch})
config 파일에 정의해둔 구성요소를 wandb.sweep에 입력
sweep_id = wandb.sweep(config.sweep_config)
sweep_id, train함수, count횟수(몇번 sweep을 진행할지)를 wandb.agent에 입력하고, sweep을 실행
wandb.agent(sweep_id, train, count=2)
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