Skip to main content
WandbCallback 클래스를 사용해 fastai를 W&B와 통합할 수 있습니다. 자세한 내용은 예제가 포함된 대화형 문서를 확인하세요.

가입하고 API 키 만들기

API 키는 사용 중인 머신을 W&B에 인증하는 데 사용됩니다. 사용자 프로필에서 API 키를 생성할 수 있습니다.
더 간편하게 하려면 User Settings로 바로 이동해 API 키를 생성하세요. 새로 생성한 API 키는 즉시 복사해 비밀번호 관리자와 같은 안전한 위치에 저장하세요.
  1. 오른쪽 상단에 있는 사용자 프로필 아이콘을 클릭합니다.
  2. User Settings를 선택한 다음 API Keys 섹션으로 스크롤합니다.

wandb 라이브러리 설치 및 로그인

로컬에 wandb 라이브러리를 설치하고 로그인하려면 다음 단계를 따르세요.
  1. WANDB_API_KEY 환경 변수를 API 키로 설정합니다.
    export WANDB_API_KEY=<your_api_key>
    
  2. wandb 라이브러리를 설치하고 로그인합니다.
    pip install wandb
    
    wandb login
    

learner 또는 fit 방법에 WandbCallback 추가하기

import wandb
from fastai.callback.wandb import *

# wandb run 로깅 시작
wandb.init(project="my_project")

# 하나의 트레이닝 단계에서만 로깅하려면
learn.fit(..., cbs=WandbCallback())

# 모든 트레이닝 단계에서 지속적으로 로깅하려면
learn = learner(..., cbs=WandbCallback())
Fastai 버전 1을 사용하는 경우 Fastai v1 문서를 참고하세요.

WandbCallback 매개변수

WandbCallback은 다음 매개변수를 받습니다:
ArgsDescription
log모델의 gradients, parameters, all 또는 None(기본값)을 로깅할지 여부입니다. loss 및 메트릭은 항상 로깅됩니다.
log_preds예측 샘플을 로깅할지 여부입니다(기본값은 True).
log_preds_every_epoch매 에포크마다 예측을 로깅할지, 아니면 마지막에 로깅할지 여부입니다(기본값은 False).
log_model모델을 로깅할지 여부입니다(기본값은 False). 이 옵션을 사용하려면 SaveModelCallback도 필요합니다.
model_name저장할 file 이름입니다. SaveModelCallback을 재정의합니다.
log_dataset
  • False (기본값)
  • True이면 learn.dls.path가 가리키는 폴더를 로깅합니다.
  • 로깅할 폴더를 가리키도록 경로를 명시적으로 지정할 수 있습니다.

참고: “models” 하위 폴더는 항상 무시됩니다.

dataset_name로깅되는 데이터셋의 이름입니다(기본값은 folder name).
valid_dl예측 샘플에 사용할 항목이 들어 있는 DataLoaders입니다(기본값은 learn.dls.valid에서 무작위로 선택한 항목).
n_preds로깅할 예측 수입니다(기본값은 36).
seed무작위 샘플을 정하는 데 사용됩니다.
맞춤형 워크플로의 경우 데이터셋과 모델을 수동으로 로깅할 수 있습니다:
  • log_dataset(path, name=None, metadata={})
  • log_model(path, name=None, metadata={})
참고: “models” 하위 폴더는 모두 무시됩니다.

분산 트레이닝

fastai는 컨텍스트 매니저 distrib_ctx를 사용해 분산 트레이닝을 지원합니다. W&B는 이를 자동으로 지원하므로, 별도 설정 없이 멀티 GPU 실험을 추적할 수 있습니다. 다음의 최소 예제를 살펴보세요:
import wandb
from fastai.vision.all import *
from fastai.distributed import *
from fastai.callback.wandb import WandbCallback

wandb.require(experiment="service")
path = rank0_first(lambda: untar_data(URLs.PETS) / "images")

def train():
    dls = ImageDataLoaders.from_name_func(
        path,
        get_image_files(path),
        valid_pct=0.2,
        label_func=lambda x: x[0].isupper(),
        item_tfms=Resize(224),
    )
    wandb.init("fastai_ddp", entity="capecape")
    cb = WandbCallback()
    learn = vision_learner(dls, resnet34, metrics=error_rate, cbs=cb).to_fp16()
    with learn.distrib_ctx(sync_bn=False):
        learn.fit(1)

if __name__ == "__main__":
    train()
그런 다음 터미널에서 다음 명령을 실행합니다:
$ torchrun --nproc_per_node 2 train.py
이 경우 이 머신에는 GPU가 2개 있습니다.

메인 프로세스에서만 로깅하기

위 예시에서는 wandb가 프로세스마다 하나의 run을 생성합니다. 트레이닝이 끝나면 run이 두 개 생깁니다. 이 때문에 혼란스러울 수 있으므로, 메인 프로세스에서만 로그를 기록하고 싶을 수 있습니다. 이렇게 하려면 현재 어떤 프로세스에서 실행 중인지 직접 확인하고, 다른 모든 프로세스에서는 run을 생성하지 않도록(wandb.init를 호출하지 않도록) 해야 합니다.
import wandb
from fastai.vision.all import *
from fastai.distributed import *
from fastai.callback.wandb import WandbCallback

wandb.require(experiment="service")
path = rank0_first(lambda: untar_data(URLs.PETS) / "images")

def train():
    cb = []
    dls = ImageDataLoaders.from_name_func(
        path,
        get_image_files(path),
        valid_pct=0.2,
        label_func=lambda x: x[0].isupper(),
        item_tfms=Resize(224),
    )
    if rank_distrib() == 0:
        run = wandb.init("fastai_ddp", entity="capecape")
        cb = WandbCallback()
    learn = vision_learner(dls, resnet34, metrics=error_rate, cbs=cb).to_fp16()
    with learn.distrib_ctx(sync_bn=False):
        learn.fit(1)

if __name__ == "__main__":
    train()
터미널에서 다음을 실행합니다:
$ torchrun --nproc_per_node 2 train.py

예제