메인 콘텐츠로 건너뛰기
run 포크 기능은 현재 활발히 개발 중이며 비공개 프리뷰 상태입니다. 이 기능에 대한 access를 요청하려면 support@wandb.com의 W&B 지원팀에 문의하세요.
원본 run에 영향을 주지 않고 실험의 특정 지점에서 다양한 하이퍼파라미터나 모델을 탐색할 수 있습니다. 이렇게 하려면 기존 W&B run에서 포크하세요. run에서 포크하면 W&B는 소스 run의 고유 ID와 지정한 step을 사용해 새 run을 생성합니다. 소스 run의 summary 메트릭은 포크된 run으로 복사됩니다. 포크된 run은 지정한 step까지 소스 run의 모든 이력과 파일을 공유합니다. 포크 step 이후에는 원본 run과 독립적으로 포크된 run에 새 데이터를 로깅할 수 있습니다. 아래 코드로 생성된 포크된 run의 라이브 데모를 확인하세요.
  • run 포크를 사용하려면 wandb SDK 버전이 0.16.5 이상이어야 합니다.
  • run 포크를 사용하려면 step이 단조 증가해야 합니다. define_metric()로 정의된 비단조 step을 사용하는 run에서는 포크할 수 없습니다. 비단조 step은 run 이력과 시스템 메트릭의 시간순 순서를 깨뜨립니다.
포크된 run을 시작할 소스 run의 고유한 run IDstepwandb.init()fork_from 인자로 지정하세요.

이전에 로깅된 run에서 포크하기

다음 코드 스니펫은 이전에 W&B에 로깅한 run에서 포크하는 방법을 보여줍니다. 먼저, 포크하려는 run의 run ID를 획득합니다. 다음으로, wandb.init()fork_from에 포크할 run ID와 포크할 step을 인수로 지정합니다. 다음 코드를 Python 스크립트 또는 노트북 셀에 복사하여 붙여넣으세요. <source-run-id>, <project>, <entity>를 자신의 값으로 바꾸세요:
import wandb

# 포크할 소스 run의 고유 ID
source_run_id = "<source-run-id>"

# 포크할 step 지정
fork_step = 200

# run 포크
with wandb.init(
    project="<project>",
    entity="<entity>",
    fork_from=f"{source_run_id}?_step={fork_step}",
) as forked_run:
    pass

동일한 스크립트에서 run에서 포크하기

다음 코드 스니펫에서는 동일한 스크립트 내에서 run을 생성한 뒤, 그 run에서 포크하는 방법을 보여줍니다. 이는 W&B App에서 run ID를 따로 조회하지 않고 방금 생성한 run에서 바로 포크하려는 경우에 유용합니다. 먼저 run을 초기화하고 일부 데이터를 로깅합니다. 다음으로, 원래 run 객체의 id 속성을 사용해 해당 run의 run ID를 획득합니다. 마지막으로, 새 run을 초기화한 다음 원래 run의 ID와 포크를 시작할 step을 wandb.init()fork_from에 인수로 전달합니다.
import wandb

# run 초기화
with wandb.init(
    project="<project>",
    entity="<entity>"
) as original_run:
    # ...트레이닝 로직을 여기에 작성하세요 ...
    pass

# 포크할 step 지정
fork_step = int("<num>")

# 원본 run의 ID를 사용하여 포크할 step 지정
with wandb.init(
    project="<project>",
    entity="<entity>",
    fork_from=f"{original_run.id}?_step={fork_step}",
) as forked_run:
    # ...트레이닝 로직을 여기에 작성하세요 ...
    pass
원본 run의 고유한 run ID를 획득하려면 original_run.id 속성을 사용하세요.

예제 스크립트

예를 들어, 다음 코드 예제는 먼저 run을 포크한 다음 트레이닝 step 200부터 포크된 run에 메트릭을 기록하는 방법을 보여줍니다. 다음 코드를 Python 스크립트 또는 노트북 셀에 복사하여 붙여넣으세요. <project><entity>를 자신의 값으로 바꾸세요.
import wandb
import math

# 첫 번째 run을 초기화하고 일부 메트릭을 로깅합니다
with wandb.init(
    project="<project>",
    entity="<entity>"
) as run1:
    for i in range(300):
        run1.log({"metric": i})

# 특정 step에서 첫 번째 run을 포크하고
# step 200부터 메트릭을 로깅합니다
with wandb.init(
    project="<project>", 
    entity="<entity>", 
    fork_from=f"{run1.id}?_step=200"
) as run2:
    # 새 run에서 계속 로깅합니다
    # 처음 몇 step은 run1의 메트릭을 그대로 로깅합니다
    # step 250 이후부터 스파이크 패턴 로깅을 시작합니다
    for i in range(200, 300):
        if i < 250:
            # 스파이크 없이 run1에서 계속 로깅합니다
            metric_value = i
        else:
            # step 250부터 스파이크 동작을 적용합니다
            metric_value = i + (2 * math.sin(i / 3.0))  # 미묘한 스파이크 패턴을 적용합니다

        # 두 메트릭이 동일한 step에 로깅되도록 단일 Call로 로깅합니다
        run2.log({
            "metric": metric_value,
            "additional_metric": i * 1.1
        })
Rewind와 포크의 호환성포크는 rewind를 보완하여 run을 관리하고 실험하는 데 더 큰 유연성을 제공합니다.run에서 포크하면 W&B는 특정 시점의 run에서 새 브랜치를 생성해 다른 파라미터나 모델을 사용해 볼 수 있게 합니다.run을 rewind하면 W&B는 run 이력 자체를 바로잡거나 수정할 수 있게 합니다.