가중치와 편향: KDnuggets 단기집중과정


작성자별 이미지
단일 노트북 이상으로 모델을 훈련하는 경우에도 동일한 문제에 직면하게 될 것입니다. 5개의 손잡이를 조정하고 훈련을 다시 실행하면 금요일이 되면 어떤 실행이 “좋은” ROC 곡선을 생성했는지 또는 어떤 데이터 조각을 사용했는지 기억할 수 없습니다. 가중치 및 편향 (W&B)는 측정항목, 구성, 도표, 데이터 세트, 모델 등의 서류상 추적을 제공하므로 추측이 아닌 증거를 통해 변경 사항에 답할 수 있습니다.
아래는 실제 투어입니다. 독선적이고 경쾌하며 자체 플랫폼을 구축하지 않고도 깔끔한 실험 기록을 원하는 팀을 위해 맞춰졌습니다. 이를 무보풀 연습이라고 부르겠습니다.
# 왜 W&B인가?
노트북은 실험으로 성장합니다. 실험이 늘어납니다. 곧 다음과 같이 질문하게 됩니다. 어떤 실행에서 해당 데이터 조각을 사용했나요? 오늘의 ROC 곡선이 더 높은 이유는 무엇입니까? 지난 주 기준을 재현할 수 있나요?
W&B는 다음을 수행할 수 있는 장소를 제공합니다.
- 측정항목, 구성, 플롯 및 시스템 통계를 기록합니다.
- 아티팩트가 있는 버전 데이터 세트 및 모델
- 하이퍼파라미터 스윕 실행
- 스크린샷 없이 대시보드 공유
필요할 때 작은 기능과 레이어 기능을 시작할 수 있습니다.
# 60초 만에 설정
라이브러리를 설치하고 API 키로 로그인하여 시작하세요. 아직 없으시다면 여기에서 찾으실 수 있습니다.
pip install wandb
wandb login # paste your API key once


작성자별 이미지
// 최소한의 온전성 검사
import wandb, random, time
wandb.init(project="kdn-crashcourse", name="hello-run", config={"lr": 0.001, "epochs": 5})
for epoch in range(wandb.config.epochs):
loss = 1.0 / (epoch + 1) + random.random() * 0.05
wandb.log({"epoch": epoch, "loss": loss})
time.sleep(0.1)
wandb.finish()
이제 다음과 같은 내용이 표시됩니다.


