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

원본 트레이닝 스크립트

아래와 같이 모델을 트레이닝하는 Python 스크립트가 있다고 가정해 보겠습니다. 목표는 검증 정확도(val_acc)를 최대화하는 하이퍼파라미터를 찾는 것입니다. Python 스크립트에서는 train_one_epochevaluate_one_epoch라는 두 개의 함수를 정의합니다. train_one_epoch 함수는 한 에포크 동안의 트레이닝을 시뮬레이션하고, 트레이닝 정확도와 손실을 반환합니다. evaluate_one_epoch 함수는 검증 데이터 세트에서 모델을 평가하는 과정을 시뮬레이션하고, 검증 정확도와 손실을 반환합니다. 학습률(lr), batch size(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 = {"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를 포함하세요. W&B를 Python 스크립트 또는 노트북에 어떻게 통합할지는 Sweeps를 관리하는 방식에 따라 달라집니다. W&B Python SDK를 사용해 Sweeps를 시작, 중지, 관리하려면 Python script or notebook 탭의 지침을 따르세요. 대신 W&B CLI를 사용하려면 CLI 탭의 지침을 따르세요.
sweep 설정이 포함된 YAML 설정 파일을 만드세요. 이 설정 파일에는 sweep에서 탐색할 하이퍼파라미터가 들어 있습니다. 다음 예시에서는 배치 크기(batch_size), 에포크(epochs), 그리고 학습률(lr) 하이퍼파라미터가 각 sweep 실행 중에 변경됩니다.
# 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)을 임포트합니다. PyYAML은 YAML 설정 파일을 읽는 데 사용됩니다.
  2. 설정 파일을 읽어옵니다.
  3. wandb.init()을 사용해 데이터를 동기화하고 로그하기 위한 백그라운드 프로세스를 W&B Run으로 시작합니다. 설정 객체를 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 agent가 시도할 최대 run 수를 설정합니다. 이는 선택 사항입니다. 이 예제에서는 최대 수를 5로 설정합니다.
NUM=5
다음으로, wandb sweep 명령을 사용해 sweep를 초기화합니다. YAML 파일 이름을 지정합니다. 선택적으로 프로젝트 플래그(--project)에 사용할 프로젝트 이름을 지정합니다:
wandb sweep --project sweep-demo-cli config.yaml
sweep ID가 반환됩니다. sweep를 초기화하는 방법에 대한 자세한 내용은 Initialize sweeps를 참조하세요.sweep 작업을 시작하려면 sweep ID를 복사한 다음 아래 코드 스니펫의 sweepID를 바꿔 wandb agent 명령어를 사용하세요:
wandb agent --count $NUM your-entity/sweep-demo-cli/sweepID
자세한 내용은 sweep 작업 시작하기를 참조하세요.
sweep에서 W&B에 메트릭 로깅하기sweep 설정과 wandb.Run.log()에서 모두 정의한, 그리고 최적화 대상으로 지정한 메트릭을 반드시 로깅해야 합니다. 예를 들어 sweep 설정에서 최적화할 메트릭을 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에 로깅하는 올바르지 않은 예입니다. sweep 설정에서 최적화 대상인 메트릭은 val_acc이지만, 코드에서는 validation 키 아래의 중첩된 딕셔너리 안에 val_acc를 로깅하고 있습니다. 메트릭은 중첩된 딕셔너리 안이 아니라 직접 로깅해야 합니다.
with wandb.init() as run:
    val_loss, val_acc = train()
    run.log(
        {
            "validation": {
                "val_loss": val_loss, 
                "val_acc": val_acc
                }
            }
        )