> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-docs-hivemind-launch.mintlify.site/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">
    ```notebook 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>

```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` は次の引数を受け取ります。

| Args                     | Description                                                                                                                                                                                     |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 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            | ログされるデータセットの名 (デフォルトは `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" は常に無視されます。*

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

`fastai` は、コンテキストマネージャー `distrib_ctx` を使った分散トレーニングをサポートしています。W\&B はこれに自動的に対応しており、追加設定なしでマルチGPUの 実験 をトラッキングできます。

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

<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>

上記の例では、`wandb` は各プロセスごとに 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()

    ```

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

    ```

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