메인 콘텐츠로 건너뛰기
W&B Public API를 사용해 데이터를 내보내거나 임포트하세요.
이 기능을 사용하려면 python>=3.8이 필요합니다.

MLFlow에서 데이터 임포트하기

W&B는 MLFlow에서 Experiments, Runs, 아티팩트, 메트릭 및 기타 메타데이터를 임포트하는 기능을 지원합니다. 의존성을 설치하세요:
# 참고: py38 이상이 필요합니다
pip install wandb[importers]
W&B에 로그인하세요. 처음 로그인하는 경우 안내에 따라 진행하세요.
wandb login
기존 MLFlow 서버의 모든 Runs를 임포트하세요:
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에 전달할 수 있습니다.
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)
Databricks MLflow에서 임포트하는 경우 먼저 Databricks CLI를 구성해야 할 수 있습니다.이전 단계에서 mlflow-tracking-uri="databricks"를 설정하세요.
아티팩트를 임포트하지 않으려면 artifacts=False를 전달할 수 있습니다:
importer.import_runs(runs, artifacts=False)
특정 W&B entity와 프로젝트로 임포트하려면 Namespace를 전달하면 됩니다:
from wandb.apis.importers import Namespace

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

데이터 내보내기

Public API를 사용해 W&B에 저장한 데이터를 내보내거나 업데이트할 수 있습니다. 이 API를 사용하기 전에 스크립트에서 데이터를 로깅해야 합니다. 자세한 내용은 퀵스타트를 확인하세요. Public API 사용 사례
  • 데이터 내보내기: Jupyter Notebook에서 맞춤형 분석을 위해 데이터프레임을 가져옵니다. 데이터를 탐색한 뒤에는 새 분석 run을 만들고 결과를 로깅해 분석 결과를 동기화할 수 있습니다. 예: wandb.init(job_type="analysis")
  • 기존 Runs 업데이트: W&B run과 연결되어 로깅된 데이터를 업데이트할 수 있습니다. 예를 들어, 아키텍처나 원래 로깅되지 않았던 하이퍼파라미터 같은 추가 정보를 포함하도록 여러 Runs의 설정을 업데이트할 수 있습니다.
자세한 내용은 사용 가능한 함수에 대한 생성된 레퍼런스 문서를 참조하세요.

API 키 생성

API 키는 머신을 W&B에 인증하는 데 사용됩니다. API 키를 만들려면 자세한 내용이 있는 개인 API 키 또는 서비스 계정 API 키 탭을 선택하세요.
사용자 ID에 속한 개인 API 키를 만들려면 다음 단계를 따르세요.
  1. W&B에 로그인한 다음 사용자 프로필 아이콘을 클릭하고 User Settings를 클릭합니다.
  2. Create new API key를 클릭합니다.
  3. API 키를 식별할 수 있는 설명적인 이름을 입력합니다.
  4. Create를 클릭합니다.
  5. 표시된 API 키를 즉시 복사해 안전하게 저장합니다.
전체 API 키는 생성 시점에 한 번만 표시됩니다. 대화 상자를 닫으면 전체 API 키를 다시 볼 수 없습니다. Settings에서는 키 ID(키의 첫 부분)만 확인할 수 있습니다. 전체 API 키를 분실한 경우 새 API 키를 만들어야 합니다.
안전한 저장 옵션은 API 키를 안전하게 저장하기를 참조하세요.

API 키를 안전하게 저장하고 관리하기

API 키는 W&B 계정에 접근할 수 있게 하므로 비밀번호처럼 보호해야 합니다. 다음 권장 사항을 따르세요:
  • Secrets manager: AWS Secrets Manager, HashiCorp Vault, Azure Key Vault, 또는 Google Secret Manager와 같은 전용 시크릿 관리 시스템을 사용하세요.
  • Password manager: 신뢰할 수 있는 비밀번호 관리 애플리케이션을 사용하세요.
  • OS-level keychains: macOS Keychain, Windows Credential Manager, 또는 Linux secret service에 키를 저장하세요. 프로덕션 환경에는 권장되지 않습니다.

