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
    

WandbCallbacklearner または fit method に追加する

import wandb
from fastai.callback.wandb import *

# wandb runのログを開始する
wandb.init(project="my_project")

# 1つのトレーニングフェーズのみログする場合
learn.fit(..., cbs=WandbCallback())

# すべてのトレーニングフェーズで継続的にログする場合
learn = learner(..., cbs=WandbCallback())
Fastai バージョン 1 を使用している場合は、Fastai v1 ドキュメントを参照してください。

WandbCallback の引数

WandbCallback は次の引数を受け取ります。
ArgsDescription
logモデルの gradientsparametersall、または 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 はこれに自動的に対応しており、追加設定なしでマルチ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 は各プロセスごとに 1 つの run を起動します。トレーニングの最後には、2 つの 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