작성자별 이미지
이제 유용한 부분을 살펴보겠습니다.
# 실험을 올바르게 추적하기
// 하이퍼파라미터 및 측정항목 로그
대하다 wandb.config
실험 손잡이에 대한 단일 정보 소스로 사용됩니다. 차트가 자동 그룹화되도록 측정항목에 명확한 이름을 지정하세요.
cfg = dict(arch="resnet18", lr=3e-4, batch=64, seed=42)
run = wandb.init(project="kdn-mlops", config=cfg, tags=["baseline"])
# training loop ...
for step, (x, y) in enumerate(loader):
# ... compute loss, acc
wandb.log({"train/loss": loss.item(), "train/acc": acc, "step": step})
# log a final summary
run.summary["best_val_auc"] = best_auc
몇 가지 팁:
- 다음과 같은 네임스페이스를 사용하세요.
train/loss
또는val/auc
차트를 자동으로 그룹화하려면 - 다음과 같은 태그를 추가하세요.
"lr-finder"
또는"fp16"
나중에 실행을 필터링할 수 있도록 - 사용
run.summary[...]
실행 카드에서 확인하고 싶은 일회성 결과의 경우
// 로그 이미지, 혼동 행렬 및 사용자 정의 플롯
wandb.log({
"val/confusion": wandb.plot.confusion_matrix(
preds=preds, y_true=y_true, class_names=classes)
})
Matplotlib 플롯을 저장할 수도 있습니다.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(history)
wandb.log({"training/curve": fig})
// 아티팩트가 포함된 버전 데이터 세트 및 모델
아티팩트는 “이 실행에서 사용한 정확한 파일은 무엇입니까?”와 같은 질문에 답합니다. 그리고 “우리는 무엇을 훈련했습니까?” 더 이상은 안돼 final_final_v3.parquet
미스터리.
import wandb
run = wandb.init(project="kdn-mlops")
# Create a dataset artifact (run once per version)
raw = wandb.Artifact("imdb_reviews", type="dataset", description="raw dump v1")
raw.add_dir("data/raw") # or add_file("path")
run.log_artifact(raw)
# Later, consume the latest version
artifact = run.use_artifact("imdb_reviews:latest")
data_dir = artifact.download() # folder path pinned to a hash
동일한 방식으로 모델을 기록합니다.
import torch
import wandb
run = wandb.init(project="kdn-mlops")
model_path = "models/resnet18.pt"
torch.save(model.state_dict(), model_path)
model_art = wandb.Artifact("sentiment-resnet18", type="model")
model_art.add_file(model_path)
run.log_artifact(model_art)
이제 계보가 분명해졌습니다. 이 모델은 이 코드 커밋에 따라 해당 데이터에서 나왔습니다.
// 평가 및 오류 분석을 위한 표
wandb.Table
결과, 예측, 슬라이스를 위한 가벼운 데이터프레임입니다.
table = wandb.Table(columns=["id", "text", "pred", "true", "prob"])
for r in batch_results:
table.add_data(r.id, r.text, r.pred, r.true, r.prob)
wandb.log({"eval/preds": table})
UI의 테이블을 필터링하여 실패 패턴(예: 짧은 리뷰, 희귀 클래스 등)을 찾습니다.
// 하이퍼파라미터 스윕
YAML에서 검색 공간을 정의하고, 에이전트를 실행하고, W&B가 조정하도록 하세요.
# sweep.yaml
method: bayes
metric: {name: val/auc, goal: maximize}
parameters:
lr: {min: 1e-5, max: 1e-2}
batch: {values: [32, 64, 128]}
dropout: {min: 0.0, max: 0.5}
스윕을 시작합니다.
wandb sweep sweep.yaml # returns a SWEEP_ID
wandb agent // # run 1+ agents
훈련 스크립트는 다음과 같아야 합니다. wandb.config
~을 위한 lr
, batch
등. 대시보드에는 최고 시도, 평행 좌표 및 최상의 구성이 표시됩니다.
# 드롭인 통합
사용하는 것을 선택하고 계속 이동하십시오.
// 파이토치 라이트닝
from pytorch_lightning.loggers import WandbLogger
logger = WandbLogger(project="kdn-mlops")
trainer = pl.Trainer(logger=logger, max_epochs=10)
// 딱딱한
import wandb
from wandb.keras import WandbCallback
wandb.init(project="kdn-mlops", config={"epochs": 10})
model.fit(X, y, epochs=wandb.config.epochs, callbacks=[WandbCallback()])
// Scikit 학습
from sklearn.metrics import roc_auc_score
wandb.init(project="kdn-mlops", config={"C": 1.0})
# ... fit model
wandb.log({"val/auc": roc_auc_score(y_true, y_prob)})
# 모델 레지스트리 및 스테이징
레지스트리를 최고의 모델에 대한 명명된 선반으로 생각하십시오. 아티팩트를 한 번 푸시한 후 다음과 같은 별칭을 관리합니다. staging
또는 production
따라서 다운스트림 코드는 파일 경로를 추측하지 않고도 올바른 코드를 가져올 수 있습니다.
run = wandb.init(project="kdn-mlops")
art = run.use_artifact("sentiment-resnet18:latest")
registry = wandb.sdk.artifacts.model_registry.ModelRegistry()
entry = registry.push(art, name="sentiment-classifier")
entry.aliases.add("staging")
새 빌드를 승격할 때 별칭을 뒤집습니다. 소비자는 항상 읽는다 sentiment-classifier:production
.
# 재현성 체크리스트
- 구성: 모든 하이퍼파라미터를 저장
wandb.config
- 코드 및 커밋: 사용
wandb.init(settings=wandb.Settings(code_dir="."))
코드를 스냅샷하거나 CI를 사용하여 git SHA를 연결합니다. - 환경: 통나무
requirements.txt
또는 Docker 태그를 사용하여 아티팩트에 포함합니다. - 씨앗: 기록하고 설정하세요.
최소 시드 도우미:
def set_seeds(s=42):
import random, numpy as np, torch
random.seed(s)
np.random.seed(s)
torch.manual_seed(s)
torch.cuda.manual_seed_all(s)
# 스크린샷 없이 협업 및 공유
팀원이 검색할 수 있도록 메모와 태그를 추가하세요. 보고서를 사용하여 Slack이나 PR에 드롭할 수 있는 링크에 차트, 표, 설명을 연결하세요. 이해관계자는 노트북을 열지 않고도 따라갈 수 있습니다.
# CI 및 자동화 팁
- 달리다
wandb agent
CI에서 스윕을 실행하기 위한 훈련 노드 - ETL 작업 후에 데이터세트 아티팩트를 기록합니다. 훈련 작업은 명시적으로 해당 버전에 따라 달라질 수 있습니다.
- 평가 후 모델 별칭 승격(
staging
→production
) 작은 후속 단계에서 - 통과하다
WANDB_API_KEY
비밀 및 그룹 관련 실행으로WANDB_RUN_GROUP
# 개인 정보 보호 및 신뢰성 팁
- 팀을 위해 기본적으로 개인 프로젝트 사용
- Air-Gapped 실행에는 오프라인 모드를 사용합니다. 그럼 정상적으로 훈련하세요.
wandb sync
나중에
export WANDB_MODE=offline
- 원시 PII를 기록하지 마세요. 필요한 경우 로깅하기 전에 ID를 해시합니다.
- 대용량 파일의 경우 파일을 첨부하는 대신 아티팩트로 저장하세요.
wandb.log
.
# 일반적인 문제(및 빠른 수정)
- “내 달리기 기록에는 아무것도 기록되지 않았습니다.” 이전에 스크립트가 충돌했을 수 있습니다.
wandb.finish()
불렀다. 또한 설정하지 않았는지 확인하세요.WANDB_DISABLED=true
당신의 환경에서. - 로깅이 느리게 느껴집니다. 각 단계에서 스칼라를 기록하되, 시대가 끝날 때를 대비해 이미지나 테이블과 같은 무거운 자산을 저장하세요. 합격하실 수도 있습니다
commit=False
에게wandb.log()
여러 로그를 함께 일괄 처리합니다. - UI에 중복 실행이 표시됩니까? 체크포인트에서 다시 시작하는 경우 다음을 설정하십시오.
id
그리고resume="allow"
~에wandb.init()
같은 실행을 계속합니다. - 미스터리한 데이터 드리프트를 경험하시나요? 모든 데이터세트 스냅샷을 아티팩트에 넣고 실행을 명시적 버전에 고정하세요.
# 포켓 치트시트
// 1. 달리기 시작
wandb.init(project="proj", config=cfg, tags=["baseline"])
// 2. 로그 측정항목, 이미지 또는 테이블
wandb.log({"train/loss": loss, "img": [wandb.Image(img)]})
// 3. 데이터 세트 또는 모델 버전 지정
art = wandb.Artifact("name", type="dataset")
art.add_dir("path")
run.log_artifact(art)
// 4. 아티팩트 소비
path = run.use_artifact("name:latest").download()
// 5. 스윕 실행
wandb sweep sweep.yaml && wandb agent //
# 마무리
작게 시작하세요. 실행을 초기화하고, 몇 가지 지표를 기록하고, 모델 파일을 아티팩트로 푸시하세요. 그것이 자연스러워지면 정리와 짧은 보고서를 추가하세요. 재현 가능한 실험, 추적 가능한 데이터 및 모델, 그리고 슬라이드쇼 없이 작업을 설명하는 대시보드를 얻게 될 것입니다.
조셉 페레르 바르셀로나 출신의 분석 엔지니어입니다. 물리학공학과를 졸업하고 현재 인간 이동성에 적용되는 데이터 과학 분야에서 일하고 있다. 그는 데이터 과학 및 기술에 중점을 둔 시간제 콘텐츠 제작자입니다. Josep은 현장에서 진행 중인 폭발적인 적용을 다루면서 AI에 관한 모든 것에 대해 글을 씁니다.
Post Comment