이 섹션의 다중 페이지 출력 화면임. 여기를 클릭하여 프린트.

이 페이지의 일반 화면으로 돌아가기.

Sweeps

W&B Sweeps를 사용한 하이퍼파라미터 검색 및 모델 최적화

W&B Sweeps 를 사용하여 하이퍼파라미터 검색을 자동화하고 풍부하고 인터랙티브한 experiment 추적을 시각화하세요. Bayesian, 그리드 검색 및 random과 같은 인기 있는 검색 방법 중에서 선택하여 하이퍼파라미터 공간을 검색합니다. 하나 이상의 시스템에서 스윕을 확장하고 병렬화합니다.

인터랙티브한 대시보드를 통해 대규모 하이퍼파라미터 튜닝 Experiments에서 통찰력을 얻으세요.

작동 방식

두 개의 W&B CLI 명령으로 스윕을 생성합니다.

  1. 스윕 초기화
wandb sweep --project <propject-name> <path-to-config file>
  1. 스윕 에이전트 시작
wandb agent <sweep-ID>

시작 방법

유스 케이스에 따라 다음 리소스를 탐색하여 W&B Sweeps를 시작하세요.

단계별 비디오는 W&B Sweeps로 하이퍼파라미터를 쉽게 튜닝하세요를 참조하세요.

1 - Tutorial: Define, initialize, and run a sweep

Sweeps 퀵스타트 는 스윕을 정의, 초기화 및 실행하는 방법을 보여줍니다. 주요 단계는 다음과 같습니다.

이 페이지에서는 스윕을 정의하고 초기화하고 실행하는 방법을 보여줍니다. 주요 단계는 네 가지입니다.

  1. 트레이닝 코드 설정
  2. 스윕 구성으로 검색 공간 정의
  3. 스윕 초기화
  4. 스윕 에이전트 시작

다음 코드를 Jupyter Notebook 또는 Python 스크립트에 복사하여 붙여넣으세요.

# W&B Python 라이브러리를 임포트하고 W&B에 로그인합니다
import wandb

wandb.login()

# 1: objective/트레이닝 함수 정의
def objective(config):
    score = config.x**3 + config.y
    return score

def main():
    wandb.init(project="my-first-sweep")
    score = objective(wandb.config)
    wandb.log({"score": score})

# 2: 검색 공간 정의
sweep_configuration = {
    "method": "random",
    "metric": {"goal": "minimize", "name": "score"},
    "parameters": {
        "x": {"max": 0.1, "min": 0.01},
        "y": {"values": [1, 3, 7]},
    },
}

# 3: 스윕 시작
sweep_id = wandb.sweep(sweep=sweep_configuration, project="my-first-sweep")

wandb.agent(sweep_id, function=main, count=10)

다음 섹션에서는 코드 샘플의 각 단계를 분석하고 설명합니다.

트레이닝 코드 설정

wandb.config에서 하이퍼파라미터 값을 가져와 모델을 트레이닝하고 메트릭을 반환하는 트레이닝 함수를 정의합니다.

선택적으로 W&B Run의 출력을 저장할 프로젝트 이름을 제공합니다(wandb.init의 project 파라미터). 프로젝트가 지정되지 않은 경우 run은 “Uncategorized” 프로젝트에 배치됩니다.

# 1: objective/트레이닝 함수 정의
def objective(config):
    score = config.x**3 + config.y
    return score


def main():
    wandb.init(project="my-first-sweep")
    score = objective(wandb.config)
    wandb.log({"score": score})

스윕 구성으로 검색 공간 정의

사전에서 스윕할 하이퍼파라미터를 지정합니다. 구성 옵션은 스윕 구성 정의을 참조하세요.

다음 예제는 랜덤 검색('method':'random')을 사용하는 스윕 구성을 보여줍니다. 스윕은 배치 크기, 에포크 및 학습률에 대해 구성에 나열된 임의의 값 집합을 무작위로 선택합니다.

W&B는 metric 키에 “goal": "minimize"가 연결되어 있을 때 지정된 메트릭을 최소화합니다. 이 경우 W&B는 메트릭 score("name": "score")를 최소화하도록 최적화합니다.

# 2: 검색 공간 정의
sweep_configuration = {
    "method": "random",
    "metric": {"goal": "minimize", "name": "score"},
    "parameters": {
        "x": {"max": 0.1, "min": 0.01},
        "y": {"values": [1, 3, 7]},
    },
}

스윕 초기화

W&B는 클라우드(표준), 로컬(로컬)에서 하나 이상의 머신에서 스윕을 관리하기 위해 Sweep Controller 를 사용합니다. Sweep Controller에 대한 자세한 내용은 로컬에서 검색 및 중지 알고리즘을 참조하세요.

스윕을 초기화하면 스윕 식별 번호가 반환됩니다.

sweep_id = wandb.sweep(sweep=sweep_configuration, project="my-first-sweep")

스윕 초기화에 대한 자세한 내용은 스윕 초기화을 참조하세요.

스윕 시작

wandb.agent API 호출을 사용하여 스윕을 시작합니다.

wandb.agent(sweep_id, function=main, count=10)

결과 시각화 (선택 사항)

프로젝트를 열어 W&B App 대시보드에서 실시간 결과를 확인하세요. 몇 번의 클릭만으로 평행 좌표 플롯, 파라미터 중요도 분석기타와 같은 풍부한 인터랙티브 차트를 구성합니다.

Sweeps Dashboard example

결과 시각화 방법에 대한 자세한 내용은 스윕 결과 시각화를 참조하세요. 대시보드 예제는 샘플 Sweeps Project를 참조하세요.

에이전트 중지 (선택 사항)

터미널에서 Ctrl+C를 눌러 현재 run을 중지합니다. 다시 누르면 에이전트가 종료됩니다.

2 - Add W&B (wandb) to your code

Python 코드 스크립트 또는 Jupyter 노트북 에 W&B를 추가하세요.

스크립트 또는 Jupyter Notebook에 W&B Python SDK를 추가하는 방법은 다양합니다. 아래에는 W&B Python SDK를 사용자 정의 코드에 통합하는 “모범 사례” 예제가 나와 있습니다.

원본 트레이닝 스크립트

다음 코드가 Python 스크립트에 있다고 가정합니다. 일반적인 트레이닝 루프를 모방하는 main이라는 함수를 정의합니다. 각 에포크마다 트레이닝 및 검증 데이터 세트에서 정확도와 손실이 계산됩니다. 이 예제의 목적을 위해 해당 값은 임의로 생성됩니다.

하이퍼파라미터 값을 저장하는 config라는 사전을 정의했습니다. 셀의 끝에서 main 함수를 호출하여 모의 트레이닝 코드를 실행합니다.

import random
import numpy as np

def train_one_epoch(epoch, lr, bs):
    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, "bs": 16, "epochs": 5}

def main():
    # 하드 코딩된 값을 정의하는 대신
    # `wandb.config`에서 값을 정의합니다.
    lr = config["lr"]
    bs = config["bs"]
    epochs = config["epochs"]

    for epoch in np.arange(1, epochs):
        train_acc, train_loss = train_one_epoch(epoch, lr, bs)
        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, "training loss:", val_loss)        

W&B Python SDK를 사용한 트레이닝 스크립트

다음 코드 예제에서는 W&B Python SDK를 코드에 추가하는 방법을 보여줍니다. CLI에서 W&B Sweep 작업을 시작하는 경우 CLI 탭을 살펴보십시오. Jupyter Notebook 또는 Python 스크립트 내에서 W&B Sweep 작업을 시작하는 경우 Python SDK 탭을 살펴보십시오.

