메인 콘텐츠로 건너뛰기
W&B Models에서 wandb.plot 메서드를 사용하면 wandb.Run.log()로 차트를 추적할 수 있으며, 여기에는 트레이닝 중 시간에 따라 변하는 차트도 포함됩니다. 맞춤형 차트 프레임워크에 대해 자세히 알아보려면 맞춤형 차트 워크스루를 참조하세요.

기본 차트

W&B 차트를 만들려면 다음 단계를 따르세요.
  1. wandb.Table 객체를 만들고 시각화할 데이터를 추가합니다.
  2. W&B에서 기본 제공하는 도우미 함수 중 하나를 사용해 플롯을 생성합니다.
  3. wandb.Run.log()로 플롯을 로깅합니다.
다음 기본 차트는 메트릭과 결과를 간단히 시각화하는 데 사용할 수 있습니다.
임의의 축에 연결된 순서 있는 점 목록으로 구성된 맞춤형 선형 플롯을 기록합니다.
import wandb

with wandb.init() as run:
    data = [[x, y] for (x, y) in zip(x_values, y_values)]
    table = wandb.Table(data=data, columns=["x", "y"])
    run.log(
        {
            "my_custom_plot_id": wandb.plot.line(
                table, "x", "y", title="Custom Y versus X line plot"
            )
        }
    )
이 기능을 사용하면 어떤 두 차원에서든 곡선을 로그할 수 있습니다. 두 값 목록을 서로 대응해 플로팅하는 경우, 두 목록의 값 개수는 정확히 일치해야 합니다. 예를 들어 각 점에는 x값과 y값이 모두 있어야 합니다.
맞춤형 선형 플롯
자세한 내용은 W&B로 맞춤형 선형 플롯 만들기 리포트를 참조하세요.코드 실행

모델 평가 차트

이 사전 설정 차트에는 wandb.plot() 메서드가 기본 제공되어, 스크립트에서 바로 차트를 로깅하고 UI에서 원하는 정확한 정보를 빠르고 쉽게 확인할 수 있습니다.
한 줄로 정밀도-재현율 곡선을 생성하세요:
import wandb
with wandb.init() as run:
    # ground_truth는 정답 레이블 목록이고, predictions는 예측 점수 목록입니다.
    # 예를 들어 ground_truth = [0, 1, 1, 0], predictions = [0.1, 0.4, 0.35, 0.8]입니다.
    ground_truth = [0, 1, 1, 0]
    predictions = [0.1, 0.4, 0.35, 0.8]
    run.log({"pr": wandb.plot.pr_curve(ground_truth, predictions)})
코드가 다음 항목에 액세스할 수 있을 때마다 이를 기록할 수 있습니다:
  • 예제 집합에 대한 모델의 예측 점수(predictions).
  • 해당 예제에 대한 정답 레이블(ground_truth).
  • (선택) 레이블 또는 클래스 이름의 목록. 예를 들어 레이블 인덱스 0이 cat, 1이 dog, 2가 bird를 의미한다면 labels=["cat", "dog", "bird"].
  • (선택) 플롯에 시각화할 레이블의 하위 집합(여전히 목록 형식).
정밀도-재현율 곡선
자세한 내용은 W&B로 정밀도-재현율 곡선 그리기 리포트를 참조하세요.코드 실행

대화형 맞춤형 차트

전체적으로 맞춤 설정하려면 기본 제공 맞춤형 차트 프리셋을 조정하거나 새 프리셋을 만든 다음 차트를 저장하세요. 차트 ID를 사용해 스크립트에서 바로 해당 맞춤형 프리셋에 데이터를 로깅할 수 있습니다.
import wandb
# 플롯할 열이 포함된 테이블을 생성합니다.
table = wandb.Table(data=data, columns=["step", "height"])

# 테이블의 열을 차트의 필드에 매핑합니다.
fields = {"x": "step", "value": "height"}

# 테이블을 사용하여 새 맞춤형 차트 프리셋을 채웁니다.
# 저장한 차트 프리셋을 사용하려면 vega_spec_name을 변경하세요.
# 제목을 수정하려면 string_fields를 변경하세요.
my_custom_chart = wandb.plot_table(
    vega_spec_name="carey/new_chart",
    data_table=table,
    fields=fields,
    string_fields={"title": "Height Histogram"},
)

