メインコンテンツへスキップ
wandb.init() を使用して W&B Run を初期化します。 デフォルトでは、wandb.init() を呼び出すと、W&B は各 Python プロセスに一度に 1 つのアクティブな run だけがあることを前提とします。wandb.init() を再度呼び出すと、W&B は同じ run を返すか、新しい run を開始する前に前の run を終了します。同じプロセス内で wandb.init() を複数回呼び出した場合の W&B の処理は、環境 (ノートブックか非ノートブックか) と reinit 設定によって異なります。 同じプロセス内で複数のアクティブな run を管理するには、1 つのプロセス内での複数の run を参照してください。
W&B では、wandb.init() を呼び出す際に with ブロックを使用することを推奨しています。これにより、ブロックの終了時に W&B が run を適切に終了し、すべてのデータをアップロードできるようになります。

プロセスごとに1つのrun

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

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

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

1 つの Python プロセス内で複数の run を管理できます。これは、プライマリプロセスをアクティブなまま維持しつつ、サブタスク用に短時間だけ実行されるセカンダリプロセスを作成したいワークフローで便利です。具体的なユースケースには、次のようなものがあります。
  • スクリプト全体を通して 1 つの「プライマリ」run をアクティブに保ちながら、評価やサブタスクのために短時間だけ実行される「セカンダリ」run を立ち上げる。
  • 1 つのファイル内でサブ実験をオーケストレーションする。
  • 1 つの「メイン」プロセスから、異なるタスクや期間を表す複数の run にログする。
デフォルトでは、W&B は wandb.init() を呼び出すと、各 Python プロセスには同時に 1 つのアクティブな run しかないものとして扱います。wandb.init() を再度呼び出すと、W&B は設定に応じて同じ run を返すか、新しい run を開始する前に既存の run を終了します。 このガイドでは、reinit を使用して wandb.init() の動作を変更し、1 つの Python プロセス内で複数の run を有効にする方法を説明します。
要件1 つの 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 を扱う例を参照してください。はい並行するプロセスの作成と管理に適しています。たとえば、「primary」の run をアクティブなまま維持しつつ、「secondary」の run を開始または終了する場合です。
finish_previous新しい run を wandb.init() で作成する前に、すべてのアクティブな run を run.finish() で終了します。ノートブック以外の環境でのデフォルトの動作です。はい順次実行されるサブプロセスを、それぞれ個別の run に分けたい場合に適しています。
return_previous直近の未終了の run を返します。ノートブック環境でのデフォルトの動作です。いいえ
W&B は、Hugging Face Trainer、Keras コールバック、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() を使用し、wandb.Settings オブジェクトを settings パラメーターに渡します。Settings オブジェクト内で reinit を指定します。
    import wandb
    with wandb.init(settings=wandb.Settings(reinit="<create_new|finish_previous|return_previous>")) as run:
        # ここにコードを記述
    
  • wandb.setup() を使用して、現在のプロセス内のすべての run に対する reinit オプションをグローバルに設定します。これは、動作を一度だけ設定し、そのプロセス内で後続のすべての wandb.init() call に適用したい場合に便利です。
    import wandb
    with wandb.setup(wandb.Settings(reinit="<create_new|finish_previous|return_previous>")) as run:
         # ここにコードを記述
    
  • 環境変数 WANDB_REINIT で、reinit に設定する値を指定します。環境変数を定義すると、reinit オプションが wandb.init() call に適用されます。
    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は各experimentの結果をログするために使用されます。
    # 結果を収集する親runとして考えることができます。
      with wandb.init() as run:
         # do_experiment()関数は指定されたrunに詳細なメトリクスをログし、
         # 個別にトラッキングしたい結果のメトリクスを返します。
         experiment_results = do_experiment(run)

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

例: 並行プロセス

スクリプトの実行中ずっと開いたままのプライマリプロセスを維持しつつ、そのプライマリプロセスを終了せずに、短命なセカンダリプロセスを定期的に生成したいとします。たとえばこのパターンは、プライマリ run でモデルをトレーニングしながら、評価の計算やその他の処理を別の run で行いたい場合に役立ちます。 これを実現するには、reinit="create_new" を使用して複数の run を初期化します。この例では、“Run A” はスクリプト全体を通して開いたままのプライマリプロセスであり、“Run B1” と “Run B2” は評価などのタスク用の短命なセカンダリ run です。 大まかなワークフローは次のようになります。
  1. wandb.init() でプライマリプロセス Run A を初期化し、トレーニングのメトリクスをログします。
  2. Run B1 を (wandb.init() で) 初期化し、データをログしてから終了します。
  3. Run A にさらにデータをログします。
  4. 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):
    """現在のモデルの損失と accuracy を返す。
    
    このプレースホルダーを実際の評価ロジックに置き換えること。
    """
    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' は自動的に終了する。
前の例では、次の重要な点に注意してください。
  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 が正しくクローズされます。