W&B Sweep을 생성하기 위해 코드 예제에 다음을 추가했습니다.

  1. Weights & Biases Python SDK를 가져옵니다.
  2. 키-값 쌍이 스윕 구성을 정의하는 사전 오브젝트를 생성합니다. 다음 예제에서는 각 스윕 중에 배치 크기(batch_size), 에포크(epochs) 및 학습률(lr) 하이퍼파라미터가 다양합니다. 스윕 구성을 생성하는 방법에 대한 자세한 내용은 스윕 구성 정의를 참조하십시오.
  3. 스윕 구성 사전을 wandb.sweep에 전달합니다. 그러면 스윕이 초기화됩니다. 스윕 ID(sweep_id)가 반환됩니다. 스윕을 초기화하는 방법에 대한 자세한 내용은 스윕 초기화를 참조하십시오.
  4. wandb.init() API를 사용하여 데이터를 동기화하고 W&B Run으로 기록하는 백그라운드 프로세스를 생성합니다.
  5. (선택 사항) 하드 코딩된 값을 정의하는 대신 wandb.config에서 값을 정의합니다.
  6. wandb.log를 사용하여 최적화하려는 메트릭을 기록합니다. 구성에 정의된 메트릭을 기록해야 합니다. 구성 사전(이 예제에서는 sweep_configuration) 내에서 val_acc 값을 최대화하도록 스윕을 정의했습니다.
  7. wandb.agent API 호출로 스윕을 시작합니다. 스윕 ID, 스윕이 실행할 함수의 이름(function=main)을 제공하고 시도할 최대 run 수를 4개(count=4)로 설정합니다. W&B Sweep 시작 방법에 대한 자세한 내용은 스윕 에이전트 시작을 참조하십시오.
import wandb
import numpy as np
import random

# 스윕 구성 정의
sweep_configuration = {
    "method": "random",
    "name": "sweep",
    "metric": {"goal": "maximize", "name": "val_acc"},
    "parameters": {
        "batch_size": {"values": [16, 32, 64]},
        "epochs": {"values": [5, 10, 15]},
        "lr": {"max": 0.1, "min": 0.0001},
    },
}

# 구성을 전달하여 스윕을 초기화합니다.
# (선택 사항) 프로젝트 이름을 제공합니다.
sweep_id = wandb.sweep(sweep=sweep_configuration, project="my-first-sweep")


# `wandb.config`에서 하이퍼파라미터
# 값을 가져와서 모델을 트레이닝하고
# 메트릭을 반환하는 트레이닝 함수를 정의합니다.
def train_one_epoch(epoch, lr, bs):
    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():
    run = wandb.init()

    # 하드 코딩된 값을 정의하는 대신
    # `wandb.config`에서 값을 정의합니다.
    lr = wandb.config.lr
    bs = wandb.config.batch_size
    epochs = wandb.config.epochs

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

        wandb.log(
            {
                "epoch": epoch,
                "train_acc": train_acc,
                "train_loss": train_loss,
                "val_acc": val_acc,
                "val_loss": val_loss,
            }
        )


# 스윕 작업을 시작합니다.
wandb.agent(sweep_id, function=main, count=4)

W&B Sweep을 생성하려면 먼저 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 구성을 생성하는 방법에 대한 자세한 내용은 스윕 구성 정의를 참조하십시오.

YAML 파일의 program 키에 Python 스크립트의 이름을 제공해야 합니다.

다음으로 코드 예제에 다음을 추가합니다.

  1. Wieghts & Biases Python SDK(wandb) 및 PyYAML(yaml)을 가져옵니다. PyYAML은 YAML 구성 파일을 읽어오는 데 사용됩니다.
  2. 구성 파일을 읽어옵니다.
  3. wandb.init() API를 사용하여 데이터를 동기화하고 W&B Run으로 기록하는 백그라운드 프로세스를 생성합니다. config 오브젝트를 config 파라미터에 전달합니다.
  4. 하드 코딩된 값을 사용하는 대신 wandb.config에서 하이퍼파라미터 값을 정의합니다.
  5. wandb.log를 사용하여 최적화하려는 메트릭을 기록합니다. 구성에 정의된 메트릭을 기록해야 합니다. 구성 사전(이 예제에서는 sweep_configuration) 내에서 val_acc 값을 최대화하도록 스윕을 정의했습니다.
import wandb
import yaml
import random
import numpy as np


def train_one_epoch(epoch, lr, bs):
    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)

    run = wandb.init(config=config)

    # 하드 코딩된 값을 정의하는 대신
    # `wandb.config`에서 값을 정의합니다.
    lr = wandb.config.lr
    bs = wandb.config.batch_size
    epochs = wandb.config.epochs

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

        wandb.log(
            {
                "epoch": epoch,
                "train_acc": train_acc,
                "train_loss": train_loss,
                "val_acc": val_acc,
                "val_loss": val_loss,
            }
        )


# main 함수를 호출합니다.
main()

CLI로 이동합니다. CLI 내에서 스윕 에이전트가 시도해야 하는 최대 run 수를 설정합니다. 이 단계는 선택 사항입니다. 다음 예제에서는 최대 숫자를 5로 설정합니다.

NUM=5

다음으로 wandb sweep 코맨드로 스윕을 초기화합니다. YAML 파일의 이름을 제공합니다. 선택적으로 프로젝트 플래그(--project)에 대한 프로젝트 이름을 제공합니다.

wandb sweep --project sweep-demo-cli config.yaml

그러면 스윕 ID가 반환됩니다. 스윕을 초기화하는 방법에 대한 자세한 내용은 스윕 초기화를 참조하십시오.

스윕 ID를 복사하고 다음 코드 조각에서 sweepID를 바꾸어 wandb agent 코맨드로 스윕 작업을 시작합니다.

wandb agent --count $NUM your-entity/sweep-demo-cli/sweepID

스윕 작업 시작 방법에 대한 자세한 내용은 스윕 작업 시작을 참조하십시오.

메트릭 로깅 시 고려 사항

스윕 구성에 지정한 메트릭을 W&B에 명시적으로 기록해야 합니다. 하위 디렉터리 내부에 스윕에 대한 메트릭을 기록하지 마십시오.

예를 들어 다음 유사 코드를 고려하십시오. 사용자는 검증 손실("val_loss": loss)을 기록하려고 합니다. 먼저 값을 사전에 전달합니다. 그러나 wandb.log에 전달된 사전은 사전에서 키-값 쌍에 명시적으로 엑세스하지 않습니다.

# W&B Python 라이브러리를 가져오고 W&B에 로그인합니다.
import wandb
import random

def train():
    offset = random.random() / 5
    acc = 1 - 2**-epoch - random.random() / epoch - offset
    loss = 2**-epoch + random.random() / epoch + offset

    val_metrics = {"val_loss": loss, "val_acc": acc}
    return val_metrics


def main():
    wandb.init(entity="<entity>", project="my-first-sweep")
    val_metrics = train()
    # 잘못되었습니다. 사전에서 키-값 쌍에 명시적으로 엑세스해야 합니다.
    # 메트릭을 올바르게 기록하는 방법을 보려면 다음 코드 블록을 참조하십시오.
    wandb.log({"val_loss": val_metrics})


sweep_configuration = {
    "method": "random",
    "metric": {"goal": "minimize", "name": "val_loss"},
    "parameters": {
        "x": {"max": 0.1, "min": 0.01},
        "y": {"values": [1, 3, 7]},
    },
}

sweep_id = wandb.sweep(sweep=sweep_configuration, project="my-first-sweep")

wandb.agent(sweep_id, function=main, count=10)

대신 Python 사전 내에서 키-값 쌍에 명시적으로 엑세스합니다. 예를 들어 다음 코드는 사전을 wandb.log 메소드에 전달할 때 키-값 쌍을 지정합니다.

# W&B Python 라이브러리를 가져오고 W&B에 로그인합니다.
import wandb
import random


def train():
    offset = random.random() / 5
    acc = 1 - 2**-epoch - random.random() / epoch - offset
    loss = 2**-epoch + random.random() / epoch + offset

    val_metrics = {"val_loss": loss, "val_acc": acc}
    return val_metrics


def main():
    wandb.init(entity="<entity>", project="my-first-sweep")
    val_metrics = train()
    wandb.log({"val_loss", val_metrics["val_loss"]})


