메인 콘텐츠로 건너뛰기
W&B Report 및 Workspace API는 Public Preview 단계입니다.
Colab에서 실행해 보기 워크스페이스를 프로그래밍 방식으로 생성, 관리, 사용자 정의하여 머신러닝 실험을 더 효과적으로 구성하고 시각화할 수 있습니다. wandb-workspaces W&B 라이브러리를 사용해 구성(configuration)을 정의하고, 패널 레이아웃을 설정하며, 섹션을 구성할 수 있습니다. URL로 워크스페이스를 불러와 수정할 수 있고, 실행을 필터링하고 그룹화하기 위한 표현식을 사용하며, 실행의 표시 방식을 사용자 정의할 수 있습니다. wandb-workspaces는 프로그래밍 방식으로 W&B WorkspacesReports를 생성하고 사용자 정의하기 위한 Python 라이브러리입니다. 이 튜토리얼에서는 구성을 정의하고 패널 레이아웃을 설정하며 섹션을 구성해 wandb-workspaces로 워크스페이스를 생성하고 사용자 정의하는 방법을 살펴봅니다.

이 노트북 사용 방법

  • 각 셀을 한 번에 하나씩 순서대로 실행하세요.
  • 셀을 실행한 후 출력되는 URL을 복사해 붙여넣어 워크스페이스에 적용된 변경 사항을 확인하세요.
워크스페이스에 대한 프로그램을 통한 상호작용은 현재 저장된 워크스페이스 뷰에 대해서만 지원됩니다. 저장된 워크스페이스 뷰는 워크스페이스의 협업용 스냅샷입니다. 팀의 누구나 저장된 워크스페이스 뷰를 열람, 편집하고 변경 내용을 저장할 수 있습니다.

1. 의존성 설치 및 가져오기

# 의존성 설치
!pip install wandb wandb-workspaces rich
# 의존성 가져오기
import os
import wandb
import wandb_workspaces.workspaces as ws
import wandb_workspaces.reports.v2 as wr # 패널 추가를 위해 Reports API를 사용합니다

# 출력 형식 개선
%load_ext rich

2. 새 프로젝트와 워크스페이스 생성

이 튜토리얼에서는 wandb_workspaces API를 실험해 보기 위해 새 프로젝트를 생성하겠습니다. 참고: 고유한 Saved view URL을 사용하여 기존 워크스페이스를 불러올 수 있습니다. 다음 코드 블록에서 그 방법을 확인하세요.
# W&B 초기화 및 로그인
wandb.login()

# 새 프로젝트를 생성하고 샘플 데이터를 기록하는 함수
def create_project_and_log_data():
    project = "workspace-api-example"  # 기본 프로젝트 이름

    # 샘플 데이터를 기록하기 위한 실행 초기화
    with wandb.init(project=project, name="sample_run") as run:
        for step in range(100):
            run.log({
                "Step": step,
                "val_loss": 1.0 / (step + 1),
                "val_accuracy": step / 100.0,
                "train_loss": 1.0 / (step + 2),
                "train_accuracy": step / 110.0,
                "f1_score": step / 100.0,
                "recall": step / 120.0,
            })
    return project

# 새 프로젝트 생성 및 데이터 기록
project = create_project_and_log_data()
entity = wandb.Api().default_entity

(선택 사항) 기존 프로젝트와 워크스페이스 로드하기

새 프로젝트를 만드는 대신, 이미 존재하는 본인의 프로젝트와 워크스페이스를 로드할 수 있습니다. 이를 위해 고유한 워크스페이스 URL을 찾아 문자열 형태로 ws.Workspace.from_url에 전달합니다. URL 형식은 https://wandb.ai/[SOURCE-ENTITY]/[SOURCE-USER]?nw=abc 입니다. 예를 들어:
wandb.login()

workspace = ws.Workspace.from_url("https://wandb.ai/[SOURCE-ENTITY]/[SOURCE-USER]?nw=abc").

workspace = ws.Workspace(
    entity="NEW-ENTITY",
    project=NEW-PROJECT,
    name="NEW-SAVED-VIEW-NAME"
)

