메인 콘텐츠로 건너뛰기
이 가이드는 하이퍼파라미터 탐색 최적화를 위해 Python 학습 스크립트 또는 노트북에 W&B를 통합하는 방법에 대한 권장 사항을 제공합니다.

기존 학습 스크립트

아래와 같은 모델을 학습하는 Python 스크립트가 있다고 가정해 보겠습니다. 목표는 검증 정확도(val_acc)를 최대화하는 하이퍼파라미터를 찾는 것입니다. Python 스크립트에서는 train_one_epochevaluate_one_epoch 두 개의 함수를 정의합니다. train_one_epoch 함수는 한 에포크 동안의 학습을 시뮬레이션하고, 학습 정확도와 손실을 반환합니다. evaluate_one_epoch 함수는 검증 데이터셋에서의 모델 평가를 시뮬레이션하고, 검증 정확도와 손실을 반환합니다. 학습률(lr), 배치 크기(batch_size), 에포크 수(epochs)와 같은 하이퍼파라미터 값을 포함하는 설정용 딕셔너리(config)를 정의합니다. 이 설정 딕셔너리의 값들이 학습 과정을 제어합니다. 다음으로 일반적인 학습 루프를 모방한 main 함수를 정의합니다. 각 에포크마다 학습 및 검증 데이터셋에 대해 정확도와 손실이 계산됩니다.
이 코드는 예시용 학습 스크립트입니다. 실제로 모델을 학습하지 않고, 무작위 정확도와 손실 값을 생성하여 학습 과정을 시뮬레이션합니다. 이 코드의 목적은 학습 스크립트에 W&B를 통합하는 방법을 보여주는 것입니다.
import random
import numpy as np

def train_one_epoch(epoch, lr, batch_size):
    acc = 0.25 + ((epoch / 30) + (random.random() / 10))
    loss = 0.2 + (1 - ((epoch - 1) / 10 + random.random() / 5))
    return acc, loss

def evaluate_one_epoch(epoch):
    acc = 0.1 + ((epoch / 20) + (random.random() / 10))
    loss = 0.25 + (1 - ((epoch - 1) / 10 + random.random() / 6))
    return acc, loss

# 하이퍼파라미터 값을 담은 config 변수
config = {"lr": 0.0001, "batch_size": 16, "epochs": 5}

def main():
    lr = config["lr"]
    batch_size = config["batch_size"]
    epochs = config["epochs"]

    for epoch in np.arange(1, epochs):
        train_acc, train_loss = train_one_epoch(epoch, lr, batch_size)
        val_acc, val_loss = evaluate_one_epoch(epoch)

        print("epoch: ", epoch)
        print("training accuracy:", train_acc, "training loss:", train_loss)
        print("validation accuracy:", val_acc, "validation loss:", val_loss)

if __name__ == "__main__":
    main()
다음 섹션에서는 Python 스크립트에 W&B를 추가하여 학습 중 하이퍼파라미터와 메트릭을 추적합니다. 검증 정확도(val_acc)를 최대화하는 최적의 하이퍼파라미터를 찾기 위해 W&B를 사용할 것입니다.

학습 스크립트에 W&B 추가하기

학습 스크립트에 W&B를 포함하도록 업데이트하세요. Python 스크립트나 노트북에서 W&B를 통합하는 방법은 스윕을 관리하는 방식에 따라 달라집니다. W&B Python SDK를 사용해 스윕을 시작하고 중지하며 관리하려면 Python script or notebook 탭의 지침을 따르세요. 대신 W&B CLI를 사용하려면 CLI 탭의 지침을 따르세요.
스윕 구성이 포함된 YAML 구성 파일을 만드십시오. 이 구성 파일에는 스윕이 탐색할 하이퍼파라미터가 포함됩니다. 다음 예시에서는 각 스윕에서 배치 크기(batch_size), 에폭(epochs), 학습률(lr) 하이퍼파라미터를 서로 다른 값으로 변경합니다.
# config.yaml
program: train.py
method: random
name: sweep
metric:
  goal: maximize
  name: val_acc
parameters:
  batch_size:
    values: [16, 32, 64]
  lr:
    min: 0.0001
    max: 0.1
  epochs:
    values: [5, 10, 15]
