메인 콘텐츠로 건너뛰기
wandb.init()으로 W&B run을 초기화합니다. 기본적으로 W&B는 wandb.init()을 호출할 때 각 Python 프로세스에 동시에 활성화된 run이 하나만 있다고 가정합니다. wandb.init()을 다시 호출하면 W&B는 동일한 run을 반환하거나, 새 run을 시작하기 전에 이전 run을 종료합니다. 동일한 프로세스에서 wandb.init()을 여러 번 호출할 때 W&B가 이를 어떻게 처리할지는 환경(노트북 또는 비노트북)과 reinit 설정에 따라 달라집니다. 동일한 프로세스에서 여러 활성 run을 관리하려면 하나의 프로세스에서 여러 run을 참조하세요.
W&B는 wandb.init()을 호출할 때 with 블록을 사용할 것을 권장합니다. 이렇게 하면 블록이 끝날 때 W&B가 run을 올바르게 마무리하고 모든 데이터를 업로드할 수 있습니다.

프로세스별 단일 run

다음 코드 스니펫에서는 W&B Python SDK를 임포트하고 run을 초기화하는 방법을 보여줍니다.
basic.py
import wandb

with wandb.init(entity="nico", project="awesome-project") as run:
    # 트레이닝 로직을 여기에 작성하세요
코드 스니펫을 실행하면 다음과 같은 출력이 표시됩니다:
🚀 View run exalted-darkness-6 at: 
https://wandb.ai/nico/awesome-project/runs/pgbn9y21
Find logs at: wandb/run-20241106_090747-pgbn9y21/logs
출력 결과를 보면 W&B가 entity nico 아래의 프로젝트 awesome-project에 run exalted-darkness-6를 로깅한 것을 알 수 있습니다. pgbn9y21은 W&B가 이 run에 대해 생성한 고유한 run ID입니다.

하나의 프로세스에서 여러 run 사용하기

단일 Python 프로세스에서 여러 run을 관리합니다. 이는 기본 프로세스를 활성 상태로 유지하면서 하위 작업을 위한 수명이 짧은 보조 프로세스를 생성하려는 워크플로에 유용합니다. 사용 사례는 다음과 같습니다.
  • 스크립트 전체에서 하나의 “기본” run을 활성 상태로 유지하면서, 평가나 하위 작업을 위해 수명이 짧은 “보조” run을 생성합니다.
  • 단일 파일에서 하위 실험을 오케스트레이션합니다.
  • 서로 다른 작업이나 기간을 나타내는 여러 run으로 하나의 “메인” 프로세스에서 로깅합니다.
기본적으로 W&B는 wandb.init()를 호출할 때 각 Python 프로세스에 한 번에 활성 run이 하나만 있다고 가정합니다. wandb.init()를 다시 호출하면, 설정에 따라 W&B는 동일한 run을 반환하거나 이전 run을 종료한 뒤 새 run을 시작합니다. 이 가이드에서는 단일 Python 프로세스에서 여러 run을 사용할 수 있도록 reinit를 사용해 wandb.init()의 동작을 변경하는 방법을 설명합니다.
요구 사항단일 Python 프로세스에서 여러 run을 관리하려면 W&B Python SDK 버전 v0.19.10 이상이 필요합니다.

reinit 옵션

reinit 매개변수를 사용해 W&B가 wandb.init()를 여러 번 호출할 때 이를 어떻게 처리할지 설정합니다. 다음 표에는 유효한 인자와 각 인자의 효과가 설명되어 있습니다.
설명run을 생성하나요?사용 예시
create_new기존에 활성 상태인 run을 종료하지 않고 wandb.init()로 새 run을 생성합니다. W&B는 전역 wandb.Run을 새 run으로 자동 전환하지 않습니다. 각 run 객체는 사용자가 직접 보관해야 합니다. 자세한 내용은 아래의 하나의 프로세스에서 여러 run 예제를 참조하세요.동시 실행되는 프로세스를 생성하고 관리할 때 적합합니다. 예를 들어, “primary” run은 활성 상태로 유지한 채 “secondary” run을 시작하거나 종료하는 경우입니다.
finish_previouswandb.init()로 새 run을 생성하기 전에 run.finish()로 모든 활성 run을 종료합니다. 노트북이 아닌 환경에서의 기본 동작입니다.순차적인 하위 프로세스를 각각 별도의 run으로 나누고 싶을 때 적합합니다.
return_previous가장 최근의 아직 종료되지 않은 run을 반환합니다. 노트북 환경에서의 기본 동작입니다.아니요
W&B는 Hugging Face Trainer, Keras 콜백, PyTorch Lightning처럼 단일 전역 run을 전제로 하는 W&B Integrations에서는 create_new 모드를 지원하지 않습니다. 이러한 인테그레이션을 사용하는 경우에는 각 하위 실험을 별도의 프로세스에서 실행해야 합니다.

reinit 지정하기

  • reinit 인수를 직접 지정해 wandb.init()을 사용합니다:
    import wandb
    with wandb.init(reinit="<create_new|finish_previous|return_previous>") as run:
        # 여기에 코드를 작성하세요
    
  • wandb.init()을 사용하고 wandb.Settings 객체를 settings 매개변수에 전달합니다. Settings 객체에서 reinit를 지정합니다:
    import wandb
    with wandb.init(settings=wandb.Settings(reinit="<create_new|finish_previous|return_previous>")) as run:
        # 여기에 코드를 작성하세요
    
  • wandb.setup()을 사용해 현재 프로세스의 모든 run에 대해 reinit 옵션을 전역으로 설정합니다. 동작을 한 번 설정해 두고, 해당 프로세스에서 이후 수행되는 모든 wandb.init() 호출에 적용하려는 경우 유용합니다.
    import wandb
    with wandb.setup(wandb.Settings(reinit="<create_new|finish_previous|return_previous>")) as run:
         # 여기에 코드를 작성하세요
    
  • 환경 변수 WANDB_REINIT에 원하는 reinit 값을 지정합니다. 환경 변수를 정의하면 reinit 옵션이 wandb.init() 호출에 적용됩니다.
    export WANDB_REINIT="<create_new|finish_previous|return_previous>"
    