3. 프로그래밍 방식 워크스페이스 예제

아래는 프로그래밍 방식 워크스페이스 기능을 사용하는 방법의 예제입니다:
# 워크스페이스, 섹션, 패널에 사용 가능한 모든 설정을 확인합니다.
all_settings_objects = [x for x in dir(ws) if isinstance(getattr(ws, x), type)]
all_settings_objects

saved view로 workspace 생성하기

이 예제는 새 workspace를 생성하고 섹션과 패널로 구성하는 방법을 보여줍니다. workspace는 일반적인 Python 객체처럼 수정할 수 있어 유연하고 사용하기 쉽습니다.
def sample_workspace_saved_example(entity: str, project: str) -> str:
    workspace: ws.Workspace = ws.Workspace(
        name="Example W&B Workspace",
        entity=entity,
        project=project,
        sections=[
            ws.Section(
                name="Validation Metrics",
                panels=[
                    wr.LinePlot(x="Step", y=["val_loss"]),
                    wr.BarPlot(metrics=["val_accuracy"]),
                    wr.ScalarChart(metric="f1_score", groupby_aggfunc="mean"),
                ],
                is_open=True,
            ),
        ],
    )
    workspace.save()
    print("Sample Workspace saved.")
    return workspace.url

workspace_url: str = sample_workspace_saved_example(entity, project)

URL에서 워크스페이스 불러오기

원본 설정에 영향을 주지 않고 워크스페이스를 복제하고 사용자 지정할 수 있습니다. 이렇게 하려면 기존 워크스페이스를 불러온 다음 새 뷰로 저장하세요.
def save_new_workspace_view_example(url: str) -> None:
    workspace: ws.Workspace = ws.Workspace.from_url(url)

    workspace.name = "Updated Workspace Name"
    workspace.save_as_new_view()

    print(f"워크스페이스가 새 뷰로 저장되었습니다.")

save_new_workspace_view_example(workspace_url)
워크스페이스 이름이 이제 “Updated Workspace Name”으로 변경된 점에 유의하세요.

기본 설정

다음 코드는 워크스페이스를 생성하고 섹션에 패널을 추가한 뒤, 워크스페이스와 개별 섹션 및 패널에 대한 설정을 구성하는 방법을 보여줍니다.
# 사용자 정의 설정으로 워크스페이스를 생성하고 구성하는 함수
def custom_settings_example(entity: str, project: str) -> None:
    workspace: ws.Workspace = ws.Workspace(name="An example workspace", entity=entity, project=project)
    workspace.sections = [
        ws.Section(
            name="Validation",
            panels=[
                wr.LinePlot(x="Step", y=["val_loss"]),
                wr.LinePlot(x="Step", y=["val_accuracy"]),
                wr.ScalarChart(metric="f1_score", groupby_aggfunc="mean"),
                wr.ScalarChart(metric="recall", groupby_aggfunc="mean"),
            ],
            is_open=True,
        ),
        ws.Section(
            name="Training",
            panels=[
                wr.LinePlot(x="Step", y=["train_loss"]),
                wr.LinePlot(x="Step", y=["train_accuracy"]),
            ],
            is_open=False,
        ),
    ]

    workspace.settings = ws.WorkspaceSettings(
        x_axis="Step",
        x_min=0,
        x_max=75,
        smoothing_type="gaussian",
        smoothing_weight=20.0,
        ignore_outliers=False,
        remove_legends_from_panels=False,
        tooltip_number_of_runs="default",
        tooltip_color_run_names=True,
        max_runs=20,
        point_visualization_method="bucketing",
        auto_expand_panel_search_results=False,
    )

    section = workspace.sections[0]
    section.panel_settings = ws.SectionPanelSettings(
        x_min=25,
        x_max=50,
        smoothing_type="none",
    )

    panel = section.panels[0]
    panel.title = "Validation Loss Custom Title"
    panel.title_x = "Custom x-axis title"

    workspace.save()
    print("사용자 정의 설정이 적용된 워크스페이스가 저장되었습니다.")