W&B Sweep 설정을 생성하는 방법에 대한 자세한 내용은 Sweep 설정 정의를 참고하세요.YAML 파일에서 program 키에는 Python 스크립트의 이름을 지정해야 합니다.그 다음, 코드 예제에 다음 내용을 추가합니다:
  1. W&B Python SDK(wandb)와 PyYAML(yaml)을 import합니다. PyYAML은 YAML 설정 파일을 읽는 데 사용됩니다.
  2. 설정 파일을 읽습니다.
  3. wandb.init()를 사용해 백그라운드 프로세스를 시작하여 데이터를 W&B 실행으로 동기화하고 기록합니다. config 객체를 config 매개변수에 전달합니다.
  4. 하드코딩된 값 대신 wandb.Run.config에서 하이퍼파라미터 값을 정의합니다.
  5. wandb.Run.log()를 사용해 최적화하려는 메트릭을 기록합니다. 설정에서 정의된 메트릭을 반드시 기록해야 합니다. 설정 딕셔너리(이 예시에서는 sweep_configuration) 안에서 val_acc 값을 최대화하도록 Sweep을 정의합니다.
import wandb
import yaml
import random
import numpy as np


def train_one_epoch(epoch, lr, batch_size):
    acc = 0.25 + ((epoch / 30) + (random.random() / 10))
    loss = 0.2 + (1 - ((epoch - 1) / 10 + random.random() / 5))
    return acc, loss


def evaluate_one_epoch(epoch):
    acc = 0.1 + ((epoch / 20) + (random.random() / 10))
    loss = 0.25 + (1 - ((epoch - 1) / 10 + random.random() / 6))
    return acc, loss


def main():
    # 기본 하이퍼파라미터를 설정합니다
    with open("./config.yaml") as file:
        config = yaml.load(file, Loader=yaml.FullLoader)

    with wandb.init(config=config) as run:
        for epoch in np.arange(1, run.config['epochs']):
            train_acc, train_loss = train_one_epoch(epoch, run.config['lr'], run.config['batch_size'])
            val_acc, val_loss = evaluate_one_epoch(epoch)
            run.log(
                {
                    "epoch": epoch,
                    "train_acc": train_acc,
                    "train_loss": train_loss,
                    "val_acc": val_acc,
                    "val_loss": val_loss,
                }
            )

# main 함수를 호출합니다.
main()
CLI에서 sweep 에이전트가 시도할 실행의 최대 개수를 설정하세요. 이 단계는 선택 사항입니다. 이 예제에서는 최대 개수를 5로 설정합니다.
NUM=5
다음으로 wandb sweep 명령을 사용해 스윕을 초기화합니다. YAML 파일 이름을 지정하고, 필요하다면 --project 플래그에 사용할 프로젝트 이름도 함께 지정합니다:
wandb sweep --project sweep-demo-cli config.yaml
이 명령은 sweep ID를 반환합니다. sweep을 초기화하는 방법에 대한 자세한 내용은 sweep 초기화를 참고하세요.sweep ID를 복사한 뒤, 아래 코드 스니펫에서 sweepID를 해당 값으로 바꿔 wandb agent 명령으로 sweep 작업을 시작하세요:
wandb agent --count $NUM your-entity/sweep-demo-cli/sweepID
자세한 내용은 스윕 작업 시작하기를 참조하세요.
스윕에서 W&B로 메트릭 로깅하기스윕 구성에서 정의하고 최적화하려는 메트릭은 스윕 구성과 wandb.Run.log() 모두에서 로깅해야 합니다. 예를 들어, 스윕 구성에서 최적화할 메트릭을 val_acc로 정의했다면, val_acc를 W&B에도 반드시 로깅해야 합니다. 메트릭을 로깅하지 않으면 W&B는 무엇을 최적화해야 하는지 알 수 없습니다.
with wandb.init() as run:
    val_loss, val_acc = train()
    run.log(
        {
            "val_loss": val_loss,
            "val_acc": val_acc
            }
        )
다음은 W&B로 메트릭을 잘못 로깅한 예시입니다. 스윕 구성에서 최적화 대상으로 사용하는 메트릭은 val_acc이지만, 코드에서는 val_accvalidation 키 아래에 있는 중첩된 딕셔너리 안에 로깅하고 있습니다. 메트릭은 중첩된 딕셔너리 안이 아니라 최상위에 직접 로깅해야 합니다.
with wandb.init() as run:
    val_loss, val_acc = train()
    run.log(
        {
            "validation": {
                "val_loss": val_loss, 
                "val_acc": val_acc
                }
            }
        )