피해야 할 사항

  • Git과 같은 버전 관리 시스템에 API 키를 절대 커밋하지 마세요.
  • API 키를 평문 설정 파일에 저장하지 마세요.
  • ps와 같은 OS 명령의 출력에 표시되므로, 명령줄 인수로 API 키를 전달하지 마세요.
  • 이메일, 채팅 또는 기타 암호화되지 않은 채널을 통해 API 키를 공유하지 마세요.
  • 소스 코드에 API 키를 하드코딩하지 마세요.
API 키가 노출된 경우, W&B 계정에서 즉시 해당 API 키를 삭제하고 지원팀 또는 AISE에 문의하세요.

환경 변수

코드에서 API 키를 사용할 때는 환경 변수로 전달하세요:
export WANDB_API_KEY="your-api-key-here"
이 방식은 키를 소스 코드에 넣지 않도록 하고, 필요할 때 더 쉽게 교체할 수 있게 해줍니다.
ps 같은 OS 명령어의 출력에 표시되므로, 환경 변수를 명령어와 같은 줄에서 설정하지 마세요:
# 이 패턴은 피하세요. 프로세스 관리자에 API 키가 노출될 수 있습니다
export WANDB_API_KEY="your-api-key-here" ./my-script.sh

SDK 버전 호환성

새 API 키는 기존 키보다 더 깁니다. 이전 버전의 wandb 또는 weave SDK로 인증할 때 API 키 길이 오류가 발생할 수 있습니다. 해결 방법: 최신 SDK 버전으로 업데이트하세요.
  • wandb SDK v0.22.3+
    pip install --upgrade wandb==0.22.3
    
  • weave SDK v0.52.17+
    pip install --upgrade weave==0.52.17
    
SDK를 바로 업그레이드할 수 없다면, 우회 방법으로 WANDB_API_KEY 환경 변수를 사용해 API 키를 설정하세요.

run 경로 찾기

Public API를 사용하려면 <entity>/<project>/<run_id> 형식의 run 경로가 필요한 경우가 많습니다. 앱 UI에서 run 페이지를 열고 Overview 탭 을 클릭해 run 경로를 확인하세요.

run 데이터 내보내기

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

api = wandb.Api()
run = api.run("<entity>/<project>/<run_id>")
run 객체에서 가장 자주 사용되는 속성은 다음과 같습니다.
AttributeMeaning
run.config트레이닝 run의 하이퍼파라미터나 데이터셋 Artifact를 생성하는 run의 전처리 방법처럼, run의 설정 정보가 담긴 딕셔너리입니다. 이를 run의 inputs라고 생각하면 됩니다.
run.history()모델이 트레이닝되는 동안 loss처럼 변하는 값을 저장하는 딕셔너리 목록입니다. run.log() command는 이 객체에 값을 추가합니다.
run.summaryrun의 결과를 요약한 정보가 담긴 딕셔너리입니다. accuracy, loss 같은 스칼라 값일 수도 있고 큰 파일일 수도 있습니다. 기본적으로 run.log()는 로깅된 시계열의 마지막 값으로 summary를 설정합니다. summary의 내용은 직접 설정할 수도 있습니다. summary를 run의 outputs라고 생각하면 됩니다.
과거 run의 데이터도 수정하거나 업데이트할 수 있습니다. 기본적으로 API 객체 인스턴스 하나가 모든 네트워크 요청을 캐시합니다. 실행 중인 스크립트에서 실시간 정보가 필요하다면 api.flush()를 호출해 업데이트된 값을 가져오세요.

run의 다양한 속성 이해하기

다음 코드 예제에서는 run을 생성하고, 데이터를 기록한 뒤 run의 속성에 접근하는 방법을 보여줍니다:
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 객체 속성별로 생성되는 다양한 출력을 설명합니다
run.config
{"n_epochs": 5}

run.summary

{
    "_step": 4,
    "_timestamp": 1644345412,
    "_wandb": {"runtime": 3},
    "loss": 0.041,
    "val": 525,
}

샘플링

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

여러 run 쿼리하기

