학습 그래프, Metric, 학습 결과 시각화 지원하는 Tool로써, PyTorch와도 연동 가능한 DL 시각화의 핵심 도구이다.
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('{저장할 파일 이름}')
# 파일을 입력하지 않을 경우 Default dir 이름은 'runs'이다
writer.add_scalar('{그룹/변수명}', 변수, iter)writer.add_scalars('{그룹/변수명}', 변수dict, iter)writer.add_image('{그룹/변수명}', {Tensor or ndArray}, iter)writer.add_text('{그룹/변수명}', {"Text"}, iter)writer.add_historgram('{그룹/변수명}', {ndArray}, iter)writer.add_hparams({hparam_dict}, {metric_dict})tensorboard --logdir {Tensorboard Data를 저장한 파일 이름} --port=XXX
# port : Optional. Default로 6006으로 설정된다
# 방법 1 : 내가 Tensorboard를 CLI나 Visaul Studio Code에서 수행시켰다.
tensorboard --logdir {Tensorboard Data를 저장한 파일 이름} --port=XXX
localhost:[설정한 Port]
# 방법 2 : Jupyter나 Colab에서 바로 화면을 열고 싶다
%load_ext tensorboard // tensorboard extension을 Load함
%tensorboard --logdir {Tensorboard Data를 저장한 파일 이름} --port=XXX
만약 이전에 Tensorboard를 수행한 이후, 종료하지 않고 다른 이름을 가진 저장 데이터에 대한 그래프를 그릴 때, 이전에 그렸던 데이터도 동시에 출력되게 된다
예를 들어, train1, train2를 그린 이후 n1, n2를 새로 그리고 싶을 때, Tensorboard를 Reload시키는 것이 아닌 단순히 Load만 수행시킨다면 해당 Tensorboard는 train1, train2, n1, n2에 대해 모두 그래프를 그린다.
또한, 똑같은 Directory에 여러 가지의 Tensorboard 데이터를 저장하면, tensorboard를 Reload 시킨 후 추가된 데이터만 표시하는 것이 아닌, 저장된 모든 데이터에 대해 그래프를 그린다.
예를 들어, train1, train2를 그리고 Tensorboard를 종료시킨다. 이후 n1, n2에 대한 Tensorboard 데이터를 새로 저장하고 그래프를 그리면 train1, train2, n1, n2에 대한 그래프가 모두 출력된다
Model에 따라 당연히 개별의 그래프를 가져야 하기 때문에, 항상 "다른 디렉토리에" Tensorboard 데이터를 저장하고, 혹시 모르니 Tensorboard도 Reload시키는 방법을 활용하자
logs="logs"
writer = SummaryWriter(logs)
for n_iter in range(10):
s1 = np.random.random()
s2 = np.random.random()
writer.add_scalar('Loss/train1', s1, n_iter)
writer.add_scalar('Loss/train2', s2, n_iter)
writer.flush()

logs = "logs"
writer = SummaryWriter(logs)
for n_iter in range(10):
s1 = np.random.random()
s2 = np.random.random()
dict = {'s1':s1, 's2':s2} // 항상 Dict Type으로 저장
writer.add_scalars('Loss/train', dict, n_iter)
writer.flush()
"""
아래 그래프에서 파란색은 s1 data, 빨간색은 s2 data를 의미한다
한 개 공간에 2개 data에 대한 그래프를 모두 그려줌
참고로 왼쪽 아래 Runs에 존재하는 체크 표시를 풀어줌으로써
1개 data만 확인하는 것도 가능하다
"""

import torch
import math
"""
Param 저장은 많이 쓸 것 같아 아예 모델을 간단히 구축하기로 했다
criterion, Optimizer 등은 무엇을 의미하는지 몰라도
그냥 모델을 만들기 위한 용도라고만 지금은 알아둬도 된다
"""
x = torch.linspace(-math.pi,math.pi,2000)
y = torch.sin(x)
p = torch.tensor([1,2,3])
xx = x.unsqueeze(-1).pow(p)
model = torch.nn.Sequential(torch.nn.Linear(3,1), torch.nn.Flatten(0,1))
criterion = torch.nn.MSELoss(reduction='sum')
learning_rate = 1e-3
optimizer = torch.optim.RMSprop(model.parameters(), lr=learning_rate)
for t in range(10):
optimizer.zero_grad()
y_pred = model(xx)
loss = criterion(y_pred,y)
loss.backward()
optimizer.step()
for name, param in model.named_parameters():
writer.add_histogram(name, param.data.numpy(), t)
# Parameter를 저장하는 공간
# t(Epoch)이 진행될 때마다 Parameter Name 아래에 Parameter 값들을 저장시킴
# 이 때 중요한 점은, 가운데 데이터를 numpy 객체로 만들어야 한다는 점이다
writer.close()


Weight & Biases가 공식 명칭으로, 협업, Code Versioning, 실험 결과 기록 등을 제공한다.
MLOps의 대표적인 툴로 유명해지고 있는 Tool이다.
1. Weight & Biases 사이트에 로그인후 API Key 확인
2. pip install wandb -q
3. config에 Dict type으로 설정값을 저장해 놓고, wandb 객체에 적용
config = {"epohcs":EPOCHS, "batch_size":BATCH_SIZE,
"learning_rate":LEARNING_RATE}
wandb.init(project="my_test_project",config=config)
4. wandb.log({Data})를 통해 wandb에 데이터 저장
for e in range(1, EPOCHS+1):
optimizer.zero_grad()
y_pred = model(xx)
loss = criterion(y_pred,y)
train_acc = sum((y_pred-y)**2)
# train_acc를 이렇게 구하지는 않지만,
# 결과값을 보고 싶은 것이기 때문에 그냥 이렇게 계산했다
loss.backward()
optimizer.step()
wandb.log({'Accuracy':train_acc,'loss':loss})
# loss와 train_acc는 Scalar값들이고,
# 한 개의 공간에 모두 나타내고 싶으므로 add_scalars()의 형태를 따름
# 즉, Dict type Data로 Parameter를 넘겨줌
6. WandB 사이트에 들어가 내가 설정한 Project명을 통해 결과 그래프를 볼 수 있음