sweep_configuration = {
    "method": "random",
    "metric": {"goal": "minimize", "name": "val_loss"},
    "parameters": {
        "x": {"max": 0.1, "min": 0.01},
        "y": {"values": [1, 3, 7]},
    },
}

sweep_id = wandb.sweep(sweep=sweep_configuration, project="my-first-sweep")

wandb.agent(sweep_id, function=main, count=10)

3 - Define a sweep configuration

스윕을 위한 설정 파일을 만드는 방법을 배워보세요.

W&B Sweep은 하이퍼파라미터 값을 탐색하는 전략과 해당 값을 평가하는 코드를 결합합니다. 이 전략은 모든 옵션을 시도하는 것만큼 간단할 수도 있고, 베이지안 최적화 및 Hyperband(BOHB)만큼 복잡할 수도 있습니다.

Python dictionary 또는 YAML 파일에서 스윕 구성을 정의합니다. 스윕 구성을 정의하는 방법은 스윕을 관리하려는 방식에 따라 다릅니다.

다음 가이드에서는 스윕 구성의 형식을 지정하는 방법을 설명합니다. 최상위 스윕 구성 키의 전체 목록은 스윕 구성 옵션을 참조하십시오.

기본 구조

두 가지 스윕 구성 형식 옵션(YAML 및 Python dictionary) 모두 키-값 쌍과 중첩 구조를 활용합니다.

스윕 구성 내에서 최상위 키를 사용하여 스윕 이름(name 키), 검색할 파라미터(parameters 키), 파라미터 공간을 검색하는 방법(method 키) 등과 같은 스윕 검색의 품질을 정의합니다.

예를 들어, 다음 코드 조각은 YAML 파일과 Python dictionary 내에서 정의된 동일한 스윕 구성을 보여줍니다. 스윕 구성 내에는 program, name, method, metricparameters의 5가지 최상위 키가 지정되어 있습니다.

커맨드라인 (CLI)에서 스윕을 대화형으로 관리하려면 YAML 파일에서 스윕 구성을 정의하십시오.

program: train.py
name: sweepdemo
method: bayes
metric:
  goal: minimize
  name: validation_loss
parameters:
  learning_rate:
    min: 0.0001
    max: 0.1
  batch_size:
    values: [16, 32, 64]
  epochs:
    values: [5, 10, 15]
  optimizer:
    values: ["adam", "sgd"]

Python 스크립트 또는 Jupyter notebook에서 트레이닝 알고리즘을 정의하는 경우 Python dictionary 데이터 구조에서 스윕을 정의하십시오.

다음 코드 조각은 sweep_configuration이라는 변수에 스윕 구성을 저장합니다.

sweep_configuration = {
    "name": "sweepdemo",
    "method": "bayes",
    "metric": {"goal": "minimize", "name": "validation_loss"},
    "parameters": {
        "learning_rate": {"min": 0.0001, "max": 0.1},
        "batch_size": {"values": [16, 32, 64]},
        "epochs": {"values": [5, 10, 15]},
        "optimizer": {"values": ["adam", "sgd"]},
    },
}

최상위 parameters 키 내에는 learning_rate, batch_size, epochoptimizer 키가 중첩되어 있습니다. 중첩된 각 키에 대해 하나 이상의 값, 분포, 확률 등을 제공할 수 있습니다. 자세한 내용은 스윕 구성 옵션파라미터 섹션을 참조하십시오.

이중 중첩 파라미터

스윕 구성은 중첩된 파라미터를 지원합니다. 중첩된 파라미터를 구분하려면 최상위 파라미터 이름 아래에 추가 parameters 키를 사용하십시오. 스윕 구성은 다단계 중첩을 지원합니다.

베이지안 또는 랜덤 하이퍼파라미터 검색을 사용하는 경우 랜덤 변수에 대한 확률 분포를 지정하십시오. 각 하이퍼파라미터에 대해:

  1. 스윕 구성에 최상위 parameters 키를 만듭니다.
  2. parameters 키 내에서 다음을 중첩합니다.
    1. 최적화하려는 하이퍼파라미터의 이름을 지정합니다.
    2. distribution 키에 사용할 분포를 지정합니다. 하이퍼파라미터 이름 아래에 distribution 키-값 쌍을 중첩합니다.
    3. 탐색할 하나 이상의 값을 지정합니다. 값은 분포 키와 일치해야 합니다.
      1. (선택 사항) 최상위 파라미터 이름 아래에 추가 parameters 키를 사용하여 중첩된 파라미터를 구분합니다.

스윕 구성 템플릿

다음 템플릿은 파라미터를 구성하고 검색 제약 조건을 지정하는 방법을 보여줍니다. hyperparameter_name을 하이퍼파라미터 이름으로 바꾸고 <>로 묶인 모든 값을 바꿉니다.

program: <insert>
method: <insert>
parameter:
  hyperparameter_name0:
    value: 0  
  hyperparameter_name1: 
    values: [0, 0, 0]
  hyperparameter_name: 
    distribution: <insert>
    value: <insert>
  hyperparameter_name2:  
    distribution: <insert>
    min: <insert>
    max: <insert>
    q: <insert>
  hyperparameter_name3: 
    distribution: <insert>
    values:
      - <list_of_values>
      - <list_of_values>
      - <list_of_values>
early_terminate:
  type: hyperband
  s: 0
  eta: 0
  max_iter: 0
command:
- ${Command macro}
- ${Command macro}
- ${Command macro}
- ${Command macro}      

스윕 구성 예제

program: train.py
method: random
metric:
  goal: minimize
  name: loss
parameters:
  batch_size:
    distribution: q_log_uniform_values
    max: 256 
    min: 32
    q: 8
  dropout: 
    values: [0.3, 0.4, 0.5]
  epochs:
    value: 1
  fc_layer_size: 
    values: [128, 256, 512]
  learning_rate:
    distribution: uniform
    max: 0.1
    min: 0
  optimizer:
    values: ["adam", "sgd"]
sweep_config = {
    "method": "random",
    "metric": {"goal": "minimize", "name": "loss"},
    "parameters": {
        "batch_size": {
            "distribution": "q_log_uniform_values",
            "max": 256,
            "min": 32,
            "q": 8,
        },
        "dropout": {"values": [0.3, 0.4, 0.5]},
        "epochs": {"value": 1},
        "fc_layer_size": {"values": [128, 256, 512]},
        "learning_rate": {"distribution": "uniform", "max": 0.1, "min": 0},
        "optimizer": {"values": ["adam", "sgd"]},
    },
}

Bayes hyperband 예제

program: train.py
method: bayes
metric:
  goal: minimize
  name: val_loss
parameters:
  dropout:
    values: [0.15, 0.2, 0.25, 0.3, 0.4]
  hidden_layer_size:
    values: [96, 128, 148]
  layer_1_size:
    values: [10, 12, 14, 16, 18, 20]
  layer_2_size:
    values: [24, 28, 32, 36, 40, 44]
  learn_rate:
    values: [0.001, 0.01, 0.003]
  decay:
    values: [1e-5, 1e-6, 1e-7]
  momentum:
    values: [0.8, 0.9, 0.95]
  epochs:
    value: 27
early_terminate:
  type: hyperband
  s: 2
  eta: 3
  max_iter: 27

다음 탭은 early_terminate에 대한 최소 또는 최대 반복 횟수를 지정하는 방법을 보여줍니다.

이 예제의 대괄호는 [3, 3*eta, 3*eta*eta, 3*eta*eta*eta]이며, 이는 [3, 9, 27, 81]과 같습니다.

early_terminate:
  type: hyperband
  min_iter: 3

이 예제의 대괄호는 [27/eta, 27/eta/eta]이며, 이는 [9, 3]과 같습니다.

early_terminate:
  type: hyperband
  max_iter: 27
  s: 2

커맨드 예제

program: main.py
metric:
  name: val_loss
  goal: minimize

method: bayes
parameters:
  optimizer.config.learning_rate:
    min: !!float 1e-5
    max: 0.1
  experiment:
    values: [expt001, expt002]
  optimizer:
    values: [sgd, adagrad, adam]

