> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-dbrian-docs-serverless-training-quickstart.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# summary 메트릭 로깅

> run.summary를 사용해 W&B run에서 최고 accuracy 또는 최소 loss와 같은 단일 summary 메트릭을 추적하고 사용자 지정합니다.

트레이닝 중 시간에 따라 변하는 값 외에도 모델이나 전처리 step을 요약하는 단일 값을 추적하는 것이 중요한 경우가 많습니다. 이 정보는 W\&B run의 `summary` dictionary에 로깅하세요. run의 summary dictionary는 numpy 배열, PyTorch 텐서 또는 TensorFlow 텐서를 처리할 수 있습니다. 값이 이러한 유형 중 하나인 경우 전체 텐서를 바이너리 파일에 저장하고, min, mean, variance, percentiles 등과 같은 상위 수준 메트릭은 summary 객체에 저장합니다.

`wandb.Run.log()`로 마지막에 로깅한 값은 자동으로 W\&B run의 summary dictionary에 설정됩니다. summary 메트릭 dictionary를 수정하면 이전 값은 사라집니다.

다음 code snippet은 W\&B에 맞춤형 summary 메트릭을 제공하는 방법을 보여줍니다:

```python theme={null}
import wandb
import argparse

with wandb.init(config=args) as run:
  best_accuracy = 0
  for epoch in range(1, args.epochs + 1):
      test_loss, test_accuracy = test()
      if test_accuracy > best_accuracy:
          run.summary["best_accuracy"] = test_accuracy
          best_accuracy = test_accuracy
```

트레이닝이 완료된 후에는 기존 W\&B Run의 summary 속성을 업데이트할 수 있습니다. [W\&B Public API](/ko/models/ref/python/public-api/)를 사용해 summary 속성을 업데이트하세요:

```python theme={null}
api = wandb.Api()
run = api.run("username/project/run_id")
run.summary["tensor"] = np.random.random(1000)
run.summary.update()
```

<div id="customize-summary-metrics">
  ## summary 메트릭 사용자 지정
</div>

맞춤형 summary 메트릭은 트레이닝 중 최적의 step에서 모델 성능을 `run.summary`에 기록하는 데 유용합니다. 예를 들어, 최종 값 대신 최대 정확도나 최소 손실 값을 기록하고 싶을 수 있습니다.

기본적으로 summary는 이력의 최종 값을 사용합니다. summary 메트릭을 사용자 지정하려면 `define_metric`에 `summary` 인수를 전달하세요. 이 인수에는 다음 값을 사용할 수 있습니다:

* `"min"`
* `"max"`
* `"mean"`
* `"best"`
* `"last"`
* `"none"`

`"best"`는 선택 인수인 `objective`도 `"minimize"` 또는 `"maximize"`로 설정한 경우에만 사용할 수 있습니다.

다음 예제는 summary에 손실과 정확도의 최솟값 및 최댓값을 추가합니다:

```python theme={null}
import wandb
import random

random.seed(1)

with wandb.init() as run:
    # loss의 최솟값 및 최댓값 summary
    run.define_metric("loss", summary="min")
    run.define_metric("loss", summary="max")

    # accuracy의 최솟값 및 최댓값 summary
    run.define_metric("acc", summary="min")
    run.define_metric("acc", summary="max")

    for i in range(10):
        log_dict = {
            "loss": random.uniform(0, 1 / (i + 1)),
            "acc": random.uniform(1 / (i + 1), 1),
        }
        run.log(log_dict)
```

<div id="view-summary-metrics">
  ## summary 메트릭 보기
</div>

run의 **Overview** 페이지 또는 프로젝트의 Runs 테이블에서 요약 값을 확인할 수 있습니다.

<Tabs>
  <Tab title="Run Overview">
    1. W\&B App으로 이동합니다.
    2. 프로젝트 사이드바에서 **Workspace** 탭을 선택합니다.
    3. 요약 값을 로깅한 run을 클릭합니다. run 페이지가 열리면 기본적으로 **Overview** 탭이 표시됩니다.
    4. **Summary** 섹션에서 요약 값을 확인합니다.

    <Frame>
      <img src="https://mintcdn.com/wb-21fd5541-dbrian-docs-serverless-training-quickstart/iro0ihRDC8az5AgK/images/track/customize_summary.png?fit=max&auto=format&n=iro0ihRDC8az5AgK&q=85&s=211f661750bbaae1a5be6f1f6062b1fc" alt="Run overview" width="2416" height="2694" data-path="images/track/customize_summary.png" />
    </Frame>
  </Tab>

  <Tab title="Run Table">
    1. W\&B App으로 이동합니다.
    2. **Runs** 탭을 선택합니다.
    3. Runs 테이블에서 요약 값 이름에 해당하는 열에서 요약 값을 확인할 수 있습니다.
  </Tab>

  <Tab title="W&B Public API">
    W\&B Public API를 사용하여 run의 요약 값을 가져올 수 있습니다.

    다음 코드 예제는 W\&B Public API와 pandas를 사용해 특정 run에 로깅된 요약 값을 조회하는 한 가지 방법을 보여줍니다.

    ```python theme={null}
    import wandb
    import pandas

    entity = "<your-entity>"
    project = "<your-project>"
    run_name = "<your-run-name>" # 요약 값이 있는 run 이름

    all_runs = []

    for run in api.runs(f"{entity}/{project_name}"):
        print("Fetching details for run: ", run.id, run.name)
        run_data = {
                  "id": run.id,
                  "name": run.name,
                  "url": run.url,
                  "state": run.state,
                  "tags": run.tags,
                  "config": run.config,
                  "created_at": run.created_at,
                  "system_metrics": run.system_metrics,
                  "summary": run.summary,
                  "project": run.project,
                  "entity": run.entity,
                  "user": run.user,
                  "path": run.path,
                  "notes": run.notes,
                  "read_only": run.read_only,
                  "history_keys": run.history_keys,
                  "metadata": run.metadata,
              }
        all_runs.append(run_data)
      
    # DataFrame으로 변환  
    df = pd.DataFrame(all_runs)

    # 열 이름(run)을 기준으로 행을 가져와 딕셔너리로 변환
    df[df['name']==run_name].summary.reset_index(drop=True).to_dict()
    ```
  </Tab>
</Tabs>