with wandb.init() as run:
    # 맞춤형 차트를 로깅합니다.
    run.log({"my_custom_chart": my_custom_chart})
코드를 실행해 보세요

Matplotlib 및 Plotly 플롯

wandb.plot()으로 W&B 맞춤형 차트를 사용하는 대신, matplotlibPlotly로 생성한 차트를 로깅할 수 있습니다.
import wandb
import matplotlib.pyplot as plt

with wandb.init() as run:
    # 단순한 matplotlib 플롯을 생성합니다.
    plt.figure()
    plt.plot([1, 2, 3, 4])
    plt.ylabel("some interesting numbers")

    # 플롯을 W&B에 로깅합니다.
    run.log({"chart": plt})
matplotlib 플롯 또는 figure 객체를 wandb.Run.log()에 전달하기만 하면 됩니다. 기본적으로는 플롯을 Plotly 플롯으로 변환합니다. 플롯을 이미지로 로깅하려면 wandb.Image에 플롯을 전달하면 됩니다. Plotly 차트도 직접 지원합니다.
“You attempted to log an empty plot”와 같은 오류가 발생하면, fig = plt.figure()로 figure를 플롯과 별도로 저장한 다음 wandb.Run.log()를 호출할 때 fig를 로깅하세요.

W&B Tables에 맞춤형 HTML 로깅하기

W&B에서는 Plotly와 Bokeh의 대화형 차트를 HTML로 로깅해 Tables에 추가할 수 있습니다.

Plotly figure를 HTML로 변환해 Tables에 로깅하기

대화형 Plotly 차트를 HTML로 변환해 W&B Tables에 로깅할 수 있습니다.
import wandb
import plotly.express as px

# 새 run을 초기화합니다.
with wandb.init(project="log-plotly-fig-tables", name="plotly_html") as run:

    # 테이블을 생성합니다.
    table = wandb.Table(columns=["plotly_figure"])

    # Plotly 그림의 경로를 생성합니다.
    path_to_plotly_html = "./plotly_figure.html"

    # Plotly 그림 예시입니다.
    fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])

    # Plotly 그림을 HTML로 저장합니다.
    # auto_play를 False로 설정하면 애니메이션 Plotly 차트가
    # 테이블에서 자동으로 재생되는 것을 방지합니다.
    fig.write_html(path_to_plotly_html, auto_play=False)

    # Plotly 그림을 HTML 파일로 Table에 추가합니다.
    table.add_data(wandb.Html(path_to_plotly_html))

    # 테이블을 로깅합니다.
    run.log({"test_table": table})

Bokeh figure를 HTML로 변환해 Tables에 로깅하기

대화형 Bokeh 차트를 HTML로 변환하면 W&B Tables에 로깅할 수 있습니다.
from scipy.signal import spectrogram
import holoviews as hv
import panel as pn
from scipy.io import wavfile
import numpy as np
from bokeh.resources import INLINE

hv.extension("bokeh", logo=False)
import wandb


def save_audio_with_bokeh_plot_to_html(audio_path, html_file_name):
    sr, wav_data = wavfile.read(audio_path)
    duration = len(wav_data) / sr
    f, t, sxx = spectrogram(wav_data, sr)
    spec_gram = hv.Image((t, f, np.log10(sxx)), ["Time (s)", "Frequency (hz)"]).opts(
        width=500, height=150, labelled=[]
    )
    audio = pn.pane.Audio(wav_data, sample_rate=sr, name="Audio", throttle=500)
    slider = pn.widgets.FloatSlider(end=duration, visible=False)
    line = hv.VLine(0).opts(color="white")
    slider.jslink(audio, value="time", bidirectional=True)
    slider.jslink(line, value="glyph.location")
    combined = pn.Row(audio, spec_gram * line, slider).save(html_file_name)


html_file_name = "audio_with_plot.html"
audio_path = "hello.wav"
save_audio_with_bokeh_plot_to_html(audio_path, html_file_name)

wandb_html = wandb.Html(html_file_name)

with wandb.init(project="audio_test") as run:
    my_table = wandb.Table(columns=["audio_with_plot"], data=[[wandb_html]])
    run.log({"audio_table": my_table})