# 워크스페이스를 생성하고 구성하는 함수 실행
custom_settings_example(entity, project)
이제 “An example workspace”라는 이름의 다른 저장된 보기를 보고 있다는 점에 유의하세요.

실행 사용자 지정

다음 코드 셀은 실행을 프로그래밍 방식으로 필터링하고, 색상을 변경하고, 그룹화하고, 정렬하는 방법을 보여줍니다. 각 예제에서 공통적인 작업 흐름은 원하는 사용자 지정을 ws.RunsetSettings의 적절한 매개변수에 인자로 지정하는 것입니다.

실행 필터링

Python 표현식과 wandb.log으로 기록한 메트릭, 실행의 일부로 자동으로 기록되는 Created Timestamp와 같은 메트릭을 사용해 필터를 만들 수 있습니다. 또한 W&B 앱 UI에 표시되는 Name, Tags, ID를 기준으로 필터를 설정할 수도 있습니다. 다음 예시는 검증 손실 요약, 검증 정확도 요약, 그리고 지정한 정규식을 기반으로 실행을 필터링하는 방법을 보여줍니다:
def advanced_filter_example(entity: str, project: str) -> None:
    # 프로젝트의 모든 실행 가져오기
    runs: list = wandb.Api().runs(f"{entity}/{project}")

    # 여러 필터 적용: val_loss < 0.1, val_accuracy > 0.8, 실행 이름이 정규식 패턴과 일치
    workspace: ws.Workspace = ws.Workspace(
        name="Advanced Filtered Workspace with Regex",
        entity=entity,
        project=project,
        sections=[
            ws.Section(
                name="Advanced Filtered Section",
                panels=[
                    wr.LinePlot(x="Step", y=["val_loss"]),
                    wr.LinePlot(x="Step", y=["val_accuracy"]),
                ],
                is_open=True,
            ),
        ],
        runset_settings=ws.RunsetSettings(
            filters=[
                (ws.Summary("val_loss") < 0.1),  # 'val_loss' 요약으로 실행 필터링
                (ws.Summary("val_accuracy") > 0.8),  # 'val_accuracy' 요약으로 실행 필터링
                (ws.Metric("ID").isin([run.id for run in wandb.Api().runs(f"{entity}/{project}")])),
            ],
            regex_query=True,
        )
    )

    # 's'로 시작하는 실행 이름과 일치하도록 정규식 검색 추가
    workspace.runset_settings.query = "^s"
    workspace.runset_settings.regex_query = True

    workspace.save()
    print("고급 필터 및 정규식 검색이 적용된 Workspace가 저장되었습니다.")

advanced_filter_example(entity, project)
필터 표현식 리스트를 전달하면 불리언 “AND” 연산이 적용됩니다.

실행 색상 변경

이 예제는 워크스페이스의 실행 색상을 변경하는 방법을 보여줍니다.
def run_color_example(entity: str, project: str) -> None:
    # 프로젝트의 모든 실행 가져오기
    runs: list = wandb.Api().runs(f"{entity}/{project}")

    # 실행에 동적으로 색상 할당
    run_colors: list = ['purple', 'orange', 'teal', 'magenta']
    run_settings: dict = {}
    for i, run in enumerate(runs):
        run_settings[run.id] = ws.RunSettings(color=run_colors[i % len(run_colors)])

    workspace: ws.Workspace = ws.Workspace(
        name="Run Colors Workspace",
        entity=entity,
        project=project,
        sections=[
            ws.Section(
                name="Run Colors Section",
                panels=[
                    wr.LinePlot(x="Step", y=["val_loss"]),
                    wr.LinePlot(x="Step", y=["val_accuracy"]),
                ],
                is_open=True,
            ),
        ],
        runset_settings=ws.RunsetSettings(
            run_settings=run_settings
        )
    )

    workspace.save()
    print("실행 색상이 적용된 Workspace가 저장되었습니다.")

run_color_example(entity, project)

실행 그룹화

