Track experiments
6 minute read
기계 학습 실험 추적, 모델 체크포인트, 팀과의 협업 등을 위해 W&B 를 사용하세요.
이 노트북에서는 간단한 PyTorch 모델을 사용하여 기계 학습 실험을 생성하고 추적합니다. 노트북이 끝나면 팀의 다른 구성원과 공유하고 사용자 정의할 수 있는 대화형 프로젝트 대시보드를 갖게 됩니다. 여기에서 대시보드 예제를 확인하세요.
전제 조건
W&B Python SDK를 설치하고 로그인합니다:
!pip install wandb -qU
# W&B 계정에 로그인하세요
import wandb
import random
import math
# wandb-core 사용, wandb의 새로운 백엔드를 위해 임시적으로 사용
wandb.require("core")
wandb.login()
W&B를 사용하여 기계 학습 실험을 시뮬레이션하고 추적합니다
기계 학습 실험을 생성, 추적 및 시각화합니다. 이렇게 하려면 다음을 수행하세요:
- W&B run을 초기화하고 추적하려는 하이퍼파라미터를 전달합니다.
- 트레이닝 루프 내에서 정확도 및 손실과 같은 메트릭을 기록합니다.
import random
import math
# 5개의 시뮬레이션된 실험을 시작합니다
total_runs = 5
for run in range(total_runs):
# 1️. 이 스크립트를 추적하기 위해 새 run을 시작합니다
wandb.init(
# 이 run이 기록될 프로젝트를 설정합니다
project="basic-intro",
# run 이름을 전달합니다 (그렇지 않으면 sunshine-lollypop-10처럼 무작위로 할당됩니다)
name=f"experiment_{run}",
# 하이퍼파라미터 및 run 메타데이터를 추적합니다
config={
"learning_rate": 0.02,
"architecture": "CNN",
"dataset": "CIFAR-100",
"epochs": 10,
})
# 이 간단한 블록은 메트릭을 기록하는 트레이닝 루프를 시뮬레이션합니다
epochs = 10
offset = random.random() / 5
for epoch in range(2, epochs):
acc = 1 - 2 ** -epoch - random.random() / epoch - offset
loss = 2 ** -epoch + random.random() / epoch + offset
# 2️. 스크립트에서 W&B로 메트릭을 기록합니다
wandb.log({"acc": acc, "loss": loss})
# run을 완료된 것으로 표시합니다
wandb.finish()
W&B 프로젝트에서 기계 학습이 어떻게 수행되었는지 확인합니다. 이전 셀에서 인쇄된 URL 링크를 복사하여 붙여넣습니다. URL은 그래프가 표시된 대시보드를 포함하는 W&B 프로젝트로 리디렉션됩니다.
다음 이미지는 대시보드가 어떻게 보이는지 보여줍니다:

이제 W&B를 유사 기계 학습 트레이닝 루프에 통합하는 방법을 알았으니 기본 PyTorch 신경망을 사용하여 기계 학습 실험을 추적해 보겠습니다. 다음 코드는 조직의 다른 팀과 공유할 수 있는 모델 체크포인트를 W&B에 업로드합니다.
Pytorch를 사용하여 기계 학습 실험 추적
다음 코드 셀은 간단한 MNIST 분류기를 정의하고 트레이닝합니다. 트레이닝하는 동안 W&B가 URL을 출력하는 것을 볼 수 있습니다. 프로젝트 페이지 링크를 클릭하여 결과가 W&B 프로젝트로 실시간 스트리밍되는 것을 확인하세요.
W&B run은 자동으로 메트릭, 시스템 정보, 하이퍼파라미터, 터미널 출력을 기록하고 모델 입력 및 출력이 있는 대화형 테이블이 표시됩니다.
PyTorch Dataloader 설정
다음 셀은 기계 학습 모델을 트레이닝하는 데 필요한 유용한 함수를 정의합니다. 함수 자체는 W&B에 고유하지 않으므로 여기서는 자세히 다루지 않습니다. forward 패스 및 backward 트레이닝 루프를 정의하는 방법, PyTorch DataLoaders를 사용하여 트레이닝을 위해 데이터를 로드하는 방법, torch.nn.Sequential
클래스를 사용하여 PyTorch 모델을 정의하는 방법에 대한 자세한 내용은 PyTorch 설명서를 참조하세요.
# @title
import torch, torchvision
import torch.nn as nn
from torchvision.datasets import MNIST
import torchvision.transforms as T
MNIST.mirrors = [
mirror for mirror in MNIST.mirrors if "http://yann.lecun.com/" not in mirror
]
device = "cuda:0" if torch.cuda.is_available() else "cpu"
def get_dataloader(is_train, batch_size, slice=5):
"트레이닝 데이터로더를 가져옵니다"
full_dataset = MNIST(
root=".", train=is_train, transform=T.ToTensor(), download=True
)
sub_dataset = torch.utils.data.Subset(
full_dataset, indices=range(0, len(full_dataset), slice)
)
loader = torch.utils.data.DataLoader(
dataset=sub_dataset,
batch_size=batch_size,
shuffle=True if is_train else False,
pin_memory=True,
num_workers=2,
)
return loader
def get_model(dropout):
"간단한 모델"
model = nn.Sequential(
nn.Flatten(),
nn.Linear(28 * 28, 256),
nn.BatchNorm1d(256),
nn.ReLU(),
nn.Dropout(dropout),
nn.Linear(256, 10),
).to(device)
return model
def validate_model(model, valid_dl, loss_func, log_images=False, batch_idx=0):
"유효성 검사 데이터셋에서 모델의 성능을 계산하고 wandb.Table을 기록합니다"
model.eval()
val_loss = 0.0
with torch.inference_mode():
correct = 0
for i, (images, labels) in enumerate(valid_dl):
images, labels = images.to(device), labels.to(device)
# Forward 패스 ➡
outputs = model(images)
val_loss += loss_func(outputs, labels) * labels.size(0)
# 정확도 계산 및 누적
_, predicted = torch.max(outputs.data, 1)
correct += (predicted == labels).sum().item()
# 항상 동일한 batch_idx로 대시보드에 이미지 한 배치를 기록합니다.
if i == batch_idx and log_images:
log_image_table(images, predicted, labels, outputs.softmax(dim=1))
return val_loss / len(valid_dl.dataset), correct / len(valid_dl.dataset)
예측값과 실제값을 비교하는 테이블 생성
다음 셀은 W&B에 고유하므로 살펴보겠습니다.
셀에서 log_image_table
이라는 함수를 정의합니다. 기술적으로 선택 사항이지만 이 함수는 W&B Table 오브젝트를 만듭니다. 테이블 오브젝트를 사용하여 각 이미지에 대해 모델이 예측한 내용을 보여주는 테이블을 만듭니다.
보다 구체적으로 말하면 각 행은 모델에 공급된 이미지와 예측값 및 실제값 (레이블)으로 구성됩니다.
def log_image_table(images, predicted, labels, probs):
"이미지, 레이블 및 예측이 포함된 wandb.Table을 기록합니다 (img, pred, target, scores)"
# 이미지, 레이블 및 예측을 기록할 wandb Table을 만듭니다.
table = wandb.Table(
columns=["image", "pred", "target"] + [f"score_{i}" for i in range(10)]
)
for img, pred, targ, prob in zip(
images.to("cpu"), predicted.to("cpu"), labels.to("cpu"), probs.to("cpu")
):
table.add_data(wandb.Image(img[0].numpy() * 255), pred, targ, *prob.numpy())
wandb.log({"predictions_table": table}, commit=False)
모델을 트레이닝하고 체크포인트를 업로드합니다
다음 코드는 모델 체크포인트를 트레이닝하고 프로젝트에 저장합니다. 일반적으로 모델 체크포인트를 사용하여 트레이닝 중에 모델이 수행된 방식을 평가합니다.
W&B를 사용하면 저장된 모델 및 모델 체크포인트를 팀 또는 조직의 다른 구성원과 쉽게 공유할 수 있습니다. 팀 외부의 구성원과 모델 및 모델 체크포인트를 공유하는 방법에 대한 자세한 내용은 W&B Registry를 참조하세요.
# 다양한 드롭아웃 비율을 시도하면서 3개의 실험을 시작합니다.
for _ in range(3):
# wandb run을 초기화합니다.
wandb.init(
project="pytorch-intro",
config={
"epochs": 5,
"batch_size": 128,
"lr": 1e-3,
"dropout": random.uniform(0.01, 0.80),
},
)
# 구성을 복사합니다.
config = wandb.config
# 데이터를 가져옵니다.
train_dl = get_dataloader(is_train=True, batch_size=config.batch_size)
valid_dl = get_dataloader(is_train=False, batch_size=2 * config.batch_size)
n_steps_per_epoch = math.ceil(len(train_dl.dataset) / config.batch_size)
# 간단한 MLP 모델
model = get_model(config.dropout)
# 손실 및 옵티마이저를 만듭니다.
loss_func = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=config.lr)
# 트레이닝
example_ct = 0
step_ct = 0
for epoch in range(config.epochs):
model.train()
for step, (images, labels) in enumerate(train_dl):
images, labels = images.to(device), labels.to(device)
outputs = model(images)
train_loss = loss_func(outputs, labels)
optimizer.zero_grad()
train_loss.backward()
optimizer.step()
example_ct += len(images)
metrics = {
"train/train_loss": train_loss,
"train/epoch": (step + 1 + (n_steps_per_epoch * epoch))
/ n_steps_per_epoch,
"train/example_ct": example_ct,
}
if step + 1 < n_steps_per_epoch:
# wandb에 트레이닝 메트릭을 기록합니다.
wandb.log(metrics)
step_ct += 1
val_loss, accuracy = validate_model(
model, valid_dl, loss_func, log_images=(epoch == (config.epochs - 1))
)
# wandb에 트레이닝 및 유효성 검사 메트릭을 기록합니다.
val_metrics = {"val/val_loss": val_loss, "val/val_accuracy": accuracy}
wandb.log({**metrics, **val_metrics})
# wandb에 모델 체크포인트를 저장합니다.
torch.save(model, "my_model.pt")
wandb.log_model(
"./my_model.pt",
"my_mnist_model",
aliases=[f"epoch-{epoch+1}_dropout-{round(wandb.config.dropout, 4)}"],
)
print(
f"Epoch: {epoch+1}, Train Loss: {train_loss:.3f}, Valid Loss: {val_loss:3f}, Accuracy: {accuracy:.2f}"
)
# 테스트 세트가 있는 경우 요약 메트릭으로 기록할 수 있는 방법입니다.
wandb.summary["test_accuracy"] = 0.8
# wandb run을 닫습니다.
wandb.finish()
이제 W&B를 사용하여 첫 번째 모델을 트레이닝했습니다. 위의 링크 중 하나를 클릭하여 메트릭을 확인하고 W&B App UI의 Artifacts 탭에서 저장된 모델 체크포인트를 확인하세요.
(선택 사항) W&B Alert 설정
Python 코드에서 Slack 또는 이메일로 알림을 보내도록 W&B Alerts를 만듭니다.
코드에서 트리거된 Slack 또는 이메일 알림을 처음 보내려면 다음 두 단계를 따르세요.
- W&B 사용자 설정에서 Alerts를 켭니다.
- 코드에
wandb.alert()
를 추가합니다. 예를 들어:
wandb.alert(title="Low accuracy", text=f"Accuracy is below the acceptable threshold")
다음 셀은 wandb.alert
를 사용하는 방법을 보여주는 최소한의 예제를 보여줍니다.
# wandb run을 시작합니다.
wandb.init(project="pytorch-intro")
# 모델 트레이닝 루프 시뮬레이션
acc_threshold = 0.3
for training_step in range(1000):
# 정확도에 대한 임의의 숫자를 생성합니다.
accuracy = round(random.random() + random.random(), 3)
print(f"Accuracy is: {accuracy}, {acc_threshold}")
# wandb에 정확도를 기록합니다.
wandb.log({"Accuracy": accuracy})
# 정확도가 임계값보다 낮으면 W&B Alert를 실행하고 run을 중지합니다.
if accuracy <= acc_threshold:
# wandb Alert를 보냅니다.
wandb.alert(
title="Low Accuracy",
text=f"Accuracy {accuracy} at step {training_step} is below the acceptable theshold, {acc_threshold}",
)
print("Alert triggered")
break
# run을 완료된 것으로 표시합니다 (Jupyter 노트북에서 유용합니다).
wandb.finish()
여기에서 W&B Alerts에 대한 전체 문서를 찾을 수 있습니다.
다음 단계
다음 튜토리얼에서는 W&B Sweeps를 사용하여 하이퍼파라미터 최적화를 수행하는 방법을 배웁니다. PyTorch를 사용하여 하이퍼파라미터 스윕
[i18n] feedback_title
[i18n] feedback_question
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.