이 예제 스크립트는 프로젝트를 찾아 name, 설정, summary 통계가 포함된 run CSV를 출력합니다. <entity><project>를 각각 사용자의 W&B entity와 프로젝트 이름으로 바꾸세요.
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()
api.runs를 호출하면 반복 가능한 Runs 객체가 반환되며, 목록처럼 동작합니다. 기본적으로 이 객체는 필요에 따라 한 번에 50개의 run을 순서대로 로드하지만, per_page 키워드 인수로 페이지당 로드할 개수를 변경할 수 있습니다. api.runsorder 키워드 인수도 받습니다. 기본 정렬 순서는 -created_at입니다. 결과를 오름차순으로 정렬하려면 +created_at를 지정하세요. 설정이나 summary 값으로도 정렬할 수 있습니다. 예를 들어 summary.val_acc 또는 config.experiment_name입니다.

오류 처리

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

API를 통해 최신 git 커밋 조회

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

run 중에 run 이름과 ID 조회하기

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 탭 모두에서 가능합니다. 자세한 지침은 여기를 참조하세요.

Public API 예시

matplotlib 또는 seaborn에서 시각화할 수 있도록 데이터 내보내기

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

run에서 메트릭 조회

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

run 필터링

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

날짜

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

run에서 특정 메트릭 조회

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

두 run 비교하기

이렇게 하면 run1run2의 설정 매개변수 중 서로 다른 항목이 출력됩니다.
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

run이 종료된 후 해당 run의 메트릭 업데이트

이 예제에서는 이전 run의 정확도를 0.9로 설정합니다. 또한 이전 run의 정확도 히스토그램을 numpy_array의 히스토그램으로 변경합니다.
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()

완료된 run의 메트릭 이름 바꾸기

이 예제에서는 테이블의 summary 열 이름을 변경합니다.
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()
열 이름 변경은 테이블에만 적용됩니다. 차트에서는 여전히 메트릭의 원래 이름이 사용됩니다.

기존 run의 설정 업데이트

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

api = wandb.Api()

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

시스템 리소스 사용량을 CSV 파일로 내보내기

아래 스니펫은 시스템 리소스 사용량을 찾아 CSV 파일에 저장합니다.
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")

샘플링되지 않은 메트릭 데이터 조회

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

api = wandb.Api()

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

이력에서 페이지 단위 데이터 조회

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

api = wandb.Api()

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

프로젝트의 모든 run에서 메트릭을 CSV 파일로 내보내기

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

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

api = wandb.Api()

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

완료된 run에 파일 업로드

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

api = wandb.Api()

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

run에서 파일 다운로드

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

api = wandb.Api()

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

run의 모든 파일 다운로드

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

api = wandb.Api()

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

특정 sweep의 run 조회

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

api = wandb.Api()

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

sweep에서 최적의 run 조회

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

api = wandb.Api()

sweep = api.sweep("<entity>/<project>/<sweep_id>")
best_run = sweep.best_run()
best_run은 sweep 설정의 메트릭 매개변수에서 정의한 가장 좋은 메트릭을 가진 run입니다.

sweep에서 가장 성능이 좋은 모델 파일 다운로드

이 스니펫은 모델 파일을 model.h5에 저장한 run들로 구성된 sweep에서 검증 정확도가 가장 높은 모델 파일을 다운로드합니다.
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")

run에서 지정한 확장자의 모든 파일 삭제

이 스니펫은 run에서 지정한 확장자의 파일을 삭제합니다.
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()

시스템 메트릭 데이터 다운로드

이 스니펫은 run의 모든 시스템 리소스 사용 메트릭이 담긴 데이터프레임을 생성한 다음 CSV로 저장합니다.
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")

summary 메트릭 업데이트

summary 메트릭을 업데이트하려면 딕셔너리를 전달하면 됩니다.
summary.update({"key": val})

run을 실행한 명령어 조회

각 run은 run Overview 페이지에 해당 run을 시작한 명령어를 기록합니다. API에서 이 명령어를 가져오려면 다음을 실행하세요:
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"]