학습 과정을 visualization하는 대표적인 방법은 Tensorboard와 Wandb가 있다.
PyTorch에서도 Tensorboard를 지원하게 됨으로써 논문의 코드를 보면 tensorboard를 사용하는 경우가 많은데, 추가로 입력해주어야 할 코드가 많아 복잡하다는 단점이 있다.
반면, Wandb는 훨씬 간단하게 학습 과정을 visualize할 수 있다. 사실 Wandb는 학습 과정을 tracking하여 모델을 튜닝할 때에도 유용하게 사용할 수 있다. 그 방법을 알아보자.
목차
Wandb란?
Wandb(Weights & Biases)란, 머신러닝 experiment tracking tool이다.
위 사진에서와 같이 다음과 같은 주요 기능이 있다.
- Experiments
- Experiment tracking
- Artifacts
- Dataset versioning
- Tables
- Model evaluation
- Sweeps
- Model optimization (특히 hyperparameter 튜닝)
- Reports
- Collaborative analysis
이중 이번 포스팅에서는 experiments 사용법을 알아볼 것이다. Experiments 기능은 모델 학습 log를 추적하여 dashboard를 통해 시각화해준다. 학습이 잘 되고 있는지 파악해볼 수 있다.
Wandb 사용 방법
자세한 사용방법은 wandb 사이트의 docs를 확인해보자.
Wandb 회원 가입
먼저, Wandb 사이트에 회원가입을 해야한다.
나는 github 아이디로 가입했다. (github 아이디, google 아이디 등으로 가입이 가능하다.)
Project 생성
다음으로, 로그인 후 홈의 왼쪽 탭에서 'Create new project'를 클릭하여 프로젝트를 생성해준다.
프로젝트를 생성하면 친절하게도 다음과 같은 quick start 가이드를 해준다.
구체적인 사용방법을 더 살펴보자. 필자는 PyTorch에서, GPU서버 환경에서 사용하였다. (사실 training 부분에 코드 몇 줄만 추가해주면 되어서 로컬에서도 충분히 사용할 수 있다.)
Wandb 패키지 설치 및 가상 환경과의 연동
터미널에서, 혹은 jupyter notebook이라면 앞에 '!'를 붙여 wandb 패키지를 설치한다. (pip, conda 둘 다 가능하다)
conda install -c conda-forge wandb
그리고, 마찬가지로 터미널에서 아나콘다 가상환경과 wandb를 연동해주어야 한다.
wandb login
이 명령어를 실행하면 API key를 브라우저에서 찾으라면서 링크를 줄 것이다.
해당 링크에서 API key를 복사하여 붙여넣어주면 연동이 완료된다.
Config Setting
wandb를 실행하려면 config 설정 파일(config.py 혹은 config.yaml)이 필요하다. 이를 통해 모델의 hyperparameter, dataset 등 학습에 필요한 여러 요소들을 그룹화해준다. 또는 학습 코드에서 wandb.config object로 설정해줄 수도 있다. (wandb.init()에서)
사실 학습 과정을 간단히 visualizae만 해보는 경우에는 config 파일이 없어도 코드만 몇 개 추가해주면 되지만, sweep을 할 때 중요하게 사용된다. sweep을 사용하면 일일이 값을 바꿔가며 학습해주지 않아도 hyperparameter를 최적화해줄 수 있다.
sweep 관련 내용은 추후에 따로 다루어볼 것이다.
Config 파일 내용의 예시는 다음과 같다.
config = {
'epochs': 5,
'classes': 10,
'batch_size': 32,
'kernels': [16, 32],
'weight_decay': 0.00005,
'learning_rate': 1e-4
'dataset': 'ImageNet',
'architecture': 'ResNet',
'seed': 42
}
추가할 코드
간단히 몇 줄의 코드 정도는 추가해주어야 한다. Tensorboard보다는 훨씬 간단하다.
training 코드 중간에 몇 가지 코드를 추가해준다. 추가할 세 가지 주요 코드와 자주 사용하는 arguments는 아래와 같다.
- wandb.init() : 해당하는 wandb 계정, 프로젝트와 연결 후 initialize해준다.
- wandb.watch() : gradient, topology 등과 관련된 정보를 visualize해준다.
- argument 중 주요 3가지만 설명하자면, 예시에서는 딥러닝 모델, loss function, log를 인수로 준다. 특히 log에 'all'을 주면 gradient, parameter 등의 값을 visualize할 수 있다.
- wandb.log(project='[위에서 생성한 프로젝트명]', entity='[wandb 계정 이름]') : 내가 원하는 값을 visualize해준다.
- log를 진행할 data를 dictionary 형태({"str": any_value})로 준다.
- 아래 예시에서와 같이 'epoch', 'val_metric'이라는 값을 visualize했다. (복잡한 모델을 구현한 코드라 loss값이 아닌 실험을 위한 별도의 metric을 출력했다.)
- wandb.fisnish()
어떤 모델을 학습하는 코드를 예시로 살펴보자. wandb.init, wandb.watch, wandb.log 코드의 위치를 참고하자.
import torch
...
import wandb #
def model_train(model, ...):
wandb.init(project='[생성한 프로젝트 이름]',
config={
"learning_rate": lr,
"batch_size": batchSize,
"architecture": model,
"dataset": dataset_name,
"epochs": num_epoch
})
...
# loss function
criterion = torch.nn...
wandb.watch(model, criterion, log='all')
...
for iter in enumerate(train_dataloader):
model.train()
iter += 1
epoch = iter // iters_per_epoch
...
loss = ...
optimizer.zero_grad()
loss.backward()
optimizer.step()
if iter % iters_per_epoch == 0:
val_metric = ...
wandb.log({'Epoch': epoch, 'metric':val_metric })
...
wandb.finish()
...
학습을 진행하면 다음과 같이 학습 도중에도 visualization을 해볼 수 있다.
wandb.watch()와 wandb.log()에 대한 자세한 설명은 아래를 참고하자.
최근댓글