メインコンテンツへスキップ
WandbCallback クラスを使用することで、 fastai を W&B とインテグレーションできます。詳細については、こちらの 例付きインタラクティブドキュメント をご覧ください。

サインアップと API キーの作成

API キーは、お使いのマシンを W&B に対して認証するために使用されます。 API キーはユーザープロファイルから生成できます。
For a more streamlined approach, create an API key by going directly to User Settings. Copy the newly created API key immediately and save it in a secure location such as a password manager.
  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")

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

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

WandbCallback の引数

WandbCallback は以下の引数を受け取ります:
引数説明
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 はこれを自動的にサポートしており、設定不要でマルチ GPU 実験を追跡できます。 以下の最小構成の例を確認してください:
import wandb
from fastai.vision.all import *
from fastai.distributed import *
from fastai.callback.wandb import WandbCallback

# experiment="service" を指定して wandb.require を実行
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
この場合、マシンには 2 つの GPU が搭載されています。

メインプロセスのみでログを記録する

上記の例では、 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),
    )
    # ランク0(メインプロセス)のみ wandb を初期化
    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