command:
- ${env}
- ${interpreter}
- ${program}
- ${args_no_hyphens}
/usr/bin/env python train.py --param1=value1 --param2=value2
python train.py --param1=value1 --param2=value2

다음 탭은 일반적인 커맨드 매크로를 지정하는 방법을 보여줍니다.

{$interpreter} 매크로를 제거하고 값을 명시적으로 제공하여 Python 인터프리터를 하드 코딩하십시오. 예를 들어, 다음 코드 조각은 이를 수행하는 방법을 보여줍니다.

command:
  - ${env}
  - python3
  - ${program}
  - ${args}

다음은 스윕 구성 파라미터에 의해 지정되지 않은 추가 커맨드라인 인수를 추가하는 방법을 보여줍니다.

command:
  - ${env}
  - ${interpreter}
  - ${program}
  - "--config"
  - "your-training-config.json"
  - ${args}

프로그램이 인수 파싱을 사용하지 않는 경우 인수를 모두 전달하지 않고 wandb.init이 스윕 파라미터를 자동으로 wandb.config에 선택하도록 할 수 있습니다.

command:
  - ${env}
  - ${interpreter}
  - ${program}

Hydra와 같은 툴이 예상하는 방식으로 인수를 전달하도록 커맨드를 변경할 수 있습니다. 자세한 내용은 W&B와 함께 Hydra 사용하기를 참조하십시오.

command:
  - ${env}
  - ${interpreter}
  - ${program}
  - ${args_no_hyphens}

3.1 - Sweep configuration options

스윕 구성은 중첩된 키-값 쌍으로 구성됩니다. 스윕 구성 내에서 최상위 키를 사용하여 검색할 파라미터 ( parameter 키), 파라미터 공간을 검색하는 방법 ( method 키) 등과 같은 스윕 검색의 특성을 정의합니다.

다음 표는 최상위 스윕 구성 키와 간단한 설명을 나열합니다. 각 키에 대한 자세한 내용은 해당 섹션을 참조하십시오.

최상위 키 설명
program (필수) 실행할 트레이닝 스크립트
entity 이 스윕에 대한 엔티티
project 이 스윕에 대한 프로젝트
description 스윕에 대한 텍스트 설명
name W&B UI에 표시되는 스윕의 이름
method (필수) 검색 전략
metric 최적화할 메트릭 (특정 검색 전략 및 중단 조건에만 사용)
parameters (필수) 검색할 파라미터 범위
early_terminate 조기 중단 조건
command 트레이닝 스크립트를 호출하고 인수를 전달하기 위한 코맨드 구조
run_cap 이 스윕의 최대 run 수

스윕 구성을 구성하는 방법에 대한 자세한 내용은 스윕 구성 구조를 참조하십시오.

metric

metric 최상위 스윕 구성 키를 사용하여 최적화할 이름, 목표 및 대상 메트릭을 지정합니다.

설명
name 최적화할 메트릭의 이름입니다.
goal minimize 또는 maximize (기본값은 minimize)입니다.
target 최적화하려는 메트릭의 목표 값입니다. 스윕은 run이 지정한 목표 값에 도달하면 새 run을 만들지 않습니다. run을 실행 중인 활성 에이전트는 (run이 목표에 도달하면) 에이전트가 새 run 생성을 중단하기 전에 run이 완료될 때까지 기다립니다.

parameters

YAML 파일 또는 Python 스크립트에서 parameters를 최상위 키로 지정합니다. parameters 키 내에서 최적화하려는 하이퍼파라미터의 이름을 제공합니다. 일반적인 하이퍼파라미터에는 학습률, 배치 크기, 에포크, 옵티마이저 등이 있습니다. 스윕 구성에서 정의하는 각 하이퍼파라미터에 대해 하나 이상의 검색 제약 조건을 지정합니다.

다음 표는 지원되는 하이퍼파라미터 검색 제약 조건을 보여줍니다. 하이퍼파라미터 및 유스 케이스에 따라 아래 검색 제약 조건 중 하나를 사용하여 스윕 에이전트에게 검색하거나 사용할 위치 (분포의 경우) 또는 내용 (value, values 등)을 알려줍니다.

검색 제약 조건 설명
values 이 하이퍼파라미터에 대한 모든 유효한 값을 지정합니다. grid와 호환됩니다.
value 이 하이퍼파라미터에 대한 단일 유효한 값을 지정합니다. grid와 호환됩니다.
distribution 확률 분포를 지정합니다. 기본값에 대한 정보는 이 표 다음에 나오는 참고 사항을 참조하십시오.
probabilities random을 사용할 때 values의 각 요소를 선택할 확률을 지정합니다.
min, max (int 또는 float) 최대값 및 최소값입니다. int인 경우 int_uniform 분포된 하이퍼파라미터에 사용됩니다. float인 경우 uniform 분포된 하이퍼파라미터에 사용됩니다.
mu (float) normal 또는 lognormal 분포된 하이퍼파라미터에 대한 평균 파라미터입니다.
sigma (float) normal 또는 lognormal 분포된 하이퍼파라미터에 대한 표준 편차 파라미터입니다.
q (float) 양자화된 하이퍼파라미터에 대한 양자화 단계 크기입니다.
parameters 루트 수준 파라미터 내부에 다른 파라미터를 중첩합니다.

method

method 키를 사용하여 하이퍼파라미터 검색 전략을 지정합니다. 선택할 수 있는 세 가지 하이퍼파라미터 검색 전략이 있습니다: 그리드, 랜덤, 베이지안 탐색.

그리드 검색

하이퍼파라미터 값의 모든 조합을 반복합니다. 그리드 검색은 각 반복에서 사용할 하이퍼파라미터 값 집합에 대해 정보에 입각하지 않은 결정을 내립니다. 그리드 검색은 계산 비용이 많이 들 수 있습니다.

그리드 검색은 연속 검색 공간 내에서 검색하는 경우 영원히 실행됩니다.

랜덤 검색

각 반복에서 분포에 따라 임의의, 정보에 입각하지 않은 하이퍼파라미터 값 집합을 선택합니다. 랜덤 검색은 커맨드라인, Python 스크립트 또는 W&B 앱 UI 내에서 프로세스를 중지하지 않는 한 영원히 실행됩니다.

랜덤 (method: random) 검색을 선택하는 경우 메트릭 키를 사용하여 분포 공간을 지정합니다.

베이지안 탐색

랜덤그리드 검색과 달리 베이지안 모델은 정보에 입각한 결정을 내립니다. 베이지안 최적화는 확률 모델을 사용하여 목적 함수를 평가하기 전에 대리 함수에서 값을 테스트하는 반복적인 프로세스를 통해 사용할 값을 결정합니다. 베이지안 탐색은 작은 수의 연속 파라미터에 적합하지만 확장성이 떨어집니다. 베이지안 탐색에 대한 자세한 내용은 Bayesian Optimization Primer 논문을 참조하십시오.

베이지안 탐색은 커맨드라인, Python 스크립트 또는 W&B 앱 UI 내에서 프로세스를 중지하지 않는 한 영원히 실행됩니다.

랜덤 및 베이지안 탐색을 위한 분포 옵션

parameter 키 내에서 하이퍼파라미터의 이름을 중첩합니다. 다음으로 distribution 키를 지정하고 값에 대한 분포를 지정합니다.

다음 표는 W&B가 지원하는 분포를 나열합니다.

