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

> MLFlow에서 데이터를 임포트하고, W&B에 저장한 데이터를 내보내거나 업데이트합니다

# 데이터 임포트 및 내보내기

W\&B Public API를 사용해 데이터를 내보내거나 임포트하세요.

<Note>
  이 기능을 사용하려면 python>=3.8이 필요합니다.
</Note>

<div id="import-data-from-mlflow">
  ## MLFlow에서 데이터 임포트하기
</div>

W\&B는 MLFlow에서 Experiments, Runs, 아티팩트, 메트릭 및 기타 메타데이터를 임포트하는 기능을 지원합니다.

의존성을 설치하세요:

```shell theme={null}
# 참고: py38 이상이 필요합니다
pip install wandb[importers]
```

W\&B에 로그인하세요. 처음 로그인하는 경우 안내에 따라 진행하세요.

```shell theme={null}
wandb login
```

기존 MLFlow 서버의 모든 Runs를 임포트하세요:

```py theme={null}
from wandb.apis.importers.mlflow import MlflowImporter

importer = MlflowImporter(mlflow_tracking_uri="...")

runs = importer.collect_runs()
importer.import_runs(runs)
```

기본적으로 `importer.collect_runs()`는 MLFlow 서버의 모든 run을 수집합니다. 특정 하위 집합만 업로드하려면 직접 runs iterable을 구성해 importer에 전달할 수 있습니다.

```py theme={null}
import mlflow
from wandb.apis.importers.mlflow import MlflowRun

client = mlflow.tracking.MlflowClient(mlflow_tracking_uri)

runs: Iterable[MlflowRun] = []
for run in mlflow_client.search_runs(...):
    runs.append(MlflowRun(run, client))

importer.import_runs(runs)
```