다음 코드 스니펫은 wandb.init()을 호출할 때마다 새 run이 생성되도록 W&B를 설정하는 방법을 개략적으로 보여줍니다:
import wandb

wandb.setup(wandb.Settings(reinit="create_new"))

with wandb.init() as experiment_results_run:
    # 이 run은 각 실험의 결과를 로깅하는 데 사용됩니다.
    # 결과를 수집하는 상위 run으로 생각할 수 있습니다.
      with wandb.init() as run:
         # do_experiment() 함수는 세분화된 메트릭을 지정된 run에 로깅하고,
         # 별도로 추적하려는 결과 메트릭을 반환합니다.
         experiment_results = do_experiment(run)

         # 각 실험이 끝난 후, 결과를 상위 run에 로깅합니다.
         # 상위 run의 차트에서 각 점은 하나의 실험 결과에 해당합니다.
         experiment_results_run.log(experiment_results)

예제: 동시 프로세스

스크립트가 실행되는 전체 시간 동안 열린 상태를 유지하는 기본 프로세스를 만들고, 기본 프로세스를 종료하지 않은 채 주기적으로 수명이 짧은 보조 프로세스를 생성하려는 상황을 가정해 보겠습니다. 예를 들어, 이 패턴은 기본 run에서 모델을 트레이닝하는 동안 평가를 계산하거나 다른 작업을 별도의 run에서 수행하려는 경우에 유용할 수 있습니다. 이를 위해 reinit="create_new"를 사용해 여러 run을 초기화합니다. 이 예제에서는 “Run A”를 스크립트 전체에서 열린 상태로 유지되는 기본 프로세스로, “Run B1”과 “Run B2”를 평가와 같은 작업을 위한 수명이 짧은 보조 run으로 가정합니다. 전체적인 워크플로는 다음과 같습니다:
  1. wandb.init()으로 기본 프로세스 Run A를 초기화하고 트레이닝 메트릭을 로깅합니다.
  2. Run B1을 초기화하고(wandb.init() 사용) 데이터를 로깅한 다음 종료합니다.
  3. Run A에 데이터를 추가로 로깅합니다.
  4. Run B2를 초기화하고 데이터를 로깅한 다음 종료합니다.
  5. Run A에 계속 로깅합니다.
  6. 마지막으로 끝에서 Run A를 종료합니다.
다음 Python 코드 예제는 이 워크플로를 보여줍니다:
import wandb

def train(name: str) -> None:
    """자체 W&B run에서 트레이닝을 한 번 수행합니다.

    `reinit="create_new"`와 함께 'with wandb.init()' 블록을 사용하면
    다른 run(기본 추적 run 등)이 이미 활성 상태인 경우에도
    이 트레이닝 서브 run을 생성할 수 있습니다.
    """
    with wandb.init(
        project="my_project",
        name=name,
        reinit="create_new"
    ) as run:
        # 실제 스크립트에서는 이 블록 안에서 트레이닝 step을 실행합니다.
        run.log({"train_loss": 0.42})  # 실제 metric으로 교체하세요

def evaluate_loss_accuracy() -> (float, float):
    """현재 모델의 loss와 accuracy를 반환합니다.
    
    이 플레이스홀더를 실제 평가 로직으로 교체하세요.
    """
    return 0.27, 0.91  # 예시 metric 값

# 여러 트레이닝/평가 step 동안 활성 상태를 유지하는 '기본' run을 생성합니다.
with wandb.init(
    project="my_project",
    name="tracking_run",
    reinit="create_new"
) as tracking_run:
    # 1) 'training_1'이라는 서브 run에서 트레이닝을 한 번 실행합니다
    train("training_1")
    loss, accuracy = evaluate_loss_accuracy()
    tracking_run.log({"eval_loss": loss, "eval_accuracy": accuracy})

    # 2) 'training_2'라는 서브 run에서 트레이닝을 다시 실행합니다
    train("training_2")
    loss, accuracy = evaluate_loss_accuracy()
    tracking_run.log({"eval_loss": loss, "eval_accuracy": accuracy})
    
    # 이 'with' 블록이 종료되면 'tracking_run'이 자동으로 완료됩니다.
이전 예제에서 다음 핵심 사항을 확인하세요:
  1. reinit="create_new"를 사용하면 wandb.init()를 호출할 때마다 새 run이 생성됩니다.
  2. 각 run에 대한 참조를 유지하세요. wandb.runreinit="create_new"로 생성한 새 run을 자동으로 가리키지 않습니다. 새 run은 run_a, run_b1 같은 변수에 저장하고, 필요에 따라 해당 객체에서 .log() 또는 .finish()를 호출하세요.
  3. 기본 run은 계속 열어 둔 채, 하위 run은 원할 때마다 종료할 수 있습니다.
  4. run에 로깅을 마쳤다면 run.finish()로 run을 종료하세요. 이렇게 하면 모든 데이터가 업로드되고 run이 올바르게 종료됩니다.