distribution 키 값 설명
constant 상수 분포. 사용할 상수 값 (value)을 지정해야 합니다.
categorical 범주형 분포. 이 하이퍼파라미터에 대한 모든 유효한 값 (values)을 지정해야 합니다.
int_uniform 정수에 대한 이산 균등 분포. maxmin을 정수로 지정해야 합니다.
uniform 연속 균등 분포. maxmin을 부동 소수점으로 지정해야 합니다.
q_uniform 양자화된 균등 분포. round(X / q) * q를 반환합니다. 여기서 X는 균등 분포입니다. q의 기본값은 1입니다.
log_uniform 로그 균등 분포. exp(min)exp(max) 사이의 값 X를 반환합니다. 여기서 자연 로그는 minmax 사이에서 균등하게 분포됩니다.
log_uniform_values 로그 균등 분포. minmax 사이의 값 X를 반환합니다. 여기서 log(X)log(min)log(max) 사이에서 균등하게 분포됩니다.
q_log_uniform 양자화된 로그 균등 분포. round(X / q) * q를 반환합니다. 여기서 Xlog_uniform입니다. q의 기본값은 1입니다.
q_log_uniform_values 양자화된 로그 균등 분포. round(X / q) * q를 반환합니다. 여기서 Xlog_uniform_values입니다. q의 기본값은 1입니다.
inv_log_uniform 역 로그 균등 분포. X를 반환합니다. 여기서 log(1/X)minmax 사이에서 균등하게 분포됩니다.
inv_log_uniform_values 역 로그 균등 분포. X를 반환합니다. 여기서 log(1/X)log(1/max)log(1/min) 사이에서 균등하게 분포됩니다.
normal 정규 분포. 평균 mu (기본값 0) 및 표준 편차 sigma (기본값 1)로 정규 분포된 값을 반환합니다.
q_normal 양자화된 정규 분포. round(X / q) * q를 반환합니다. 여기서 Xnormal입니다. Q의 기본값은 1입니다.
log_normal 로그 정규 분포. 자연 로그 log(X)가 평균 mu (기본값 0) 및 표준 편차 sigma (기본값 1)로 정규 분포된 값 X를 반환합니다.
q_log_normal 양자화된 로그 정규 분포. round(X / q) * q를 반환합니다. 여기서 Xlog_normal입니다. q의 기본값은 1입니다.

early_terminate

조기 종료 (early_terminate)를 사용하여 성능이 낮은 run을 중지합니다. 조기 종료가 발생하면 W&B는 새 하이퍼파라미터 값 집합으로 새 run을 만들기 전에 현재 run을 중지합니다.

중지 알고리즘

Hyperband 하이퍼파라미터 최적화는 프로그램을 중지해야 하는지 또는 사전 설정된 하나 이상의 반복 횟수 ( brackets 라고 함)에서 계속해야 하는지 평가합니다.

W&B run이 bracket에 도달하면 스윕은 해당 run의 메트릭을 이전에 보고된 모든 메트릭 값과 비교합니다. 스윕은 run의 메트릭 값이 너무 높으면 (목표가 최소화인 경우) 또는 run의 메트릭 값이 너무 낮으면 (목표가 최대화인 경우) run을 종료합니다.

Brackets는 기록된 반복 횟수를 기반으로 합니다. brackets 수는 최적화하는 메트릭을 기록하는 횟수에 해당합니다. 반복은 단계, 에포크 또는 그 사이의 무언가에 해당할 수 있습니다. 단계 카운터의 숫자 값은 bracket 계산에 사용되지 않습니다.

설명
min_iter 첫 번째 bracket에 대한 반복을 지정합니다.
max_iter 최대 반복 횟수를 지정합니다.
s 총 bracket 수를 지정합니다 (max_iter에 필요).
eta bracket 승수 일정을 지정합니다 (기본값: 3).
strict 원본 Hyperband 논문을 더 면밀히 따르면서 실행을 적극적으로 정리하는 ‘엄격’ 모드를 활성화합니다. 기본값은 false입니다.

command

command 키 내에서 중첩된 값으로 형식과 내용을 수정합니다. 파일 이름과 같은 고정된 구성 요소를 직접 포함할 수 있습니다.

W&B는 코맨드의 가변 구성 요소에 대해 다음 매크로를 지원합니다.

코맨드 매크로 설명
${env} Unix 시스템의 경우 /usr/bin/env, Windows에서는 생략됩니다.
${interpreter} python으로 확장됩니다.
${program} 스윕 구성 program 키로 지정된 트레이닝 스크립트 파일 이름입니다.
${args} --param1=value1 --param2=value2 형식의 하이퍼파라미터 및 해당 값입니다.
${args_no_boolean_flags} --param1=value1 형식의 하이퍼파라미터 및 해당 값입니다. 단, 부울 파라미터는 True이면 --boolean_flag_param 형식이고 False이면 생략됩니다.
${args_no_hyphens} param1=value1 param2=value2 형식의 하이퍼파라미터 및 해당 값입니다.
${args_json} JSON으로 인코딩된 하이퍼파라미터 및 해당 값입니다.
${args_json_file} JSON으로 인코딩된 하이퍼파라미터 및 해당 값이 포함된 파일의 경로입니다.
${envvar} 환경 변수를 전달하는 방법입니다. ${envvar:MYENVVAR}은 MYENVVAR 환경 변수의 값으로 확장됩니다.

4 - Initialize a sweep

W&B 스윕 초기화

W&B는 클라우드 (표준), 로컬 (local) 환경에서 하나 이상의 머신에서 Sweeps 를 관리하기 위해 Sweep Controller 를 사용합니다. Run이 완료되면, 스윕 컨트롤러는 실행할 새로운 Run을 설명하는 새로운 명령어 세트를 발행합니다. 이 명령어는 실제로 Run을 수행하는 에이전트 에 의해 선택됩니다. 일반적인 W&B 스윕에서 컨트롤러는 W&B 서버에 존재합니다. 에이전트는 사용자 의 머신에 존재합니다.

다음 코드 조각은 CLI 및 Jupyter Notebook 또는 Python 스크립트 내에서 스윕을 초기화하는 방법을 보여줍니다.

W&B SDK를 사용하여 스윕을 초기화합니다. 스윕 구성 dictionary 를 sweep 파라미터에 전달합니다. 선택적으로 W&B Run 의 출력을 저장할 Projects 파라미터 (project)에 대한 프로젝트 이름을 제공합니다. 프로젝트가 지정되지 않은 경우 Run은 “Uncategorized” 프로젝트에 배치됩니다.

import wandb

# 스윕 구성 예시
sweep_configuration = {
    "method": "random",
    "name": "sweep",
    "metric": {"goal": "maximize", "name": "val_acc"},
    "parameters": {
        "batch_size": {"values": [16, 32, 64]},
        "epochs": {"values": [5, 10, 15]},
        "lr": {"max": 0.1, "min": 0.0001},
    },
}

sweep_id = wandb.sweep(sweep=sweep_configuration, project="project-name")

wandb.sweep 함수는 스윕 ID를 반환합니다. 스윕 ID에는 Entities 이름과 Projects 이름이 포함됩니다. 스윕 ID를 기록해 두세요.

W&B CLI를 사용하여 스윕을 초기화합니다. 구성 파일 이름을 제공합니다. 선택적으로 project 플래그에 대한 프로젝트 이름을 제공합니다. 프로젝트가 지정되지 않은 경우 W&B Run은 “Uncategorized” 프로젝트에 배치됩니다.

wandb sweep 코맨드를 사용하여 스윕을 초기화합니다. 다음 코드 예제는 sweeps_demo 프로젝트에 대한 스윕을 초기화하고 구성에 config.yaml 파일을 사용합니다.

wandb sweep --project sweeps_demo config.yaml

이 코맨드는 스윕 ID를 출력합니다. 스윕 ID에는 Entities 이름과 Projects 이름이 포함됩니다. 스윕 ID를 기록해 두세요.

5 - Start or stop a sweep agent

하나 이상의 머신에서 W&B 스윕 에이전트 를 시작하거나 중지합니다.

하나 이상의 머신에서 하나 이상의 에이전트로 W&B 스윕을 시작하세요. W&B 스윕 에이전트는 하이퍼파라미터에 대해 W&B 스윕 ( wandb sweep)을 초기화할 때 시작한 W&B 서버를 쿼리하고 이를 사용하여 모델 트레이닝을 실행합니다.

