> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wandb.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# fastai

> WandbCallback を使用して fastai と W&B を統合し、実験をトラッキングし、メトリクスをログして、モデル性能を可視化します。

`WandbCallback` クラスを使用して、**fastai** を W\&B に統合し、実験をトラッキングし、メトリクスをログして、トレーニング中のモデル性能を可視化できます。このページでは、認証を設定し、トレーニングループにコールバックを追加し、シングルプロセスおよび分散トレーニングの両方でログする方法を説明します。詳細については、[例付きのインタラクティブなドキュメント](https://app.wandb.ai/borisd13/demo_config/reports/Visualize-track-compare-Fastai-models--Vmlldzo4MzAyNA)をご覧ください。

<div id="sign-up-and-create-an-api-key">
  ## サインアップしてAPIキーを発行する
</div>

APIキーは、マシンをW\&Bに対して認証するためのものです。APIキーはプロフィールから発行できます。

<Note>
  より手早く行うには、[User Settings](https://wandb.ai/settings) にアクセスしてAPIキーを作成してください。APIキーはすぐにコピーし、パスワードマネージャーなどの安全な場所に保存してください。
</Note>

1. 右上にあるプロフィールアイコンをクリックします。
2. **User Settings** を選択し、**API Keys** セクションまでスクロールします。

<div id="install-the-wandb-library-and-log-in">
  ## `wandb` ライブラリをインストールしてログインする
</div>

`wandb` ライブラリをローカルにインストールしてログインするには、次の手順を実行します。

<Tabs>
  <Tab title="コマンドライン">
    1. `WANDB_API_KEY` の[環境変数](/ja/models/track/environment-variables/)に APIキー を設定します。`<>` で囲まれた値は、ご自身の値に置き換えてください。

       ```bash theme={null}
       export WANDB_API_KEY=<your_api_key>
       ```

    2. `wandb` ライブラリをインストールしてログインします。

       ```shell theme={null}
       pip install wandb

       wandb login
       ```
  </Tab>

  <Tab title="Python">
    ```bash theme={null}
    pip install wandb
    ```

    ```python theme={null}
    import wandb
    wandb.login()
    ```
  </Tab>

  <Tab title="Python notebook">
    ```python theme={null}
    !pip install wandb

    import wandb
    wandb.login()
    ```
  </Tab>
</Tabs>

<div id="add-the-wandbcallback-to-the-learner-or-fit-method">
  ## `WandbCallback` を `learner` または `fit` method に追加する
</div>

fastai のトレーニング run のログを W\&B で開始するには、`WandbCallback` を単一の `fit` call または `learner` 自体にアタッチします。

```python theme={null}
import wandb
from fastai.callback.wandb import *

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

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

# すべてのトレーニングフェーズで継続的にログする場合
learn = learner(..., cbs=WandbCallback())
```

<Note>
  fastai バージョン 1 を使用している場合は、[fastai v1 ドキュメント](/ja/models/integrations/fastai/v1/)を参照してください。
</Note>

<div id="wandbcallback-arguments">
  ## WandbCallback の引数
</div>

トレーニング中に `WandbCallback` が何をログするかを制御するには、次の引数を使用します。

| 引数                      | 説明                                                                                                                                                                                                     |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `log`                   | モデルの `gradients`、`parameters`、`all`、または `None` (デフォルト) のどれをログするかを指定します。損失とメトリクスは常にログされます。                                                                                                              |
| `log_preds`             | 予測サンプルをログするかどうかを指定します (デフォルトは `True`) 。                                                                                                                                                                |
| `log_preds_every_epoch` | 予測をエポックごとにログするか、最後にまとめてログするかを指定します (デフォルトは `False`) 。                                                                                                                                                  |
| `log_model`             | モデルをログするかどうかを指定します (デフォルトは `False`) 。これには `SaveModelCallback` も必要です。                                                                                                                                   |
| `model_name`            | 保存する `file` の名です。`SaveModelCallback` より優先されます。                                                                                                                                                         |
| `log_dataset`           | <ul><li><code>False</code> (デフォルト) 。</li><li><code>True</code> の場合、`learn.dls.path` が参照するフォルダーをログします。</li><li>ログするフォルダーを指定するパスを明示的に定義することもできます。</li></ul><p><em>注: "models" サブフォルダーは常に無視されます。</em></p> |
| `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" サブフォルダーは無視されます。*

<div id="distributed-training">
  ## 分散トレーニング
</div>

`fastai` は、コンテキストマネージャー `distrib_ctx` を使った分散トレーニングをサポートしています。W\&B はこれに自動的に対応しており、追加設定なしでマルチGPUの 実験 をトラッキングできます。以下のセクションでは、W\&B を分散トレーニングと統合する方法と、メインプロセスでのみログするように制限する方法について説明します。

以下の最小限の例を確認してください。

<Tabs>
  <Tab title="スクリプト">
    ```python theme={null}
    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()
    ```

    次に、ターミナルで以下を実行します。

    ```shell theme={null}
    torchrun --nproc_per_node 2 train.py
    ```

    この例では、マシンに GPU が 2 基あります。
  </Tab>

  <Tab title="Python notebook">
    ノートブック内で直接分散トレーニングを実行できるようになりました。

    ```python theme={null}
    import wandb
    from fastai.vision.all import *

    from accelerate import notebook_launcher
    from fastai.distributed import *
    from fastai.callback.wandb import WandbCallback

    wandb.require(experiment="service")
    path = 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(in_notebook=True, sync_bn=False):
            learn.fit(1)

    notebook_launcher(train, num_processes=2)
    ```
  </Tab>
</Tabs>

<div id="log-only-on-the-main-process">
  ### メインプロセスでのみログする
</div>

前の例では、W\&B は各プロセスごとに 1 つの run を起動します。トレーニングの最後には、2 つの run ができます。これは混乱のもとになることがあるため、メインプロセスでのみログしたい場合があります。そのためには、どのプロセスで実行しているかを手動で判別し、それ以外のすべてのプロセスでは run を作成しないようにする (`wandb.init()` を呼び出さない) 必要があります。

<Tabs>
  <Tab title="スクリプト">
    ```python theme={null}
    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()
    ```

    ターミナルで次を実行します。

    ```shell theme={null}
    torchrun --nproc_per_node 2 train.py
    ```
  </Tab>

  <Tab title="Python notebook">
    ```python theme={null}
    import wandb
    from fastai.vision.all import *

    from accelerate import notebook_launcher
    from fastai.distributed import *
    from fastai.callback.wandb import WandbCallback

    wandb.require(experiment="service")
    path = 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(in_notebook=True, sync_bn=False):
            learn.fit(1)

    notebook_launcher(train, num_processes=2)
    ```
  </Tab>
</Tabs>

<div id="examples">
  ## 例
</div>

fastaiインテグレーションのエンドツーエンドのデモについては、以下の資料を参照してください。

* [fastaiモデルの可視化、トラッキング、比較](https://app.wandb.ai/borisd13/demo_config/reports/Visualize-track-compare-Fastai-models--Vmlldzo4MzAyNA): 解説付きのウォークスルーです。
* [CamVidにおける画像セグメンテーション](https://colab.research.google.com/drive/1IWrhwcJoncCKHm6VXsNwOr9Yukhz3B49?usp=sharing): このインテグレーションのサンプルユースケースです。
