メインコンテンツへスキップ
wandb.init() を使って W&B Run を初期化します。 デフォルトでは、wandb.init() を呼び出したとき、各 Python プロセスには同時にアクティブな run が 1 つだけ存在するものと W&B は想定します。もう一度 wandb.init() を呼び出すと、W&B は同じ run を返すか、古い run を終了してから新しい run を開始します。同一プロセス内で wandb.init() を複数回呼び出した場合の挙動は、実行環境(notebook か非 notebook か)と reinit 設定によって変わります。 同一プロセス内で複数のアクティブな run を管理する場合は、Multiple runs in one process を参照してください。
wandb.init() を呼び出すときは with ブロックを使うことを W&B は推奨します。これにより、ブロックの終了時に W&B が run を正しく終了し、すべてのデータをアップロードできるようになります。

1プロセスにつき1つの run

以下のコードスニペットでは、W&B Python SDK をインポートし、run を初期化します。
basic.py
import wandb

with wandb.init(entity="nico", project="awesome-project") as run:
    # ここに学習ロジックを記述
次のコードスニペットは、次のような出力を生成します。
🚀 View run exalted-darkness-6 at: 
https://wandb.ai/nico/awesome-project/runs/pgbn9y21
Find logs at: wandb/run-20241106_090747-pgbn9y21/logs
この出力は、W&B が entity nico 配下のプロジェクト awesome-project に run exalted-darkness-6 をログしたことを示しています。pgbn9y21 は、この run に対して W&B が生成した一意の run ID です。

1 つのプロセス内で複数の run を扱う

1 つの Python プロセス内で複数の run を管理します。これは、メインのプロセスをアクティブなまま維持しつつ、サブタスク用に短期間だけ動作するセカンダリプロセスを作成したいワークフローで便利です。代表的なユースケースとしては次のようなものがあります:
  • スクリプト全体を通して 1 つの「プライマリ」run をアクティブに保ちながら、評価やサブタスク用に短期間の「セカンダリ」run を立ち上げる。
  • 1 つのファイルの中でサブ実験をまとめて実行・管理する。
  • 1 つの「メイン」プロセスから、異なるタスクや期間を表す複数の run に対してログを記録する。
デフォルトでは、wandb.init() を呼び出したとき、各 Python プロセスには同時に 1 つのアクティブな run だけが存在すると W&B は想定します。もう一度 wandb.init() を呼び出すと、W&B は同じ run を返すか、あるいは新しい run を開始する前に古い run を終了します。どちらになるかは設定によって異なります。 このガイドでは、reinit を使って wandb.init() の動作を変更し、1 つの Python プロセス内で複数の run を有効にする方法を説明します。
Requirements1 つの Python プロセス内で複数の run を管理するには、W&B Python SDK のバージョン v0.19.10 以降が必要です。

reinit オプション

reinit パラメータを使って、同一プロセス内で複数回 wandb.init() を呼び出したときの W&B の動作を設定します。次の表は、有効な引数とその挙動を示します。
説明run を作成するか?ユースケースの例
create_new既存のアクティブな run を終了せずに、wandb.init() で新しい run を作成します。W&B はグローバルな wandb.Run を新しい run に自動的には切り替えません。各 run オブジェクトは自分で保持する必要があります。詳細は下記の 1 プロセス内で複数 run を扱う例 を参照してください。Yes並行プロセスを作成・管理する場合に最適です。例えば、常にアクティブな「メイン」の run を維持しつつ、「サブ」の run を開始・終了する場合などです。
finish_previous新しい run を wandb.init() で作成する前に、すべてのアクティブな run を run.finish() で終了します。ノートブック以外の環境でのデフォルト動作です。Yes連続するサブプロセスを、それぞれ個別の run に分割したい場合に最適です。
return_previous最新の、未完了の run を返します。ノートブック環境でのデフォルト動作です。No
Hugging Face Trainer、Keras callbacks、PyTorch Lightning など、単一のグローバル run を前提とする W&B Integrations では、create_new モードはサポートされていません。これらのインテグレーションを使用する場合は、各サブ実験を個別のプロセスで実行する必要があります。

reinit の指定方法

  • reinit 引数を直接指定して wandb.init() を使用します:
    import wandb
    with wandb.init(reinit="<create_new|finish_previous|return_previous>") as run:
        # ここにコードを記述
    
  • wandb.init() を使用し、settings パラメータに wandb.Settings オブジェクトを渡します。Settings オブジェクト内で reinit を指定します:
    import wandb
    with wandb.init(settings=wandb.Settings(reinit="<create_new|finish_previous|return_previous>")) as run:
        # ここにコードを記述
    
  • 現在のプロセス内のすべての run に対して reinit オプションをグローバルに設定するには、wandb.setup() を使用します。これは、一度だけ動作を設定し、そのプロセス内の後続のすべての wandb.init() 呼び出しに適用したい場合に便利です。
    import wandb
    with wandb.setup(wandb.Settings(reinit="<create_new|finish_previous|return_previous>")) as run:
         # ここにコードを記述
    
  • 環境変数 WANDB_REINIT に、reinit の必要な値を指定します。環境変数を定義すると、その reinit オプションが wandb.init() の呼び出しに適用されます。
    export WANDB_REINIT="<create_new|finish_previous|return_previous>"
    
