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

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

가중치 및 편향: KDnuggets 단기 집중 강좌가중치 및 편향: KDnuggets 단기 집중 강좌
작성자별 이미지

단일 노트북 이상으로 모델을 훈련하는 경우에도 동일한 문제에 직면하게 될 것입니다. 5개의 손잡이를 조정하고 훈련을 다시 실행하면 금요일이 되면 어떤 실행이 “좋은” ROC 곡선을 생성했는지 또는 어떤 데이터 조각을 사용했는지 기억할 수 없습니다. 가중치 및 편향 (W&B)는 측정항목, 구성, 도표, 데이터 세트, 모델 등의 서류상 추적을 제공하므로 추측이 아닌 증거를 통해 변경 사항에 답할 수 있습니다.

아래는 실제 투어입니다. 독선적이고 경쾌하며 자체 플랫폼을 구축하지 않고도 깔끔한 실험 기록을 원하는 팀을 위해 맞춰졌습니다. 이를 무보풀 연습이라고 부르겠습니다.

# 왜 W&B인가?

노트북은 실험으로 성장합니다. 실험이 늘어납니다. 곧 다음과 같이 질문하게 됩니다. 어떤 실행에서 해당 데이터 조각을 사용했나요? 오늘의 ROC 곡선이 더 높은 이유는 무엇입니까? 지난 주 기준을 재현할 수 있나요?

W&B는 다음을 수행할 수 있는 장소를 제공합니다.

  • 측정항목, 구성, 플롯 및 시스템 통계를 기록합니다.
  • 아티팩트가 있는 버전 데이터 세트 및 모델
  • 하이퍼파라미터 스윕 실행
  • 스크린샷 없이 대시보드 공유

필요할 때 작은 기능과 레이어 기능을 시작할 수 있습니다.

# 60초 만에 설정

라이브러리를 설치하고 API 키로 로그인하여 시작하세요. 아직 없으시다면 여기에서 찾으실 수 있습니다.

pip install wandb
wandb login # paste your API key once

가중치 및 편향: KDnuggets 단기 집중 강좌가중치 및 편향: KDnuggets 단기 집중 강좌
작성자별 이미지

// 최소한의 온전성 검사

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()

이제 다음과 같은 내용이 표시됩니다.

가중치 및 편향: KDnuggets 단기 집중 강좌가중치 및 편향: KDnuggets 단기 집중 강좌
작성자별 이미지

이제 유용한 부분을 살펴보겠습니다.

# 실험을 올바르게 추적하기

// 하이퍼파라미터 및 측정항목 로그

대하다 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 작업 후에 데이터세트 아티팩트를 기록합니다. 훈련 작업은 명시적으로 해당 버전에 따라 달라질 수 있습니다.
  • 평가 후 모델 별칭 승격(stagingproduction) 작은 후속 단계에서
  • 통과하다 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

당신은 놓쳤을 수도 있습니다