메인 콘텐츠로 건너뛰기
WandbCallback 클래스를 사용하여 fastai를 W&B와 연동할 수 있습니다. 자세한 내용은 예제가 포함된 대화형 문서를 참고하세요.

가입 및 API key 생성

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

wandb 라이브러리를 설치하고 로그인하기

로컬 환경에 wandb 라이브러리를 설치하고 로그인하려면 다음 단계를 따르세요.
  1. WANDB_API_KEY 환경 변수를 API key로 설정합니다.
    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 실행 로깅 시작
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(기본값). 손실과 메트릭은 항상 로깅됩니다.
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는 이를 자동으로 처리하여, Multi-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가 프로세스마다 하나의 실행을 시작합니다. 학습이 끝나면 실행이 두 개 생기게 됩니다. 이는 때때로 혼란스러울 수 있으며, 메인 프로세스에서만 로그를 남기고 싶을 수 있습니다. 이를 위해서는 현재 자신이 어떤 프로세스에서 실행 중인지 직접 감지하고, 나머지 프로세스들에서는 실행을 생성하지 않도록(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

예시