次のコードスニペットは、wandb.init() を呼び出すたびに新しい run を作成するように W&B をセットアップする方法の概要を示しています:
import wandb

wandb.setup(wandb.Settings(reinit="create_new"))

with wandb.init() as experiment_results_run:
    # この run は各実験の結果をログするために使用されます。
    # これを結果を収集する親 run と考えることができます。
      with wandb.init() as run:
         # do_experiment() 関数は詳細なメトリクスを指定された run にログし、
         # 個別に追跡したい結果のメトリクスを返します。
         experiment_results = do_experiment(run)

         # 各実験の後、その結果を親 run にログします。
         # 親 run のチャートの各ポイントは
         # 1 つの実験の結果に対応します。
         experiment_results_run.log(experiment_results)

例: 並行プロセス

スクリプトのライフサイクル全体を通して開いたままにしておくメインプロセスを 1 つ作成しつつ、そのメインプロセスを終了させずに、短時間だけ動作するセカンダリプロセスを定期的に生成したいとします。例えば、このパターンは、メインの run でモデルを学習しつつ、評価の計算やその他の処理を別の run で行いたい場合に有用です。 これを実現するには、reinit="create_new" を使用して複数の run を初期化します。この例では、スクリプト全体の間開いたままのメインプロセスを「Run A」とし、「Run B1」「Run B2」を評価などのタスク用に短時間だけ動作するセカンダリ run とします。 全体的なワークフローは次のようになります:
  1. wandb.init() でメインプロセスの Run A を初期化し、学習メトリクスをログする。
  2. Run B1 を (wandb.init() で) 初期化し、データをログしたら Run B1 を終了する。
  3. Run A にさらにデータをログする。
  4. Run B2 を初期化し、データをログしたら Run B2 を終了する。
  5. Run A へのログを継続する。
  6. 最後に、スクリプトの終了時に Run A を終了する。
次の Python コード例は、このワークフローを示しています:
import wandb

def train(name: str) -> None:
    """W&B の run 内で1回の学習イテレーションを実行します。

    `reinit="create_new"` を指定した 'with wandb.init()' ブロックを使用することで、
    別の run(プライマリのトラッキング run など)がすでにアクティブな場合でも、
    この学習サブ run を作成できます。
    """
    with wandb.init(
        project="my_project",
        name=name,
        reinit="create_new"
    ) as run:
        # 実際のスクリプトでは、このブロック内に学習ステップを記述します。
        run.log({"train_loss": 0.42})  # 実際のメトリクスに置き換えてください

def evaluate_loss_accuracy() -> (float, float):
    """現在のモデルの損失と精度を返します。
    
    このプレースホルダーを実際の評価ロジックに置き換えてください。
    """
    return 0.27, 0.91  # メトリクスの例

# 複数の学習/評価ステップを通じてアクティブであり続ける「プライマリ」run を作成します。
with wandb.init(
    project="my_project",
    name="tracking_run",
    reinit="create_new"
) as tracking_run:
    # 1) 'training_1' という名前のサブ run で1回学習します
    train("training_1")
    loss, accuracy = evaluate_loss_accuracy()
    tracking_run.log({"eval_loss": loss, "eval_accuracy": accuracy})

    # 2) 'training_2' という名前のサブ run で再度学習します
    train("training_2")
    loss, accuracy = evaluate_loss_accuracy()
    tracking_run.log({"eval_loss": loss, "eval_accuracy": accuracy})
    
    # この 'with' ブロックが終了すると、'tracking_run' は自動的に終了します。
前の例から、次の3つの重要なポイントを押さえておきましょう:
  1. reinit="create_new" は、wandb.init() を呼び出すたびに新しい run を作成します。
  2. 各 run への参照を保持する必要があります。wandb.run は、reinit="create_new" によって作成された新しい run を自動的には指しません。新しい run は run_arun_b1 などの変数に保存し、必要に応じてそれらのオブジェクトに対して .log().finish() を呼び出してください。
  3. メインの run を開いたままにしつつ、サブ run は好きなタイミングで終了できます。
  4. それらの run へのロギングが完了したら、run.finish() で run を終了してください。これにより、すべてのデータが確実にアップロードされ、run が正しくクローズされます。