メインコンテンツまでスキップ

Fastai

fastai を使ってモデルをトレーニングする場合、W&B の WandbCallback を使用した簡単なインテグレーションがあります。インタラクティブなドキュメントとサンプルはこちら →

W&B でログを取る

a) Sign up して、無料アカウントに登録し、次に wandb アカウントにログインします。

b) Python 3 環境で pip を使用して wandb ライブラリをマシンにインストールします。

c) マシンで wandb ライブラリにログインします。APIキーはここで見つかります: https://wandb.ai/authorize.

pip install wandb
wandb login

次に WandbCallbacklearner または fit メソッドに追加します:

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 docs を参照してください。

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ログされたデータセットの名前 (デフォルトは フォルダー名)。
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

この場合、マシンには2つのGPUがあります。

メインプロセスのみでのログ

上記の例では、wandb はプロセスごとに1つの run を起動します。トレーニング終了時に2つの 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

Examples

Was this page helpful?👍👎