메인 콘텐츠로 건너뛰기
W&B Report 및 Workspace API는 퍼블릭 프리뷰(Public Preview) 상태입니다.
Try in Colab 프로그램 방식으로 Workspace를 생성, 관리 및 커스텀하여 기계학습 실험을 더 효과적으로 정리하고 시각화하세요. wandb-workspaces W&B 라이브러리를 사용하여 설정을 정의하고, 패널 레이아웃을 구성하며, 섹션을 정리할 수 있습니다. URL을 통해 Workspace를 로드하고 수정할 수 있으며, 표현식을 사용하여 Runs를 필터링 및 그룹화하고, Runs의 모양을 커스텀할 수 있습니다. wandb-workspaces는 프로그램 방식으로 W&B WorkspacesReports를 생성하고 커스텀하기 위한 Python 라이브러리입니다. 이 튜토리얼에서는 wandb-workspaces를 사용하여 설정을 정의하고, 패널 레이아웃을 설정하며, 섹션을 구성하여 Workspace를 생성하고 커스텀하는 방법을 알아봅니다.

이 노트북 사용 방법

  • 각 셀을 하나씩 실행합니다.
  • 셀 실행 후 출력되는 URL을 복사하여 붙여넣어 Workspace에 적용된 변경 사항을 확인합니다.
Workspace와의 프로그램 방식 상호작용은 현재 Saved workspaces views에 대해 지원됩니다. Saved workspaces views는 Workspace의 협업 가능한 스냅샷입니다. 팀의 모든 구성원이 저장된 Workspace 뷰를 보고, 편집하고, 변경 사항을 저장할 수 있습니다.

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. 새 Project 및 Workspace 생성

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

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

    # 샘플 데이터를 로그하기 위한 run 초기화
    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

(선택 사항) 기존 프로젝트 및 Workspace 로드

새 프로젝트를 만드는 대신, 본인의 기존 프로젝트와 Workspace 중 하나를 로드할 수 있습니다. 이를 위해 고유한 Workspace 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. 프로그램 방식 Workspace 예제

아래는 프로그램 방식 Workspace 기능을 사용하는 예제들입니다.
# Workspace, 섹션 및 패널에서 사용 가능한 모든 설정 오브젝트 확인
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에서 Workspace 로드

원본 설정에 영향을 주지 않고 Workspace를 복제하고 커스텀할 수 있습니다. 이를 위해 기존 Workspace를 로드하고 새 뷰로 저장합니다.
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"Workspace saved as new view.")

save_new_workspace_view_example(workspace_url)
이제 Workspace 이름이 “Updated Workspace Name”으로 변경된 것을 확인할 수 있습니다.

기본 설정

다음 코드는 Workspace를 생성하고, 패널이 포함된 섹션을 추가하며, Workspace, 개별 섹션 및 패널에 대한 설정을 구성하는 방법을 보여줍니다.
# 커스텀 설정으로 Workspace를 생성하고 구성하는 함수
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("Workspace with custom settings saved.")

# 함수를 실행하여 Workspace 생성 및 구성
custom_settings_example(entity, project)
이제 “An example workspace”라는 다른 저장된 뷰를 보고 있게 됩니다.

Runs 커스텀

다음 코드 셀은 프로그램 방식으로 Runs를 필터링하고, 색상을 변경하며, 그룹화하고 정렬하는 방법을 보여줍니다. 각 예제에서 일반적인 워크플로우는 ws.RunsetSettings의 적절한 파라미터에 원하는 커스텀 설정을 인수로 지정하는 것입니다.

Runs 필터링

Python 표현식과 wandb.log로 로그한 메트릭 또는 Created Timestamp와 같이 자동으로 로그된 데이터를 사용하여 필터를 만들 수 있습니다. 또한 W&B 앱 UI에 표시되는 Name, Tags, 또는 ID를 기준으로 필터를 참조할 수도 있습니다. 다음 예제는 validation loss 요약, validation accuracy 요약 및 지정된 정규표현식(regex)을 기반으로 Runs를 필터링하는 방법을 보여줍니다.
def advanced_filter_example(entity: str, project: str) -> None:
    # 프로젝트의 모든 runs 가져오기
    runs: list = wandb.Api().runs(f"{entity}/{project}")

    # 여러 필터 적용: val_loss < 0.1, val_accuracy > 0.8, 그리고 run 이름이 regex 패턴과 일치하는 경우
    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' 요약을 기준으로 runs 필터링
                (ws.Summary("val_accuracy") > 0.8),  # 'val_accuracy' 요약을 기준으로 runs 필터링
                (ws.Metric("ID").isin([run.id for run in wandb.Api().runs(f"{entity}/{project}")])),
            ],
            regex_query=True,
        )
    )

    # 's'로 시작하는 run 이름을 찾기 위한 regex 검색 추가
    workspace.runset_settings.query = "^s"
    workspace.runset_settings.regex_query = True

    workspace.save()
    print("Workspace with advanced filters and regex search saved.")

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

Runs 색상 변경

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

    # runs에 색상을 동적으로 할당
    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 with run colors saved.")

run_color_example(entity, project)

Runs 그룹화

이 예제는 특정 메트릭을 기준으로 Runs를 그룹화하는 방법을 보여줍니다.
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 with grouped runs saved.")

grouping_example(entity, project)

Runs 정렬

이 예제는 validation loss 요약을 기준으로 Runs를 정렬하는 방법을 보여줍니다.
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 with sorted runs saved.")

sorting_example(entity, project)

4. 종합 예제: 모든 기능 통합

이 예제는 포괄적인 Workspace를 생성하고, 설정을 구성하며, 섹션에 패널을 추가하는 전체 과정을 보여줍니다.
def full_end_to_end_example(entity: str, project: str) -> None:
    # 프로젝트의 모든 runs 가져오기
    runs: list = wandb.Api().runs(f"{entity}/{project}")

    # runs에 색상을 동적으로 할당하고 run 설정을 생성
    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("Workspace created and saved.")

full_end_to_end_example(entity, project)