오늘은 wandb에 대해서 작성해보고자 한다.
Wandb(Weight & Bias)는 딥러닝 실험 과정들을 쉽게 Tracking 하고 시각화할 수 있게 도와주는 tool이다.
아래와 같이 다양한 framework와 기능들을 제공한다.
아래는 좀 주저리주저리 써놓은 것이고 간단한 코드 사용법은 따로 작성하여 첨부하도록 하겠다
사실 wandb 사이트에서 자세한 설명도 제공하기 때문에 내가 실용적으로 사용하는 기능들에 대해서만 소개해보도록 할 것이다.
1. wandb.init()
우선 wandb에 2개의 큰 틀이 `project`와 `run`이다. 말 그대로 특정 프로젝트별로 나눌 수 있으며, run은 해당 프로젝트 안에서 기록하는 하나하나를 의미한다.
wandb를 이용하고자 한다면 아래 코드를 이용하여 프로젝트를 생성하고 init 하면 된다.
맨 처음 wandb를 init 하게 되면 아마 로그인을 하라고 뜰 텐데 요구하는 대로 사이트에서 인증코드를 입력하여 붙여 넣어주면 다음부터는 알아서 로그인된다.(인증코드를 복붙 해도 안 보이는 게 정상)
import wandb
wandb.init(project="project name")
위와 같이 init안에 프로젝트 명을 작성해주면 웹에서도 해당 프로젝트가 생성된 것을 확인할 수 있다.
추가적으로 init안에 추가적인 파라미터들도 존재하는데, 너무 많기 때문에 필수적이고 중요한 것에 대해서만 알아보자.
전체 init에 대한 링크는 docs <-여기를 클릭하면 된다.
1-1. entity
wandb에는 개인, 팀 으로 프로젝트를 생성할 수 있는데 개인은 100GB 무료 제공이고, 팀은 아마 유료로 알고 있다.(처음 생성 시 무료 N시간 제공)
개인과 팀 두개를 다 가지고 있을 때 그냥 `init`을 사용하면 자기가 사용하던 것으로 자동으로 연결되기 때문에 이 `entity`파라미터를 이용하여 팀으로 할지 개인으로 할지 연결해줘야 한다. 팀명 혹은 유저명을 이용하여 연결하면 된다고 한다.
`wandb.init(project='project name', entity='entity name')`
1-2. wandb.config
config는 해당 run에 대한 세팅값을 작성해 놓는 칸이다. 보통 config에 파라미터들을 지정해 놓은 다음 각 모델을 학습할 기록할 때도 해당 config의 값을 가져와서 사용하는 방식을 주로 쓴다. config는 딕셔너리형태로 작성해야 한다.
CONFIG={
"model":model_s,
"learning_rate": 1e-3,
"epochs": 100,
"image_size":image_s,
"aug_img":AUG_BOOL,
"batch_size":batch_s,
}
wandb.init(project=PROJECT_NAME,config=CONFIG)
보통 이렇게 정의하고 아래와 같이 모델에 파라미터를 넣어 사용하는 방식을 주로 쓴다.
딕셔너리의 형태로만 구성하면 되고 원하는 이름으로 지정해 주면 된다.
w_config=wandb.config
w_config.lr
w_config.bathch_size
..
이렇게 init에 지정해 줘도 되고 추후에 `wandb.config. 변수명 = 값` 이런 식을 통해서 추가해 줄 수도 있고 한 번에 update 하기 위해서는 `wandb.cofig.update(딕셔너리)` 이런 식으로 하면 된다.
1-3. name
위에서 project와 run으로 구분된다고 했는데, 우선 하나의 run을 실행할 때마다 init을 해주고 마지막에 finish를 해주는데 해당 run의 이름을 지정해주지 않으면 랜덤으로 지정되어 헷갈린다.
따라서 이것도 `name` 파라미터를 이용하여 지정해 주면 아래와 같이 각 run별로 어떤 실험이었는지 알아볼 수 있다.
(따로 파라미터를 지정해주지 않고 추후에 웹에서 직접 바꿔줄 수도 있다.)
1-4. tag
tag도 마찬가지로 각 run별로 특징들을 tag 형식으로 간단하게 지정할 수 있는 방법이다.
tag는 리스트형식으로 만들어주면 되고 name과 동일하게 웹에서 추후에 바꿔줄 수 있다.
TAG=["batch=32",f"lr={w_config.lr}"]
1-4. id
wandb는 run마다 `wandb.init()`을 하고 `wandb.finish()`를 해야 한다고 했는데, finish 되어 종료된 run에 특정 로그나 파일을 추가하기 위해서는 웹에 들어가서 해당 run의 id를 확인하고 새로 `wandb.init()`을 할 때 name이 아닌 id를 확인한 id로 넣어주면 해당 run을 다시 불러올 수 있다. 저 맨뒤에 있는 `w5 qn60 tz`가 해당 run id이다.
2. wandb.log
`wandb.log`이다. 말 그대로 특정 로그들을 기록해 주는 것으로,
monitoring_value = {
'train_loss': train_loss, 'train_accuracy': train_accuracy, 'train_f1': train_f1,
'valid_loss': valid_loss, 'valid_accuracy': valid_accuracy, 'valid_f1': valid_f1,
}
wandb.log(monitoring_value, step=epoch)
위와 같이 로그명:로그 할 내용 이런 식으로 저장해 주고 log를 넣고 step도 지정해 줄 수 있다.
그렇게 되면 아래와 같이 각 그래프는 각 run을 의미하며, 방금 전에 log에 작성해 준 것들이 epoch별로 기록되어 그래프로 나타나는 것을 볼 수 있다.
3. wandb.Image()
다음으로 cv 프로젝트 등을 할 때 유용하게 사용되는 Image이다.
images=[]
images.append(wandb.Image(data[0], caption="Pred: {} Truth: {}".format(pred[0].item(), target[0])))
wandb.log({"Image": images})
위와 같이 비어있는 리스트에 wandb.Image를 이용하여 이미지를 추가할 수 있고 옵션으로 caption 등을 달 수도 있다.
이렇게 만들어진 리스트를 log로 찍어주면 아래와 같이 웹에서 이미지도 확인할 수 있다. 참고로 108개의 이미지가 최대이다.
4. model 저장
아래와 같이 해당 프로젝트에 모델을 저장하는 방법도 있다.
artifact = wandb.Artifact('model', type='model')
artifact.add_file(f"model/resnet50.pt")
wandb.log_artifact(artifact)
5. wandb.finish()
위에서도 계속 말했듯이 run이 끝날 때 finish()를 이용하여 정상적으로 해당 run을 끝내줘야 한다. 끝내지 않고 중단할 경우 다시 init을 할 때 자동으로 해당 run을 종료하고 시작한다. finish()를 해야 웹에 정상적으로 log들이 기록된다.
6. command
6-1. sync
폐쇄망같은 경우에서는 바로 wandb 사이트에 올릴 수 없지만 offline 기능을 이용해서 wandb 폴더에 저장해 두고, 나중에 이 폴더를 이용하여 온라인에 업로드할 수 있다.
한 번에 올리는 경우에는 아래 command를 이용하면 된다.
wandb sync -p {projcet} {options} {folder}
ex) wandb sync -p test --include-online run-*
7. 여담
특정 파라미터등을 변수로 설정해 두고 자동으로 돌아가게 해 두면 wandb에서 쉽게 확인할 수 있으며 깔끔하게 정리돼서 확인할 수도 있다.
아래는 위의 것들을 이용하여 적용한 내 프로젝트의 기록 예시이다.
https://wandb.ai/bae951753/Document%20 Image%20 Classification? workspace=user-bae951753
'알쓸신잡' 카테고리의 다른 글
연구실 안전교육 스킵 (0) | 2024.02.14 |
---|---|
리눅스 구글드라이브 파일 다운 (0) | 2024.02.09 |
Windows-Ollama 사용 (0) | 2023.12.27 |
Vscode ssh로 윈도우 서버 연결(데스크탑, 노트북) (3) | 2023.12.14 |
VSCODE 폰트 바꾸기 (0) | 2023.12.08 |