메인 콘텐츠로 건너뛰기
Colab에서 실행해 보기

이 노트북에서 다루는 내용

  • 실험 추적을 위해 TensorFlow 파이프라인에 W&B를 쉽게 통합하는 방법
  • keras.metrics로 메트릭 계산하기
  • 커스텀 학습 루프에서 wandb.log를 사용해 해당 메트릭을 로깅하기
dashboard
참고: Step으로 시작하는 섹션만 따라 하면 기존 코드에 W&B를 통합할 수 있습니다. 나머지는 표준 MNIST 예제일 뿐입니다.
import os

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import cifar10

설치, 임포트, 로그인

W&B 설치

%%capture
!pip install wandb

W&B 가져오기 및 로그인

import wandb
from wandb.integration.keras import WandbMetricsLogger

wandb.login()
참고: W&B를 처음 사용하거나 아직 로그인하지 않았다면, wandb.login()을 실행한 후 표시되는 링크가 회원가입/로그인 페이지로 이동합니다. 회원가입은 클릭 한 번으로 간단히 할 수 있습니다.

데이터셋 준비

# 학습 데이터셋 준비
BATCH_SIZE = 64
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = np.reshape(x_train, (-1, 784))
x_test = np.reshape(x_test, (-1, 784))

# tf.data를 사용하여 입력 파이프라인 구성
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(BATCH_SIZE)

val_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
val_dataset = val_dataset.batch(BATCH_SIZE)

모델과 학습 루프를 정의하기

def make_model():
    inputs = keras.Input(shape=(784,), name="digits")
    x1 = keras.layers.Dense(64, activation="relu")(inputs)
    x2 = keras.layers.Dense(64, activation="relu")(x1)
    outputs = keras.layers.Dense(10, name="predictions")(x2)

    return keras.Model(inputs=inputs, outputs=outputs)
def train_step(x, y, model, optimizer, loss_fn, train_acc_metric):
    with tf.GradientTape() as tape:
        logits = model(x, training=True)
        loss_value = loss_fn(y, logits)

    grads = tape.gradient(loss_value, model.trainable_weights)
    optimizer.apply_gradients(zip(grads, model.trainable_weights))

    train_acc_metric.update_state(y, logits)

    return loss_value
def test_step(x, y, model, loss_fn, val_acc_metric):
    val_logits = model(x, training=False)
    loss_value = loss_fn(y, val_logits)
    val_acc_metric.update_state(y, val_logits)

    return loss_value

학습 루프에 wandb.log 추가하기

def train(
    train_dataset,
    val_dataset,
    model,
    optimizer,
    train_acc_metric,
    val_acc_metric,
    epochs=10,
    log_step=200,
    val_log_step=50,
):
    run = wandb.init(
        project="my-tf-integration",
        config={
            "epochs": epochs,
            "log_step": log_step,
            "val_log_step": val_log_step,
            "architecture": "MLP",
            "dataset": "MNIST",
        },
    )
    for epoch in range(epochs):
        print("\nStart of epoch %d" % (epoch,))

        train_loss = []
        val_loss = []

        # 데이터셋의 배치를 순회합니다
        for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):
            loss_value = train_step(
                x_batch_train,
                y_batch_train,
                model,
                optimizer,
                loss_fn,
                train_acc_metric,
            )
            train_loss.append(float(loss_value))

        # 각 에포크 끝에 검증 루프를 실행합니다
        for step, (x_batch_val, y_batch_val) in enumerate(val_dataset):
            val_loss_value = test_step(
                x_batch_val, y_batch_val, model, loss_fn, val_acc_metric
            )
            val_loss.append(float(val_loss_value))

        # 각 에포크 끝에 메트릭을 출력합니다
        train_acc = train_acc_metric.result()
        print("Training acc over epoch: %.4f" % (float(train_acc),))

        val_acc = val_acc_metric.result()
        print("Validation acc: %.4f" % (float(val_acc),))

        # 각 에포크 끝에 메트릭을 초기화합니다
        train_acc_metric.reset_state()
        val_acc_metric.reset_state()

        # run.log()를 사용하여 메트릭을 기록합니다
        run.log(
            {
                "epochs": epoch,
                "loss": np.mean(train_loss),
                "acc": float(train_acc),
                "val_loss": np.mean(val_loss),
                "val_acc": float(val_acc),
            }
        )
    run.finish()