W&B 스윕 에이전트를 시작하려면 W&B 스윕을 초기화할 때 반환된 W&B 스윕 ID를 제공하세요. W&B 스윕 ID의 형식은 다음과 같습니다.

entity/project/sweep_ID

여기서:

  • entity: W&B 사용자 이름 또는 팀 이름입니다.
  • project: W&B Run의 출력을 저장할 프로젝트의 이름입니다. 프로젝트를 지정하지 않으면 run이 “Uncategorized” 프로젝트에 저장됩니다.
  • sweep_ID: W&B에서 생성한 의사 난수 고유 ID입니다.

Jupyter Notebook 또는 Python 스크립트 내에서 W&B 스윕 에이전트를 시작하는 경우 W&B 스윕이 실행할 함수의 이름을 제공하세요.

다음 코드 조각은 W&B로 에이전트를 시작하는 방법을 보여줍니다. 이미 구성 파일이 있고 W&B 스윕을 초기화했다고 가정합니다. 구성 파일을 정의하는 방법에 대한 자세한 내용은 스윕 구성 정의을 참조하세요.

wandb agent 코맨드를 사용하여 스윕을 시작합니다. 스윕을 초기화할 때 반환된 스윕 ID를 제공합니다. 아래 코드 조각을 복사하여 붙여넣고 sweep_id를 스윕 ID로 바꾸세요.

wandb agent sweep_id

W&B Python SDK 라이브러리를 사용하여 스윕을 시작합니다. 스윕을 초기화할 때 반환된 스윕 ID를 제공합니다. 또한 스윕이 실행할 함수의 이름을 제공합니다.

wandb.agent(sweep_id=sweep_id, function=function_name)

W&B 에이전트 중지

선택적으로 스윕 에이전트가 시도해야 하는 W&B Runs의 수를 지정합니다. 다음 코드 조각은 CLI 및 Jupyter Notebook, Python 스크립트 내에서 최대 W&B Runs 수를 설정하는 방법을 보여줍니다.

먼저 스윕을 초기화합니다. 자세한 내용은 스윕 초기화을 참조하세요.

sweep_id = wandb.sweep(sweep_config)

다음으로 스윕 작업을 시작합니다. 스윕 시작에서 생성된 스윕 ID를 제공합니다. 시도할 최대 run 수를 설정하려면 count 파라미터에 정수 값을 전달합니다.

sweep_id, count = "dtzl1o7u", 10
wandb.agent(sweep_id, count=count)

먼저 wandb sweep 코맨드로 스윕을 초기화합니다. 자세한 내용은 스윕 초기화을 참조하세요.

wandb sweep config.yaml

시도할 최대 run 수를 설정하려면 count 플래그에 정수 값을 전달합니다.

NUM=10
SWEEPID="dtzl1o7u"
wandb agent --count $NUM $SWEEPID

6 - Parallelize agents

멀티 코어 또는 멀티 GPU 머신에서 W&B 스윕 에이전트를 병렬화하세요.

멀티 코어 또는 멀티 GPU 머신에서 W&B 스윕 에이전트를 병렬화하세요. 시작하기 전에 W&B 스윕을 초기화했는지 확인하세요. W&B 스윕을 초기화하는 방법에 대한 자세한 내용은 스윕 초기화를 참조하세요.

멀티 CPU 머신에서 병렬화

유스 케이스에 따라 다음 탭을 살펴보고 CLI 또는 Jupyter Notebook 내에서 W&B 스윕 에이전트를 병렬화하는 방법을 알아보세요.

wandb agent 코맨드를 사용하여 터미널에서 여러 CPU에 걸쳐 W&B 스윕 에이전트를 병렬화하세요. 스윕을 초기화할 때 반환된 스윕 ID를 제공하세요.

  1. 로컬 머신에서 둘 이상의 터미널 창을 여세요.
  2. 아래 코드 조각을 복사하여 붙여넣고 sweep_id를 스윕 ID로 바꾸세요.
wandb agent sweep_id

W&B Python SDK 라이브러리를 사용하여 Jupyter Notebook 내에서 여러 CPU에 걸쳐 W&B 스윕 에이전트를 병렬화하세요. 스윕을 초기화할 때 반환된 스윕 ID가 있는지 확인하세요. 또한 스윕이 실행할 함수의 이름을 function 파라미터에 제공하세요.

  1. 둘 이상의 Jupyter Notebook을 여세요.
  2. 여러 Jupyter Notebook에 W&B 스윕 ID를 복사하여 붙여넣어 W&B 스윕을 병렬화하세요. 예를 들어, 스윕 ID가 sweep_id라는 변수에 저장되어 있고 함수의 이름이 function_name인 경우 다음 코드 조각을 여러 Jupyter Notebook에 붙여넣어 스윕을 병렬화할 수 있습니다.
wandb.agent(sweep_id=sweep_id, function=function_name)

멀티 GPU 머신에서 병렬화

CUDA 툴킷을 사용하여 터미널에서 여러 GPU에 걸쳐 W&B 스윕 에이전트를 병렬화하려면 다음 절차를 따르세요.

  1. 로컬 머신에서 둘 이상의 터미널 창을 여세요.
  2. W&B 스윕 작업을 시작할 때 CUDA_VISIBLE_DEVICES를 사용하여 사용할 GPU 인스턴스를 지정하세요(wandb agent). 사용할 GPU 인스턴스에 해당하는 정수 값을 CUDA_VISIBLE_DEVICES에 할당하세요.

예를 들어, 로컬 머신에 두 개의 NVIDIA GPU가 있다고 가정해 보겠습니다. 터미널 창을 열고 CUDA_VISIBLE_DEVICES0으로 설정하세요(CUDA_VISIBLE_DEVICES=0). 다음 예제에서 sweep_ID를 W&B 스윕을 초기화할 때 반환되는 W&B 스윕 ID로 바꾸세요.

터미널 1

CUDA_VISIBLE_DEVICES=0 wandb agent sweep_ID

두 번째 터미널 창을 여세요. CUDA_VISIBLE_DEVICES1로 설정하세요(CUDA_VISIBLE_DEVICES=1). 이전 코드 조각에 언급된 sweep_ID에 대해 동일한 W&B 스윕 ID를 붙여넣으세요.

터미널 2

CUDA_VISIBLE_DEVICES=1 wandb agent sweep_ID

7 - Visualize sweep results

W&B App UI를 사용하여 W&B Sweeps의 결과를 시각화하세요.

W&B App UI를 사용하여 W&B Sweeps 의 결과를 시각화합니다. https://wandb.ai/home에서 W&B App UI로 이동합니다. W&B Sweep을 초기화할 때 지정한 project를 선택합니다. project workspace로 리디렉션됩니다. 왼쪽 panel에서 Sweep 아이콘(빗자루 아이콘)을 선택합니다. Sweep UI에서 목록에서 Sweep 이름을 선택합니다.

기본적으로 W&B는 W&B Sweep 작업을 시작할 때 평행 좌표 플롯, 파라미터 중요도 플롯 및 산점도를 자동으로 생성합니다.

Sweep UI 인터페이스로 이동하여 자동 생성된 플롯을 보는 방법을 보여주는 애니메이션입니다.

평행 좌표 차트는 많은 수의 하이퍼파라미터 와 model metrics 간의 관계를 한눈에 요약합니다. 평행 좌표 플롯에 대한 자세한 내용은 평행 좌표를 참조하십시오.

평행 좌표 플롯의 예.

산점도(왼쪽)는 Sweep 중에 생성된 W&B Runs 을 비교합니다. 산점도에 대한 자세한 내용은 산점도를 참조하십시오.

파라미터 중요도 플롯(오른쪽)은 metrics 의 바람직한 value 와 가장 잘 예측하고 높은 상관 관계가 있는 하이퍼파라미터 를 나열합니다. 자세한 내용은 파라미터 중요도 플롯은 파라미터 중요도를 참조하십시오.

산점도 (왼쪽) 및 파라미터 중요도 플롯 (오른쪽)의 예.