<Note>
  Databricks MLflow에서 임포트하는 경우 먼저 [Databricks CLI를 구성해야 할 수 있습니다](https://docs.databricks.com/dev-tools/cli/index.html).

  이전 단계에서 `mlflow-tracking-uri="databricks"`를 설정하세요.
</Note>

아티팩트를 임포트하지 않으려면 `artifacts=False`를 전달할 수 있습니다:

```py theme={null}
importer.import_runs(runs, artifacts=False)
```

특정 W\&B entity와 프로젝트로 임포트하려면 `Namespace`를 전달하면 됩니다:

```py theme={null}
from wandb.apis.importers import Namespace

importer.import_runs(runs, namespace=Namespace(entity, project))
```

<div id="export-data">
  ## 데이터 내보내기
</div>

Public API를 사용해 W\&B에 저장한 데이터를 내보내거나 업데이트할 수 있습니다. 이 API를 사용하기 전에 스크립트에서 데이터를 로깅해야 합니다. 자세한 내용은 [퀵스타트](/ko/models/quickstart/)를 확인하세요.

**Public API 사용 사례**

* **데이터 내보내기**: Jupyter Notebook에서 맞춤형 분석을 위해 데이터프레임을 가져옵니다. 데이터를 탐색한 뒤에는 새 분석 run을 만들고 결과를 로깅해 분석 결과를 동기화할 수 있습니다. 예: `wandb.init(job_type="analysis")`
* **기존 Runs 업데이트**: W\&B run과 연결되어 로깅된 데이터를 업데이트할 수 있습니다. 예를 들어, 아키텍처나 원래 로깅되지 않았던 하이퍼파라미터 같은 추가 정보를 포함하도록 여러 Runs의 설정을 업데이트할 수 있습니다.

자세한 내용은 사용 가능한 함수에 대한 [생성된 레퍼런스 문서](/ko/models/ref/python/public-api/)를 참조하세요.

<div id="create-an-api-key">
  ### API 키 생성
</div>

API 키는 머신을 W\&B에 인증하는 데 사용됩니다.

API 키를 만들려면 자세한 내용이 있는 **개인 API 키** 또는 **서비스 계정 API 키** 탭을 선택하세요.

<Tabs>
  <Tab title="개인 API 키">
    사용자 ID에 속한 개인 API 키를 만들려면 다음 단계를 따르세요.

    1. W\&B에 로그인한 다음 사용자 프로필 아이콘 **> User Settings**를 클릭합니다.
    2. **Create new API key**를 클릭합니다.
    3. API 키를 식별할 수 있는 설명적인 이름을 입력합니다.
    4. **Create**를 클릭합니다.
    5. 표시된 API 키를 즉시 복사해 안전하게 저장합니다.
  </Tab>

  <Tab title="서비스 계정 API 키">
    서비스 계정 소유의 API 키를 생성하려면 다음 단계를 따르세요.

    1. 팀 또는 조직 설정에서 **Service Accounts** 탭으로 이동합니다.
    2. 목록에서 서비스 계정을 찾습니다.
    3. **작업 (<Icon icon="ellipsis" iconType="solid" />)** 메뉴를 클릭한 다음 **Create API key**를 클릭합니다.
    4. API 키 이름을 지정한 다음 **Create**를 클릭합니다.
    5. 표시된 API 키를 즉시 복사해 안전한 곳에 저장합니다.
    6. **Done**을 클릭합니다.

    서로 다른 환경이나 워크플로를 지원하기 위해 하나의 서비스 계정에 여러 API 키를 생성할 수 있습니다.
  </Tab>
</Tabs>

<Warning>
  W\&B는 전체 API 키를 생성 시점에 한 번만 표시합니다. 대화 상자를 닫으면 전체 API 키를 다시 볼 수 없습니다. Settings에서는 키 ID(키의 첫 부분)만 확인할 수 있습니다. 전체 API 키를 분실한 경우 새 API 키를 만들어야 합니다.
</Warning>

안전한 저장 옵션은 [API 키를 안전하게 저장하기](/ko/platform/app/settings-page/user-settings/#store-and-handle-api-keys-securely)를 참조하세요.

<div id="store-and-handle-api-keys-securely">
  ## API 키를 안전하게 저장하고 관리하기
</div>

API 키는 W\&B 계정에 접근할 수 있게 하므로 비밀번호처럼 보호해야 합니다. 다음 섹션에서는 권장 저장 방법, 피해야 할 관행, 코드에 키를 전달하는 방법, 그리고 최신 키에 필요한 SDK 버전 요구 사항을 설명합니다.

<div id="recommended-storage-methods">
  ### 권장 저장 방법
</div>

다음 방법 중 하나를 사용하여 API 키를 안전하게 저장하세요.

* **Secrets manager**: [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/), [HashiCorp Vault](https://developer.hashicorp.com/vault), [Azure Key Vault](https://azure.microsoft.com/en-us/products/key-vault), 또는 [Google Secret Manager](https://cloud.google.com/security/products/secret-manager)와 같은 전용 시크릿 관리 시스템을 사용하세요.
* **Password manager**: 신뢰할 수 있는 비밀번호 관리 애플리케이션을 사용하세요.
* **OS-level keychains**: macOS Keychain, Windows Credential Manager, 또는 Linux secret service에 키를 저장하세요. 프로덕션 환경에는 권장되지 않습니다.

<div id="what-to-avoid">
  ### 피해야 할 사항
</div>

다음과 같은 관행은 API 키를 노출시킬 수 있으므로 피하세요.

* Git과 같은 버전 관리 시스템에 API 키를 절대 커밋하지 마세요.
* API 키를 평문 설정 파일에 저장하지 마세요.
* `ps`와 같은 OS 명령의 출력에 표시되므로, 명령줄 인수로 API 키를 전달하지 마세요.
* 이메일, 채팅 또는 기타 암호화되지 않은 채널을 통해 API 키를 공유하지 마세요.
* 소스 코드에 API 키를 하드코딩하지 마세요.

API 키가 노출된 경우, W\&B 계정에서 즉시 해당 API 키를 삭제하고 [지원팀](mailto:support@wandb.ai) 또는 AISE에 문의하세요.

<div id="environment-variables">
  ### 환경 변수
</div>

코드에서 API 키를 사용할 때는 환경 변수를 통해 전달하세요:

```bash theme={null}
export WANDB_API_KEY="[YOUR-API-KEY]"
```

이 방식은 키를 소스 코드에 넣지 않도록 하고, 필요할 때 더 쉽게 교체할 수 있게 해줍니다.

<Warning>
  `ps` 같은 OS 명령어의 출력에 표시되므로, 환경 변수를 명령어와 같은 줄에서 설정하지 마세요:

  ```bash theme={null}
  # 이 패턴은 피하세요. 프로세스 관리자에 API 키가 노출될 수 있습니다
  export WANDB_API_KEY="[YOUR-API-KEY]" ./my-script.sh
  ```
</Warning>

<div id="sdk-version-compatibility">
  ### SDK 버전 호환성
</div>

최신 API 키를 사용하는 경우, SDK 버전이 이를 지원하는지 확인하세요. 새 API 키는 기존 키보다 더 깁니다. 이전 버전의 `wandb` 또는 `weave` SDK로 인증할 때 API 키 길이 오류가 발생할 수 있습니다.

**해결 방법**: 최신 SDK 버전으로 업데이트하세요.

* `wandb` SDK v0.22.3+

  ```bash theme={null}
  pip install --upgrade wandb==0.22.3
  ```
* `weave` SDK v0.52.17+
  ```bash theme={null}
  pip install --upgrade weave==0.52.17
  ```

SDK를 바로 업그레이드할 수 없다면, 우회 방법으로 `WANDB_API_KEY` 환경 변수를 사용해 API 키를 설정하세요.

<div id="find-the-run-path">
  ### run 경로 찾기
</div>

Public API를 사용하려면 `<entity>/<project>/<run_id>` 형식의 run 경로가 필요한 경우가 많습니다. 앱 UI에서 run 페이지를 열고 [Overview 탭 ](/ko/models/track/public-api-guide/#overview-tab)을 클릭해 run 경로를 확인하세요.

<div id="export-run-data">
  ### run 데이터 내보내기
</div>

완료되었거나 현재 활성 상태인 run에서 데이터를 다운로드합니다. 일반적으로는 Jupyter 노트북에서 맞춤형 분석에 사용할 데이터프레임을 다운로드하거나, 자동화된 환경에서 맞춤형 로직을 사용하는 경우가 많습니다.

```python theme={null}
import wandb

api = wandb.Api()
run = api.run("<entity>/<project>/<run_id>")
```

run 객체에서 가장 자주 사용되는 속성은 다음과 같습니다.

| Attribute       | Meaning                                                                                                                                                                                       |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `run.config`    | 트레이닝 run의 하이퍼파라미터나 데이터셋 Artifact를 생성하는 run의 전처리 방법처럼, run의 설정 정보가 담긴 딕셔너리입니다. 이를 run의 inputs라고 생각하면 됩니다.                                                                                      |
| `run.history()` | 모델이 트레이닝되는 동안 loss처럼 변하는 값을 저장하는 딕셔너리 목록입니다. `run.log()` command는 이 객체에 값을 추가합니다.                                                                                                             |
| `run.summary`   | run의 결과를 요약한 정보가 담긴 딕셔너리입니다. accuracy, loss 같은 스칼라 값일 수도 있고 큰 파일일 수도 있습니다. 기본적으로 `run.log()`는 로깅된 시계열의 마지막 값으로 summary를 설정합니다. summary의 내용은 직접 설정할 수도 있습니다. summary를 run의 outputs라고 생각하면 됩니다. |

과거 run의 데이터도 수정하거나 업데이트할 수 있습니다. 기본적으로 API 객체 인스턴스 하나가 모든 네트워크 요청을 캐시합니다. 실행 중인 스크립트에서 실시간 정보가 필요하다면 `api.flush()`를 호출해 업데이트된 값을 가져오세요.

<div id="understanding-different-run-attributes">
  ### run의 다양한 속성 이해하기
</div>

다음 코드 예제에서는 run을 생성하고, 데이터를 기록한 뒤 run의 속성에 접근하는 방법을 보여줍니다:

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

with wandb.init(project="public-api-example") as run:
    n_epochs = 5
    config = {"n_epochs": n_epochs}
    run.config.update(config)
    for n in range(run.config.get("n_epochs")):
        run.log(
            {"val": random.randint(0, 1000), "loss": (random.randint(0, 1000) / 1000.00)}
        )
```

다음 섹션에서는 위 run 객체 속성별로 생성되는 다양한 출력을 설명합니다

<div id="runconfig">
  ##### `run.config`
</div>

```python theme={null}
{"n_epochs": 5}
```

<div id="runsummary">
  #### `run.summary`
</div>

```python theme={null}
{
    "_step": 4,
    "_timestamp": 1644345412,
    "_wandb": {"runtime": 3},
    "loss": 0.041,
    "val": 525,
}
```

<div id="sampling">
  ### 샘플링
</div>

기본 이력 방법에서는 메트릭을 고정된 개수의 샘플로 샘플링합니다(기본값은 500이며, `samples` \_\_ 인수로 변경할 수 있습니다). 큰 run의 모든 데이터를 내보내려면 `run.scan_history()` 방법을 사용할 수 있습니다. 자세한 내용은 [API 레퍼런스](/ko/models/ref/python/public-api)를 참조하세요.

<div id="querying-multiple-runs">
  ### 여러 run 쿼리하기
</div>

<Tabs>
  <Tab title="데이터프레임 및 CSV">
    이 예제 스크립트는 프로젝트를 찾아 name, 설정, summary 통계가 포함된 run CSV를 출력합니다. `<entity>`와 `<project>`를 각각 사용자의 W\&B entity와 프로젝트 이름으로 바꾸세요.

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

    api = wandb.Api()
    entity, project = "<entity>", "<project>"
    runs = api.runs(entity + "/" + project)

    summary_list, config_list, name_list = [], [], []
    for run in runs:
        # .summary에는
        # 정확도와 같은 메트릭의 출력 키/값이 포함됩니다.
        # 큰 파일을 제외하기 위해 ._json_dict를 호출합니다.
        summary_list.append(run.summary._json_dict)

        # .config에는 하이퍼파라미터가 포함됩니다.
        # _로 시작하는 특수 값은 제거합니다.
        config_list.append({k: v for k, v in run.config.items() if not k.startswith("_")})

        # .name은 사람이 읽을 수 있는 run 이름입니다.
        name_list.append(run.name)

    runs_df = pd.DataFrame(
        {"summary": summary_list, "config": config_list, "name": name_list}
    )

    runs_df.to_csv("project.csv")

    run.finish()
    ```
  </Tab>

  <Tab title="MongoDB 스타일">
    W\&B API는 `api.runs()`를 사용해 프로젝트의 여러 run에 걸쳐 쿼리하는 방법도 제공합니다. 가장 일반적인 사용 사례는 맞춤형 분석을 위해 run 데이터를 내보내는 것입니다. 쿼리 인터페이스는 [MongoDB가 사용하는](https://www.mongodb.com/docs/manual/reference/mql/query-predicates/) 방식과 같습니다.

    ```python theme={null}
    runs = api.runs(
        "username/project",
        {"$or": [{"config.experiment_name": "foo"}, {"config.experiment_name": "bar"}]},
    )
    print(f"Found {len(runs)} runs")
    ```
  </Tab>
</Tabs>

`api.runs`를 호출하면 반복 가능한 `Runs` 객체가 반환되며, 목록처럼 동작합니다. 기본적으로 이 객체는 필요에 따라 한 번에 50개의 run을 순서대로 로드하지만, `per_page` 키워드 인수로 페이지당 로드할 개수를 변경할 수 있습니다.

`api.runs`는 `order` 키워드 인수도 받습니다. 기본 정렬 순서는 `-created_at`입니다. 결과를 오름차순으로 정렬하려면 `+created_at`를 지정하세요. 설정이나 summary 값으로도 정렬할 수 있습니다. 예를 들어 `summary.val_acc` 또는 `config.experiment_name`입니다.

<div id="error-handling">
  ### 오류 처리
</div>

W\&B 서버와 통신하는 중 오류가 발생하면 `wandb.CommError`가 발생합니다. 원본 예외는 `exc` 속성을 통해 확인할 수 있습니다.

<div id="get-the-latest-git-commit-through-the-api">
  ### API를 통해 최신 git 커밋 조회
</div>

UI에서 run을 클릭한 다음 run 페이지의 Overview 탭을 클릭하면 최신 git 커밋을 확인할 수 있습니다. 이 정보는 `wandb-metadata.json` 파일에서도 확인할 수 있습니다. Public API를 사용하면 `run.commit`으로 git 해시를 조회할 수 있습니다.

<div id="get-a-runs-name-and-id-during-a-run">
  ### run 중에 run 이름과 ID 조회하기
</div>

`wandb.init()`를 호출한 후에는 스크립트에서 다음과 같이 무작위 run ID 또는 사람이 읽을 수 있는 run 이름에 액세스할 수 있습니다:

* 고유한 run ID(8자 해시): `run.id`
* 무작위 run 이름(사람이 읽기 쉬움): `run.name`

run에 유용한 식별자를 설정하는 방법을 고민하고 있다면, 다음을 권장합니다:

* **Run ID**: 생성된 해시를 그대로 두세요. 이 값은 프로젝트의 모든 run에서 고유해야 합니다.
* **Run name**: 짧고 읽기 쉬우며, 가능하면 고유한 값이어야 합니다. 그래야 차트의 서로 다른 선을 구분할 수 있습니다.
* **Run notes**: run에서 무엇을 하고 있는지 간단히 설명하기에 아주 좋은 곳입니다. `wandb.init(notes="여기에 노트 입력")`로 설정할 수 있습니다.
* **Run tags**: run tags에서 항목을 동적으로 추적하고, UI에서 필터를 사용해 table을 관심 있는 runs만 보이도록 좁혀 보세요. 스크립트에서 tags를 설정한 다음 UI에서 편집할 수 있으며, Runs table과 run 페이지의 Overview 탭 모두에서 가능합니다. 자세한 지침은 [여기](/ko/models/runs/tags/)를 참조하세요.

<div id="public-api-examples">
  ## Public API 예시
</div>

<div id="export-data-to-visualize-in-matplotlib-or-seaborn">
  ### matplotlib 또는 seaborn에서 시각화할 수 있도록 데이터 내보내기
</div>

몇 가지 일반적인 내보내기 패턴은 [API examples](/ko/models/ref/python/public-api/)에서 확인하세요. 맞춤형 플롯이나 확장된 Runs table에서 다운로드 버튼을 클릭해 브라우저에서 CSV를 다운로드할 수도 있습니다.

<div id="read-metrics-from-a-run">
  ### run에서 메트릭 조회
</div>

이 예제는 `"<entity>/<project>/<run_id>"`에 저장된 run에서 `run.log({"accuracy": acc})`로 기록된 타임스탬프와 정확도를 출력합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
if run.state == "finished":
    for i, row in run.history().iterrows():
        print(row["_timestamp"], row["accuracy"])
```

<div id="filter-runs">
  ### run 필터링
</div>

MongoDB Query Language를 사용해 필터링할 수 있습니다.

<div id="date">
  #### 날짜
</div>

```python theme={null}
runs = api.runs(
    "<entity>/<project>",
    {"$and": [{"created_at": {"$lt": "YYYY-MM-DDT##", "$gt": "YYYY-MM-DDT##"}}]},
)
```

<div id="read-specific-metrics-from-a-run">
  ### run에서 특정 메트릭 조회
</div>

run에서 특정 메트릭을 가져오려면 `keys` 인수를 사용하세요. `run.history()`를 사용할 때 기본 샘플 수는 500입니다. 특정 메트릭이 포함되지 않은 로깅된 step은 출력 데이터프레임에서 `NaN`으로 표시됩니다. `keys` 인수를 사용하면 API가 나열된 메트릭 키가 포함된 step을 더 자주 샘플링합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
if run.state == "finished":
    for i, row in run.history(keys=["accuracy"]).iterrows():
        print(row["_timestamp"], row["accuracy"])
```

<div id="compare-two-runs">
  ### 두 run 비교하기
</div>

이렇게 하면 `run1`과 `run2`의 설정 매개변수 중 서로 다른 항목이 출력됩니다.

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

api = wandb.Api()

# <entity>, <project>, <run_id>를 실제 값으로 교체하세요
run1 = api.run("<entity>/<project>/<run_id>")
run2 = api.run("<entity>/<project>/<run_id>")


df = pd.DataFrame([run1.config, run2.config]).transpose()

df.columns = [run1.name, run2.name]
print(df[df[run1.name] != df[run2.name]])
```

출력:

```
              c_10_sgd_0.025_0.01_long_switch base_adam_4_conv_2fc
batch_size                                 32                   16
n_conv_layers                               5                    4
optimizer                             rmsprop                 adam
```

<div id="update-metrics-for-a-run-after-the-run-has-finished">
  ### run이 종료된 후 해당 run의 메트릭 업데이트
</div>

이 예제에서는 이전 run의 정확도를 `0.9`로 설정합니다. 또한 이전 run의 정확도 히스토그램을 `numpy_array`의 히스토그램으로 변경합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
run.summary["accuracy"] = 0.9
run.summary["accuracy_histogram"] = wandb.Histogram(numpy_array)
run.summary.update()
```

<div id="rename-a-metric-in-a-completed-run">
  ### 완료된 run의 메트릭 이름 바꾸기
</div>

이 예제에서는 테이블의 summary 열 이름을 변경합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
run.summary["new_name"] = run.summary["old_name"]
del run.summary["old_name"]
run.summary.update()
```

<Note>
  열 이름 변경은 테이블에만 적용됩니다. 차트에서는 여전히 메트릭의 원래 이름이 사용됩니다.
</Note>

<div id="update-config-for-an-existing-run">
  ### 기존 run의 설정 업데이트
</div>

이 예제에서는 설정 항목 하나를 업데이트합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
run.config["key"] = updated_value
run.update()
```

<div id="export-system-resource-consumptions-to-a-csv-file">
  ### 시스템 리소스 사용량을 CSV 파일로 내보내기
</div>

아래 스니펫은 시스템 리소스 사용량을 찾아 CSV 파일에 저장합니다.

```python theme={null}
import wandb

with wandb.Api().run("<entity>/<project>/<run_id>") as run:

    system_metrics = run.history(stream="events")
    system_metrics.to_csv("sys_metrics.csv")
```

<div id="get-unsampled-metric-data">
  ### 샘플링되지 않은 메트릭 데이터 조회
</div>

이력에서 데이터를 가져오면 기본적으로 500개 포인트로 샘플링됩니다. `run.scan_history()`를 사용하면 로깅된 모든 데이터 포인트를 조회할 수 있습니다. 다음은 이력에 로깅된 모든 `loss` 데이터 포인트를 다운로드하는 예제입니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
history = run.scan_history()
losses = [row["loss"] for row in history]
```

<div id="get-paginated-data-from-history">
  ### 이력에서 페이지 단위 데이터 조회
</div>

백엔드에서 메트릭을 가져오는 속도가 느리거나 API 요청이 시간 초과되는 경우, 개별 요청이 시간 초과되지 않도록 `scan_history`의 페이지 크기를 줄여 볼 수 있습니다. 기본 페이지 크기는 500이므로, 가장 적합한 값을 찾을 수 있도록 다양한 크기를 사용해 볼 수 있습니다:

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
run.scan_history(keys=sorted(cols), page_size=100)
```

<div id="export-metrics-from-all-runs-in-a-project-to-a-csv-file">
  ### 프로젝트의 모든 run에서 메트릭을 CSV 파일로 내보내기
</div>

이 스크립트는 프로젝트의 run을 가져와 각 run의 이름, 설정, summary 통계를 포함한 데이터프레임과 CSV 파일을 생성합니다. `<entity>`와 `<project>`를 각각 W\&B entity와 프로젝트 이름으로 바꾸세요.

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

api = wandb.Api()
entity, project = "<entity>", "<project>"
runs = api.runs(entity + "/" + project)

summary_list, config_list, name_list = [], [], []
for run in runs:
    # .summary에는 정확도 등의 메트릭에 대한
    #  출력 키/값이 포함되어 있습니다.
    #  대용량 파일을 제외하기 위해 ._json_dict를 호출합니다.
    summary_list.append(run.summary._json_dict)

    # .config에는 하이퍼파라미터가 포함되어 있습니다.
    #  _로 시작하는 특수 값은 제거합니다.
    config_list.append({k: v for k, v in run.config.items() if not k.startswith("_")})

    # .name은 run의 사람이 읽을 수 있는 이름입니다.
    name_list.append(run.name)

runs_df = pd.DataFrame(
    {"summary": summary_list, "config": config_list, "name": name_list}
)

runs_df.to_csv("project.csv")
```

<div id="get-the-starting-time-for-a-run">
  ### run의 시작 시간 조회
</div>

이 코드 예제는 run이 생성된 시점을 조회합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("entity/project/run_id")
start_time = run.created_at
```

<div id="upload-files-to-a-finished-run">
  ### 완료된 run에 파일 업로드
</div>

아래 코드 스니펫은 선택한 파일을 완료된 run에 업로드합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("entity/project/run_id")
run.upload_file("file_name.extension")
```

<div id="download-a-file-from-a-run">
  ### run에서 파일 다운로드
</div>

이 예시에서는 cifar 프로젝트의 run ID uxte44z7에 연결된 파일 "model-best.h5"를 찾아 로컬에 저장합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
run.file("model-best.h5").download()
```

<div id="download-all-files-from-a-run">
  ### run의 모든 파일 다운로드
</div>

이 작업은 run에 연결된 모든 파일을 찾아 로컬에 저장합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
for file in run.files():
    file.download()
```

<div id="get-runs-from-a-specific-sweep">
  ### 특정 sweep의 run 조회
</div>

이 스니펫은 특정 sweep에 속한 모든 run을 다운로드합니다.

```python theme={null}
import wandb

api = wandb.Api()

sweep = api.sweep("<entity>/<project>/<sweep_id>")
sweep_runs = sweep.runs
```

<div id="get-the-best-run-from-a-sweep">
  ### sweep에서 최적의 run 조회
</div>

다음 스니펫은 지정된 sweep에서 최적의 run을 조회합니다.

```python theme={null}
import wandb

api = wandb.Api()

sweep = api.sweep("<entity>/<project>/<sweep_id>")
best_run = sweep.best_run()
```

`best_run`은 sweep 설정의 `메트릭` 매개변수에서 정의한 가장 좋은 메트릭을 가진 run입니다.

<div id="download-the-best-model-file-from-a-sweep">
  ### sweep에서 가장 성능이 좋은 모델 파일 다운로드
</div>

이 스니펫은 모델 파일을 `model.h5`에 저장한 run들로 구성된 sweep에서 검증 정확도가 가장 높은 모델 파일을 다운로드합니다.

```python theme={null}
import wandb

api = wandb.Api()

sweep = api.sweep("<entity>/<project>/<sweep_id>")
runs = sorted(sweep.runs, key=lambda run: run.summary.get("val_acc", 0), reverse=True)
val_acc = runs[0].summary.get("val_acc", 0)
print(f"Best run {runs[0].name} with {val_acc}% val accuracy")

runs[0].file("model.h5").download(replace=True)
print("Best model saved to model-best.h5")
```

<div id="delete-all-files-with-a-given-extension-from-a-run">
  ### run에서 지정한 확장자의 모든 파일 삭제
</div>

이 스니펫은 run에서 지정한 확장자의 파일을 삭제합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")

extension = ".png"
files = run.files()
for file in files:
    if file.name.endswith(extension):
        file.delete()
```

<div id="download-system-metrics-data">
  ### 시스템 메트릭 데이터 다운로드
</div>

이 스니펫은 run의 모든 시스템 리소스 사용 메트릭이 담긴 데이터프레임을 생성한 다음 CSV로 저장합니다.

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")
system_metrics = run.history(stream="events")
system_metrics.to_csv("sys_metrics.csv")
```

<div id="update-summary-metrics">
  ### summary 메트릭 업데이트
</div>

summary 메트릭을 업데이트하려면 딕셔너리를 전달하면 됩니다.

```python theme={null}
summary.update({"key": val})
```

<div id="get-the-command-that-ran-the-run">
  ### run을 실행한 명령어 조회
</div>

각 run은 run Overview 페이지에 해당 run을 시작한 명령어를 기록합니다. API에서 이 명령어를 가져오려면 다음을 실행하세요:

```python theme={null}
import wandb

api = wandb.Api()

run = api.run("<entity>/<project>/<run_id>")

meta = json.load(run.file("wandb-metadata.json").download())
program = ["python"] + [meta["program"]] + meta["args"]
```