이 예제는 특정 지표별로 실행을 그룹화하는 방법을 보여줍니다.
def grouping_example(entity: str, project: str) -> None:
    workspace: ws.Workspace = ws.Workspace(
        name="Grouped Runs Workspace",
        entity=entity,
        project=project,
        sections=[
            ws.Section(
                name="Grouped Runs",
                panels=[
                    wr.LinePlot(x="Step", y=["val_loss"]),
                    wr.LinePlot(x="Step", y=["val_accuracy"]),
                ],
                is_open=True,
            ),
        ],
        runset_settings=ws.RunsetSettings(
            groupby=[ws.Metric("Name")]
        )
    )
    workspace.save()
    print("그룹화된 실행이 포함된 Workspace가 저장되었습니다.")

grouping_example(entity, project)

실행 정렬

다음 예제에서는 검증 손실 요약값을 기준으로 실행을 정렬하는 방법을 보여줍니다.
def sorting_example(entity: str, project: str) -> None:
    workspace: ws.Workspace = ws.Workspace(
        name="Sorted Runs Workspace",
        entity=entity,
        project=project,
        sections=[
            ws.Section(
                name="Sorted Runs",
                panels=[
                    wr.LinePlot(x="Step", y=["val_loss"]),
                    wr.LinePlot(x="Step", y=["val_accuracy"]),
                ],
                is_open=True,
            ),
        ],
        runset_settings=ws.RunsetSettings(
            order=[ws.Ordering(ws.Summary("val_loss"))] #val_loss 요약을 사용하여 정렬
        )
    )
    workspace.save()
    print("정렬된 실행이 포함된 Workspace가 저장되었습니다.")

sorting_example(entity, project)

4. 모두 종합해 보기: 종합 예시

이 예시는 종합적인 워크스페이스를 생성하고, 설정을 지정하고, 섹션에 패널을 추가하는 방법을 보여줍니다:
def full_end_to_end_example(entity: str, project: str) -> None:
    # 프로젝트의 모든 실행 가져오기
    runs: list = wandb.Api().runs(f"{entity}/{project}")

    # 실행에 동적으로 색상을 할당하고 실행 설정 생성
    run_colors: list = ['red', 'blue', 'green', 'orange', 'purple', 'teal', 'magenta', '#FAC13C']
    run_settings: dict = {}
    for i, run in enumerate(runs):
        run_settings[run.id] = ws.RunSettings(color=run_colors[i % len(run_colors)], disabled=False)

    workspace: ws.Workspace = ws.Workspace(
        name="My Workspace Template",
        entity=entity,
        project=project,
        sections=[
            ws.Section(
                name="Main Metrics",
                panels=[
                    wr.LinePlot(x="Step", y=["val_loss"]),
                    wr.LinePlot(x="Step", y=["val_accuracy"]),
                    wr.ScalarChart(metric="f1_score", groupby_aggfunc="mean"),
                ],
                is_open=True,
            ),
            ws.Section(
                name="Additional Metrics",
                panels=[
                    wr.ScalarChart(metric="precision", groupby_aggfunc="mean"),
                    wr.ScalarChart(metric="recall", groupby_aggfunc="mean"),
                ],
            ),
        ],
        settings=ws.WorkspaceSettings(
            x_axis="Step",
            x_min=0,
            x_max=100,
            smoothing_type="none",
            smoothing_weight=0,
            ignore_outliers=False,
            remove_legends_from_panels=False,
            tooltip_number_of_runs="default",
            tooltip_color_run_names=True,
            max_runs=20,
            point_visualization_method="bucketing",
            auto_expand_panel_search_results=False,
        ),
        runset_settings=ws.RunsetSettings(
            query="",
            regex_query=False,
            filters=[
                ws.Summary("val_loss") < 1,
                ws.Metric("Name") == "sample_run",
            ],
            groupby=[ws.Metric("Name")],
            order=[ws.Ordering(ws.Summary("Step"), ascending=True)],
            run_settings=run_settings
        )
    )
    workspace.save()
    print("워크스페이스가 생성되고 저장되었습니다.")

full_end_to_end_example(entity, project)