자동으로 사용되는 종속 및 독립 value (x 및 y 축)를 변경할 수 있습니다. 각 panel 에는 Edit panel 이라는 연필 아이콘이 있습니다. Edit panel 을 선택합니다. model 이 나타납니다. 모달 내에서 그래프의 행동을 변경할 수 있습니다.

모든 기본 W&B visualization 옵션에 대한 자세한 내용은 Panels를 참조하십시오. W&B Sweep의 일부가 아닌 W&B Runs 에서 플롯을 만드는 방법에 대한 자세한 내용은 Data Visualization docs를 참조하십시오.

8 - Manage sweeps with the CLI

CLI를 사용하여 W&B 스윕을 일시 중지, 재개 및 취소합니다.

CLI를 사용하여 W&B 스윕을 일시 중지, 재개 및 취소합니다. W&B 스윕을 일시 중지하면 스윕이 재개될 때까지 새로운 W&B Runs이 실행되지 않도록 W&B 에이전트에 알립니다. 스윕을 재개하면 에이전트가 새로운 W&B Runs을 계속 실행합니다. W&B 스윕을 중지하면 W&B 스윕 에이전트가 새로운 W&B Runs의 생성 또는 실행을 중지합니다. W&B 스윕을 취소하면 스윕 에이전트가 현재 실행 중인 W&B Runs을 중단하고 새로운 Runs 실행을 중지합니다.

각각의 경우, W&B 스윕을 초기화할 때 생성된 W&B 스윕 ID를 제공합니다. 선택적으로 새 터미널 창을 열어 다음 명령을 실행합니다. 새 터미널 창은 W&B 스윕이 현재 터미널 창에 출력문을 인쇄하는 경우 명령을 더 쉽게 실행할 수 있도록 합니다.

다음 지침에 따라 스윕을 일시 중지, 재개 및 취소합니다.

스윕 일시 중지

새로운 W&B Runs 실행을 일시적으로 중단하도록 W&B 스윕을 일시 중지합니다. wandb sweep --pause 코맨드를 사용하여 W&B 스윕을 일시 중지합니다. 일시 중지할 W&B 스윕 ID를 제공합니다.

wandb sweep --pause entity/project/sweep_ID

스윕 재개

wandb sweep --resume 코맨드로 일시 중지된 W&B 스윕을 재개합니다. 재개할 W&B 스윕 ID를 제공합니다.

wandb sweep --resume entity/project/sweep_ID

스윕 중지

새로운 W&B Runs 실행을 중지하고 현재 실행 중인 Runs을 완료하도록 W&B 스윕을 완료합니다.

wandb sweep --stop entity/project/sweep_ID

스윕 취소

실행 중인 모든 Runs을 중단하고 새로운 Runs 실행을 중지하도록 스윕을 취소합니다. wandb sweep --cancel 코맨드를 사용하여 W&B 스윕을 취소합니다. 취소할 W&B 스윕 ID를 제공합니다.

wandb sweep --cancel entity/project/sweep_ID

전체 CLI 코맨드 옵션 목록은 wandb sweep CLI 레퍼런스 가이드를 참조하세요.

여러 에이전트에서 스윕 일시 중지, 재개, 중지 및 취소

단일 터미널에서 여러 에이전트에 걸쳐 W&B 스윕을 일시 중지, 재개, 중지 또는 취소합니다. 예를 들어, 다중 코어 머신이 있다고 가정합니다. W&B 스윕을 초기화한 후 새 터미널 창을 열고 각 새 터미널에 스윕 ID를 복사합니다.

터미널 내에서 wandb sweep CLI 코맨드를 사용하여 W&B 스윕을 일시 중지, 재개, 중지 또는 취소합니다. 예를 들어, 다음 코드 조각은 CLI를 사용하여 여러 에이전트에서 W&B 스윕을 일시 중지하는 방법을 보여줍니다.

wandb sweep --pause entity/project/sweep_ID

에이전트에서 스윕을 재개하려면 스윕 ID와 함께 --resume 플래그를 지정합니다.

wandb sweep --resume entity/project/sweep_ID

W&B 에이전트를 병렬화하는 방법에 대한 자세한 내용은 에이전트 병렬화를 참조하세요.

9 - Learn more about sweeps

스윕에 유용한 소스 모음입니다.

학술 논문

Li, Lisha, 외. “Hyperband: A novel bandit-based approach to hyperparameter optimization.The Journal of Machine Learning Research 18.1 (2017): 6765-6816.

Sweep Experiments

다음 W&B Reports는 W&B Sweeps를 사용한 하이퍼파라미터 최적화 실험의 프로젝트 예제를 보여줍니다.

selfm-anaged

다음 방법 가이드는 W&B로 실제 문제를 해결하는 방법을 보여줍니다.

  • Sweeps with XGBoost
    • 설명: XGBoost를 사용하여 하이퍼파라미터 튜닝을 위해 W&B Sweeps를 사용하는 방법.

Sweep GitHub repository

W&B는 오픈 소스를 옹호하며 커뮤니티의 기여를 환영합니다. GitHub 저장소는 https://github.com/wandb/sweeps에서 찾을 수 있습니다. W&B 오픈 소스 레포지토리에 기여하는 방법에 대한 자세한 내용은 W&B GitHub Contribution guidelines를 참조하십시오.

10 - Manage algorithms locally

W&B 클라우드 호스팅 서비스를 사용하는 대신 로컬에서 알고리즘을 검색하고 중지합니다.

하이퍼파라미터 컨트롤러는 기본적으로 Weights & Biases에서 클라우드 서비스로 호스팅됩니다. W&B 에이전트는 컨트롤러와 통신하여 트레이닝에 사용할 다음 파라미터 세트를 결정합니다. 또한 컨트롤러는 조기 중단 알고리즘을 실행하여 중단할 수 있는 run을 결정합니다.

로컬 컨트롤러 기능을 사용하면 사용자가 로컬에서 검색 및 중단 알고리즘을 시작할 수 있습니다. 로컬 컨트롤러는 사용자에게 문제를 디버그하고 클라우드 서비스에 통합할 수 있는 새로운 기능을 개발하기 위해 코드를 검사하고 계측할 수 있는 기능을 제공합니다.

시작하기 전에 W&B SDK(wandb)를 설치해야 합니다. 커맨드라인에 다음 코드 조각을 입력하세요.

pip install wandb sweeps

다음 예제에서는 이미 구성 파일과 트레이닝 루프가 Python 스크립트 또는 Jupyter Notebook에 정의되어 있다고 가정합니다. 구성 파일을 정의하는 방법에 대한 자세한 내용은 스윕 구성 정의를 참조하세요.

커맨드라인에서 로컬 컨트롤러 실행

W&B에서 클라우드 서비스로 호스팅하는 하이퍼파라미터 컨트롤러를 사용할 때와 유사하게 스윕을 초기화합니다. 컨트롤러 플래그(controller)를 지정하여 W&B 스윕 작업에 로컬 컨트롤러를 사용하려는 의사를 나타냅니다.

wandb sweep --controller config.yaml

또는 스윕 초기화와 로컬 컨트롤러 사용 지정 단계를 분리할 수 있습니다.

단계를 분리하려면 먼저 스윕의 YAML 구성 파일에 다음 키-값을 추가합니다.

controller:
  type: local

다음으로 스윕을 초기화합니다.

wandb sweep config.yaml

스윕을 초기화한 후 wandb controller로 컨트롤러를 시작합니다.

# wandb sweep 코맨드는 sweep_id를 출력합니다.
wandb controller {user}/{entity}/{sweep_id}

로컬 컨트롤러를 사용하도록 지정했으면 스윕을 실행하기 위해 하나 이상의 Sweep 에이전트를 시작합니다. 평소와 같은 방식으로 W&B 스윕을 시작합니다. 자세한 내용은 스윕 에이전트 시작을 참조하세요.

wandb sweep sweep_ID

W&B Python SDK로 로컬 컨트롤러 실행