훈련 실행하기

wandb.init()을 호출해 실행 시작하기

이렇게 하면 W&B가 사용자가 실험을 시작했다는 것을 인지하고, 해당 실험에 고유한 ID와 대시보드를 부여할 수 있습니다. 공식 문서를 확인하세요
# 프로젝트 이름과 선택적으로 설정을 지정하여 wandb를 초기화합니다.
# config 값을 변경하며 wandb 대시보드에서 결과를 확인해 보세요.
config = {
    "learning_rate": 0.001,
    "epochs": 10,
    "batch_size": 64,
    "log_step": 200,
    "val_log_step": 50,
    "architecture": "CNN",
    "dataset": "CIFAR-10",
}

run = wandb.init(project='my-tf-integration', config=config)
config = run.config

# 모델을 초기화합니다.
model = make_model()

# 모델 학습을 위한 옵티마이저를 생성합니다.
optimizer = keras.optimizers.SGD(learning_rate=config.learning_rate)
# 손실 함수를 생성합니다.
loss_fn = keras.losses.SparseCategoricalCrossentropy(from_logits=True)

# 메트릭을 준비합니다.
train_acc_metric = keras.metrics.SparseCategoricalAccuracy()
val_acc_metric = keras.metrics.SparseCategoricalAccuracy()

train(
    train_dataset,
    val_dataset, 
    model,
    optimizer,
    train_acc_metric,
    val_acc_metric,
    epochs=config.epochs, 
    log_step=config.log_step, 
    val_log_step=config.val_log_step,
)

run.finish()  # Jupyter/Colab에서 실행 완료를 알립니다!

결과 시각화

위에 있는 실행 페이지 링크를 클릭해 실시간 결과를 확인하세요.

Sweep 101

W&B Sweeps을 사용해 하이퍼파라미터 최적화를 자동화하고 가능한 모델 공간을 탐색하세요. W&B Sweeps을 사용한 하이퍼파라미터 최적화를 보여주는 Colab 노트북을 확인하세요.

W&B Sweeps 사용의 장점

  • 빠른 설정: 몇 줄의 코드만으로 W&B Sweeps를 실행할 수 있습니다.
  • 투명함: W&B에서 사용하는 모든 알고리즘을 명시하며, 코드는 오픈 소스입니다.
  • 강력함: W&B Sweeps는 완전히 커스터마이즈하고 구성할 수 있습니다. 수십 대의 머신에 걸쳐 sweep을 실행할 수 있으며, 노트북에서 sweep을 시작하는 것만큼이나 간단합니다.
Sweep 결과
Fully Connected → 예시 갤러리에서 W&B로 추적하고 시각화한 프로젝트 예시를 살펴보세요.

모범 사례

  1. Projects: 여러 실행을 하나의 프로젝트에 로깅해 비교하세요. wandb.init(project="project-name")
  2. Groups: 여러 프로세스나 교차 검증 폴드마다 각 프로세스를 별도의 실행으로 로깅하고, 하나의 그룹으로 묶으세요. wandb.init(group="experiment-1")
  3. Tags: 현재 베이스라인이나 프로덕션 모델을 추적할 수 있도록 태그를 추가하세요.
  4. Notes: 실행 간 변경 사항을 추적할 수 있도록 테이블에 메모를 작성하세요.
  5. Reports: 진행 상황을 동료와 빠르게 공유할 수 있도록 메모를 남기고, ML 프로젝트용 대시보드와 스냅샷을 만드세요.

고급 설정

  1. Environment variables: 관리형 클러스터에서 학습을 실행할 수 있도록 환경 변수에 API key를 설정하세요.
  2. Offline mode
  3. On-prem: 자체 인프라의 프라이빗 클라우드 또는 에어갭(air-gapped) 서버에 W&B를 설치하세요. 학계 사용자부터 엔터프라이즈 팀까지 모두를 위한 로컬 설치 옵션을 제공합니다.
  4. Artifacts: 모델을 학습하는 동안 파이프라인 단계도 자동으로 감지되도록 하여, 모델과 데이터셋을 효율적으로 추적하고 버전 관리하세요.