기계학습 워크플로우에서 모델 아티팩트를 추적, 공유 및 관리하기 위해 W&B를 언제 어떻게 사용하는지 알아보세요. 이 페이지에서는 실험 로깅, 리포트 생성, 그리고 각 작업에 적합한 W&B API를 사용하여 로깅된 데이터에 액세스하는 방법을 다룹니다.
이 튜토리얼에서는 다음을 사용합니다:
회원 가입 및 API 키 생성
W&B로 머신을 인증하려면 먼저 wandb.ai/settings에서 API 키를 생성해야 합니다. API 키를 복사하여 안전하게 보관하세요.
패키지 설치 및 임포트
이 가이드를 진행하는 데 필요한 W&B 라이브러리와 기타 패키지를 설치합니다.
W&B Python SDK를 임포트합니다:
다음 코드 블록에서 팀의 entity를 지정하세요:
TEAM_ENTITY = "<Team_Entity>" # 팀 entity로 교체하세요
PROJECT = "my-awesome-project"
모델 트레이닝
다음 코드는 모델 트레이닝, 메트릭 로깅, 모델을 아티팩트로 저장하는 기본적인 기계학습 워크플로우를 시뮬레이션합니다.
트레이닝 중에 W&B와 상호작용하기 위해 W&B Python SDK (wandb.sdk)를 사용합니다. wandb.Run.log()를 사용하여 loss를 로그한 다음, wandb.Artifact를 사용하여 트레이닝된 모델을 아티팩트로 저장하고, 마지막으로 Artifact.add_file을 사용하여 모델 파일을 추가합니다.
import random # 데이터 시뮬레이션을 위해 사용
def model(training_data: int) -> int:
"""데모 목적의 모델 시뮬레이션."""
return training_data * 2 + random.randint(-1, 1)
# 가중치와 노이즈 시뮬레이션
weights = random.random() # 랜덤 가중치 초기화
noise = random.random() / 5 # 노이즈 시뮬레이션을 위한 작은 랜덤 노이즈
# 하이퍼파라미터 및 설정
config = {
"epochs": 10, # 트레이닝할 에포크 수
"learning_rate": 0.01, # 옵티마이저의 학습률
}
# 컨텍스트 매니저를 사용하여 W&B runs 초기화 및 종료
with wandb.init(project=PROJECT, entity=TEAM_ENTITY, config=config) as run:
# 트레이닝 루프 시뮬레이션
for epoch in range(config["epochs"]):
xb = weights + noise # 시뮬레이션된 입력 트레이닝 데이터
yb = weights + noise * 2 # 시뮬레이션된 타겟 출력 (입력 노이즈의 두 배)
y_pred = model(xb) # 모델 예측값
loss = (yb - y_pred) ** 2 # Mean Squared Error loss
print(f"epoch={epoch}, loss={loss}")
# 에포크와 loss를 W&B에 로그
run.log({
"epoch": epoch,
"loss": loss,
})
# 모델 아티팩트의 고유 이름
model_artifact_name = f"model-demo"
# 시뮬레이션된 모델 파일을 저장할 로컬 경로
PATH = "model.txt"
# 모델을 로컬에 저장
with open(PATH, "w") as f:
f.write(str(weights)) # 모델 가중치를 파일에 저장
# 아티팩트 오브젝트 생성
# 로컬에 저장된 모델을 아티팩트 오브젝트에 추가
artifact = wandb.Artifact(name=model_artifact_name, type="model", description="My trained model")
artifact.add_file(local_path=PATH)
artifact.save()
이전 코드 블록의 핵심 요점은 다음과 같습니다:
- 트레이닝 중에 메트릭을 로그하려면
wandb.Run.log()를 사용합니다.
- 모델(데이터셋 등)을 아티팩트로 W&B 프로젝트에 저장하려면
wandb.Artifact를 사용합니다.
이제 모델을 트레이닝하고 아티팩트로 저장했으므로, 이를 W&B의 레지스트리에 게시할 수 있습니다. 프로젝트에서 아티팩트를 가져와 Model registry에 게시할 준비를 하려면 wandb.Run.use_artifact()를 사용하세요. wandb.Run.use_artifact()는 두 가지 주요 목적으로 사용됩니다:
- 프로젝트에서 아티팩트 오브젝트를 가져옵니다.
- 아티팩트를 run의 입력으로 표시하여 재현성과 계보(traceability)를 보장합니다. 자세한 내용은 계보 맵 생성 및 보기를 참조하세요.
대시보드에서 트레이닝 데이터 확인하기
https://wandb.ai/login 에서 계정에 로그인합니다.
Projects 아래에 my-awesome-project(또는 위에서 프로젝트 이름으로 설정한 것)가 보일 것입니다. 이를 클릭하여 프로젝트의 workspace로 들어갑니다.
여기에서 수행한 모든 run에 대한 세부 정보를 볼 수 있습니다. 아래 스크린샷에서는 코드가 여러 번 재실행되어 여러 개의 run이 생성되었으며, 각 run에는 무작위로 생성된 이름이 부여되었습니다.
W&B Registry에 모델 게시하기
조직의 다른 사람들과 모델을 공유하려면 wandb.Run.link_artifact()를 사용하여 모델을 collection에 게시하세요. 다음 코드는 아티팩트를 registry에 연결하여 팀에서 액세스할 수 있도록 합니다.
# 아티팩트 이름은 팀 프로젝트 내의 특정 아티팩트 버전을 지정합니다
artifact_name = f'{TEAM_ENTITY}/{PROJECT}/{model_artifact_name}:v0'
print("Artifact name: ", artifact_name)
REGISTRY_NAME = "Model" # W&B의 레지스트리 이름
COLLECTION_NAME = "DemoModels" # 레지스트리 내 컬렉션 이름
# 레지스트리 내 아티팩트의 타겟 경로 생성
target_path = f"wandb-registry-{REGISTRY_NAME}/{COLLECTION_NAME}"
print("Target path: ", target_path)
with wandb.init(entity=TEAM_ENTITY, project=PROJECT) as run:
model_artifact = run.use_artifact(artifact_or_name=artifact_name, type="model")
run.link_artifact(artifact=model_artifact, target_path=target_path)
wandb.Run.link_artifact()를 실행한 후, 모델 아티팩트는 레지스트리의 DemoModels 컬렉션에 위치하게 됩니다. 거기에서 버전 히스토리, 계보 맵 및 기타 메타데이터와 같은 세부 정보를 확인할 수 있습니다.
아티팩트를 레지스트리에 연결하는 방법에 대한 추가 정보는 레지스트리에 아티팩트 연결하기를 참조하세요.
추론을 위해 레지스트리에서 모델 아티팩트 가져오기
추론에 모델을 사용하려면 wandb.Run.use_artifact()를 사용하여 레지스트리에서 게시된 아티팩트를 가져옵니다. 그러면 아티팩트 오브젝트가 반환되며, wandb.Artifact.download()를 사용하여 아티팩트를 로컬 파일로 다운로드할 수 있습니다.
REGISTRY_NAME = "Model" # W&B의 레지스트리 이름
COLLECTION_NAME = "DemoModels" # 레지스트리 내 컬렉션 이름
VERSION = 0 # 가져올 아티팩트 버전
model_artifact_name = f"wandb-registry-{REGISTRY_NAME}/{COLLECTION_NAME}:v{VERSION}"
print(f"Model artifact name: {model_artifact_name}")
with wandb.init(entity=TEAM_ENTITY, project=PROJECT) as run:
registry_model = run.use_artifact(artifact_or_name=model_artifact_name)
local_model_path = registry_model.download()
레지스트리에서 아티팩트를 가져오는 방법에 대한 자세한 내용은 레지스트리에서 아티팩트 다운로드 및 사용을 참조하세요.
사용 중인 기계학습 프레임워크에 따라 가중치를 로드하기 전에 모델 아티렉처를 다시 생성해야 할 수도 있습니다. 이는 사용 중인 특정 프레임워크와 모델에 따라 다르므로 독자의 연습 과제로 남겨둡니다.
리포트로 결과 공유하기
W&B Report 및 Workspace API는 퍼블릭 프리뷰 단계입니다.
작업 내용을 요약하기 위해 리포트를 생성하고 공유하세요. 프로그래밍 방식으로 리포트를 생성하려면 W&B Report and Workspace API를 사용합니다.
먼저 W&B Reports API를 설치합니다:
pip install wandb wandb-workspaces -qqq
다음 코드 블록은 마크다운, 패널 그리드 등 여러 블록을 포함하는 리포트를 생성합니다. 블록을 더 추가하거나 기존 블록의 내용을 변경하여 리포트를 커스터마이징할 수 있습니다.
코드 블록의 출력 결과로 생성된 리포트의 URL 링크가 출력됩니다. 브라우저에서 이 링크를 열어 리포트를 확인할 수 있습니다.
import wandb_workspaces.reports.v2 as wr
experiment_summary = """W&B를 사용하여 단순 모델을 트레이닝하기 위해 수행된 실험의 요약입니다."""
dataset_info = """트레이닝에 사용된 데이터셋은 단순 모델에 의해 생성된 합성 데이터로 구성됩니다."""
model_info = """모델은 약간의 노이즈가 있는 입력 데이터를 기반으로 출력을 예측하는 단순 선형 회귀 모델입니다."""
report = wr.Report(
project=PROJECT,
entity=TEAM_ENTITY,
title="My Awesome Model Training Report",
description=experiment_summary,
blocks= [
wr.TableOfContents(),
wr.H2("실험 요약"),
wr.MarkdownBlock(text=experiment_summary),
wr.H2("데이터셋 정보"),
wr.MarkdownBlock(text=dataset_info),
wr.H2("모델 정보"),
wr.MarkdownBlock(text = model_info),
wr.PanelGrid(
panels=[
wr.LinePlot(title="Train Loss", x="Step", y=["loss"], title_x="Step", title_y="Loss")
],
),
]
)
# W&B에 리포트 저장
report.save()
프로그래밍 방식으로 리포트를 생성하는 방법이나 W&B 앱에서 대화형으로 리포트를 생성하는 방법에 대한 자세한 내용은 W&B Docs 개발자 가이드의 리포트 생성하기를 참조하세요.
레지스트리 쿼리하기
W&B Public APIs를 사용하여 W&B의 과거 데이터를 쿼리, 분석 및 관리하세요. 이는 아티팩트의 계보를 추적하고, 서로 다른 버전을 비교하며, 시간에 따른 모델의 성능을 분석하는 데 유용할 수 있습니다.
다음 코드 블록은 특정 컬렉션의 모든 아티팩트에 대해 Model registry를 쿼리하는 방법을 보여줍니다. 컬렉션을 가져와서 버전을 반복하며 각 아티팩트의 이름과 버전을 출력합니다.
import wandb
# wandb API 초기화
api = wandb.Api()
# 이름에 `model` 문자열이 포함되어 있고
# `text-classification` 태그 또는 `latest` 에일리어스를 가진 모든 아티팩트 버전 찾기
registry_filters = {
"name": {"$regex": "model"}
}
# 논리 $or 연산자를 사용하여 아티팩트 버전 필터링
version_filters = {
"$or": [
{"tag": "text-classification"},
{"alias": "latest"}
]
}
# 필터와 일치하는 모든 아티팩트 버전의 이터러블 반환
artifacts = api.registries(filter=registry_filters).collections().versions(filter=version_filters)
# 찾은 각 아티팩트의 이름, 컬렉션, 에일리어스, 태그, 생성 날짜 출력
for art in artifacts:
print(f"artifact name: {art.name}")
print(f"collection artifact belongs to: { art.collection.name}")
print(f"artifact aliases: {art.aliases}")
print(f"tags attached to artifact: {art.tags}")
print(f"artifact created at: {art.created_at}\n")
레지스트리 쿼리에 대한 자세한 내용은 MongoDB 스타일 쿼리로 레지스트리 아이템 쿼리하기를 참조하세요.