다음 코드 조각은 W&B Python SDK로 로컬 컨트롤러를 지정하고 사용하는 방법을 보여줍니다.

Python SDK로 컨트롤러를 사용하는 가장 간단한 방법은 스윕 ID를 wandb.controller 메서드에 전달하는 것입니다. 다음으로 반환 오브젝트 run 메서드를 사용하여 스윕 작업을 시작합니다.

sweep = wandb.controller(sweep_id)
sweep.run()

컨트롤러 루프를 더 세밀하게 제어하려면:

import wandb

sweep = wandb.controller(sweep_id)
while not sweep.done():
    sweep.print_status()
    sweep.step()
    time.sleep(5)

또는 제공되는 파라미터를 훨씬 더 세밀하게 제어할 수 있습니다.

import wandb

sweep = wandb.controller(sweep_id)
while not sweep.done():
    params = sweep.search()
    sweep.schedule(params)
    sweep.print_status()

코드로 스윕을 완전히 지정하려면 다음과 같이 할 수 있습니다.

import wandb

sweep = wandb.controller()
sweep.configure_search("grid")
sweep.configure_program("train-dummy.py")
sweep.configure_controller(type="local")
sweep.configure_parameter("param1", value=3)
sweep.create()
sweep.run()

11 - Sweeps troubleshooting

일반적인 W&B 스윕 문제를 해결합니다.

다음 가이드라인을 참고하여 자주 발생하는 오류 메시지를 해결하세요.

CommError, Run does not existERROR Error uploading

이 두 오류 메시지가 모두 반환되는 경우 W&B Run ID가 정의되었을 수 있습니다. 예를 들어 Jupyter Notebook 또는 Python 스크립트에 다음과 유사한 코드 조각이 정의되어 있을 수 있습니다.

wandb.init(id="some-string")

W&B는 W&B Sweeps에서 생성된 Runs에 대해 무작위의 고유한 ID를 자동으로 생성하므로 W&B Sweeps에 대한 Run ID를 설정할 수 없습니다.

W&B Run ID는 프로젝트 내에서 고유해야 합니다.

테이블과 그래프에 표시될 사용자 지정 이름을 설정하려면 W&B를 초기화할 때 name 파라미터에 이름을 전달하는 것이 좋습니다. 예:

wandb.init(name="a helpful readable run name")

Cuda out of memory

이 오류 메시지가 표시되면 코드 리팩터링을 통해 프로세스 기반 실행을 사용하세요. 특히, 코드를 Python 스크립트로 다시 작성하세요. 또한 W&B Python SDK 대신 CLI에서 W&B Sweep 에이전트를 호출하세요.

예를 들어 코드를 train.py라는 Python 스크립트로 다시 작성한다고 가정합니다. 트레이닝 스크립트 이름(train.py)을 YAML Sweep 구성 파일(config.yaml (이 예시))에 추가합니다.

program: train.py
method: bayes
metric:
  name: validation_loss
  goal: maximize
parameters:
  learning_rate:
    min: 0.0001
    max: 0.1
  optimizer:
    values: ["adam", "sgd"]

다음으로, 다음 코드를 train.py Python 스크립트에 추가합니다.

if _name_ == "_main_":
    train()

CLI로 이동하여 wandb sweep 명령어로 W&B Sweep을 초기화합니다.

wandb sweep config.yaml

반환된 W&B Sweep ID를 기록해 둡니다. 다음으로, Python SDK(wandb.agent) 대신 CLI를 사용하여 wandb agent로 Sweep 작업을 시작합니다. 아래 코드 조각에서 sweep_ID를 이전 단계에서 반환된 Sweep ID로 바꿉니다.

wandb agent sweep_ID

anaconda 400 error

다음 오류는 일반적으로 최적화하려는 메트릭을 로깅하지 않을 때 발생합니다.

wandb: ERROR Error while calling W&B API: anaconda 400 error: 
{"code": 400, "message": "TypeError: bad operand type for unary -: 'NoneType'"}

YAML 파일 또는 중첩된 사전 내에서 최적화할 “metric"이라는 키를 지정합니다. 이 메트릭을 반드시 로깅(wandb.log)해야 합니다. 또한 Python 스크립트 또는 Jupyter Notebook 내에서 스윕을 최적화하도록 정의한 정확한 메트릭 이름을 사용해야 합니다. 구성 파일에 대한 자세한 내용은 스윕 구성 정의를 참조하세요.

12 - Sweeps UI

Sweeps UI의 다양한 구성 요소에 대해 설명합니다.

상태 (State), 생성 시간 (Created), 스윕을 시작한 엔티티 (Creator), 완료된 run 수 (Run count) 및 스윕을 계산하는 데 걸린 시간 (Compute time)이 Sweeps UI에 표시됩니다. 스윕이 생성할 것으로 예상되는 run 수 (Est. Runs)는 이산 검색 공간에서 그리드 검색을 수행할 때 제공됩니다. 인터페이스에서 스윕을 클릭하여 스윕을 일시 중지, 재개, 중지 또는 중단할 수도 있습니다.

13 - Tutorial: Create sweep job from project

기존 W&B 프로젝트에서 스윕 작업을 생성하는 방법에 대한 튜토리얼입니다.

이 튜토리얼에서는 기존의 W&B 프로젝트에서 스윕 작업을 생성하는 방법을 설명합니다. Fashion MNIST 데이터셋을 사용하여 이미지를 분류하는 방법을 PyTorch 컨볼루션 신경망을 트레이닝합니다. 필요한 코드와 데이터셋은 W&B 저장소에 있습니다: https://github.com/wandb/examples/tree/master/examples/pytorch/pytorch-cnn-fashion

W&B 대시보드에서 결과를 살펴보세요.

1. 프로젝트 생성

먼저, 베이스라인을 만듭니다. W&B 예제 GitHub 저장소에서 PyTorch MNIST 데이터셋 예제 모델을 다운로드합니다. 다음으로, 모델을 트레이닝합니다. 트레이닝 스크립트는 examples/pytorch/pytorch-cnn-fashion 디렉토리 내에 있습니다.

  1. 이 저장소를 클론합니다: git clone https://github.com/wandb/examples.git
  2. 이 예제를 엽니다: cd examples/pytorch/pytorch-cnn-fashion
  3. run을 수동으로 실행합니다: python train.py

선택적으로 W&B App UI 대시보드에 나타나는 예제를 탐색합니다.

예제 프로젝트 페이지 보기 →

2. 스윕 생성

프로젝트 페이지에서 사이드바의 Sweep tab을 열고 Create Sweep을 선택합니다.

자동 생성된 설정은 완료한 run을 기반으로 스윕할 값을 추측합니다. 시도할 하이퍼파라미터 범위를 지정하도록 설정을 편집합니다. 스윕을 시작하면 호스팅된 W&B 스윕 서버에서 새 프로세스가 시작됩니다. 이 중앙 집중식 서비스는 트레이닝 작업을 실행하는 머신인 에이전트를 조정합니다.

3. 에이전트 시작

다음으로, 로컬에서 에이전트를 시작합니다. 작업을 분산하고 스윕 작업을 더 빨리 완료하려면 최대 20개의 에이전트를 서로 다른 머신에서 병렬로 시작할 수 있습니다. 에이전트는 다음에 시도할 파라미터 세트를 출력합니다.

이제 스윕을 실행하고 있습니다. 다음 이미지는 예제 스윕 작업이 실행되는 동안 대시보드가 어떻게 보이는지 보여줍니다. 예제 프로젝트 페이지 보기 →

기존 run으로 새 스윕 시드하기

이전에 기록한 기존 run을 사용하여 새 스윕을 시작합니다.

  1. 프로젝트 테이블을 엽니다.
  2. 테이블 왼쪽에서 확인란을 사용하여 사용할 run을 선택합니다.
  3. 드롭다운을 클릭하여 새 스윕을 만듭니다.

이제 스윕이 서버에 설정됩니다. run 실행을 시작하려면 하나 이상의 에이전트를 시작하기만 하면 됩니다.