메인 콘텐츠로 건너뛰기
Colab에서 실행해 보기 W&B를 사용해 머신러닝 실험을 추적하고, 데이터셋 버전을 관리하며, 프로젝트에서 협업하세요.
W&B를 사용할 때의 이점
W&B Sweeps를 사용해 하이퍼파라미터 최적화를 자동화하고, 대화형 대시보드로 다양한 모델 가능성을 탐색하세요:
TensorFlow 하이퍼파라미터 스윕 결과

Sweep을 사용하는 이유

  • 간편한 설정: 몇 줄의 코드만으로 W&B Sweep을 실행할 수 있습니다.
  • 투명성: 프로젝트에서 사용된 모든 알고리즘을 명시하며, 코드는 오픈 소스입니다.
  • 강력함: Sweep은 풍부한 커스터마이징 옵션을 제공하며, 여러 대의 머신이나 노트북에서도 손쉽게 실행할 수 있습니다.
자세한 내용은 Sweeps 개요를 참조하세요.

이 노트북에서 다루는 내용

  • TensorFlow에서 W&B Sweep과 커스텀 학습 루프로 시작하는 단계별 절차
  • 이미지 분류 작업에서 최적의 하이퍼파라미터를 찾는 방법
참고: Step 으로 시작하는 섹션에는 하이퍼파라미터 스윕을 수행하는 데 필요한 코드가 포함되어 있습니다. 나머지 섹션에서는 간단한 예제 환경을 설정합니다.

설치, 임포트 및 로그인

W&B 설치

pip install wandb

W&B를 불러오고 로그인하기

import tqdm
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import cifar10

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import wandb
from wandb.integration.keras import WandbMetricsLogger

wandb.login()
W&B를 처음 사용하거나 로그인하지 않은 경우, wandb.login()을 실행하면 표시되는 링크는 회원 가입/로그인 페이지로 연결됩니다.

데이터셋 준비

# 학습 데이터셋 준비
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

x_train = x_train / 255.0
x_test = x_test / 255.0
x_train = np.reshape(x_train, (-1, 784))
x_test = np.reshape(x_test, (-1, 784))

MLP 분류기 만들기

def 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

훈련 루프 작성하기

def train(
    train_dataset,
    val_dataset,
    model,
    optimizer,
    loss_fn,
    train_acc_metric,
    val_acc_metric,
    epochs=10,
    log_step=200,
    val_log_step=50,
):
    run = wandb.init(
        project="sweeps-tensorflow",
        job_type="train",
        config={
            "epochs": epochs,
            "log_step": log_step,
            "val_log_step": val_log_step,
            "architecture_name": "MLP",
            "dataset_name": "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 tqdm.tqdm(
            enumerate(train_dataset), total=len(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_states()
        val_acc_metric.reset_states()

        # 3. 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()

스윕 구성하기

스윕을 구성하는 단계:
  • 최적화할 하이퍼파라미터를 정의합니다.
  • 최적화 방법으로 random, grid, 또는 bayes를 선택합니다.
  • bayes에 대해 val_loss 최소화와 같은 목표와 메트릭을 설정합니다.
  • 성능이 낮은 실행을 조기에 종료하기 위해 hyperband를 사용합니다.
자세한 내용은 스윕 구성 가이드를 참고하세요.
sweep_config = {
    "method": "random",
    "metric": {"name": "val_loss", "goal": "minimize"},
    "early_terminate": {"type": "hyperband", "min_iter": 5},
    "parameters": {
        "batch_size": {"values": [32, 64, 128, 256]},
        "learning_rate": {"values": [0.01, 0.005, 0.001, 0.0005, 0.0001]},
    },
}

학습 루프 래핑하기

sweep_train와 같은 함수를 하나 만들고, train을 호출하기 전에 run.config()를 사용해 하이퍼파라미터를 설정합니다.
def sweep_train(config_defaults=None):
    # 기본값 설정
    config_defaults = {"batch_size": 64, "learning_rate": 0.01}
    # 샘플 프로젝트 이름으로 wandb 초기화
    run = wandb.init(config=config_defaults)  # Sweep에서 덮어씌워짐

    # 필요한 경우 구성에 다른 하이퍼파라미터 지정
    run.config.epochs = 2
    run.config.log_step = 20
    run.config.val_log_step = 50
    run.config.architecture_name = "MLP"
    run.config.dataset_name = "MNIST"

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

    val_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
    val_dataset = val_dataset.batch(run.config.batch_size).prefetch(
        buffer_size=tf.data.AUTOTUNE
    )

    # 모델 초기화
    model = Model()

    # 모델 학습을 위한 옵티마이저 인스턴스화
    optimizer = keras.optimizers.SGD(learning_rate=run.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,
        loss_fn,
        train_acc_metric,
        val_acc_metric,
        epochs=run.config.epochs,
        log_step=run.config.log_step,
        val_log_step=run.config.val_log_step,
    )
    run.finish()

스위프 및 실행용 개인 디지털 비서 초기화

sweep_id = wandb.sweep(sweep_config, project="sweeps-tensorflow")
count 매개변수로 실행 개수를 제한합니다. 빠른 실행을 위해 값을 10으로 설정하고, 필요에 따라 늘리세요.
wandb.agent(sweep_id, function=sweep_train, count=10)

결과 시각화

위에 있는 Sweep URL 링크를 클릭해 실시간 결과를 확인하세요. Gallery에서 W&B로 추적하고 시각화한 프로젝트를 살펴보세요.

모범 사례

  1. Project: 여러 실행을 하나의 프로젝트에 로그해서 서로 비교합니다. wandb.init(project="project-name")
  2. Groups: 다중 프로세스나 교차 검증 폴드인 경우, 각 프로세스를 하나의 실행으로 로그하고 이를 그룹으로 묶습니다. wandb.init(group='experiment-1')
  3. Tags: 태그를 사용해 베이스라인 또는 프로덕션 모델을 추적합니다.
  4. Notes: 실행 간 변경 사항을 추적할 수 있도록 테이블에 노트를 남깁니다.
  5. Reports: 진행 상황을 정리하고, 동료와 공유하며, ML 프로젝트 대시보드와 스냅샷을 만들 때 Report를 활용합니다.

고급 설정

  1. 환경 변수: 관리형 클러스터에서 학습할 때 사용할 API key를 설정합니다.
  2. 오프라인 모드
  3. 온프레미스: 자체 인프라 내의 프라이빗 클라우드 또는 망 분리 서버에 W&B를 설치합니다. 로컬 설치는 학계 및 엔터프라이즈 팀 모두에 적합합니다.