メインコンテンツへスキップ
Run のフォーク機能はプライベートプレビュー版です。この機能へのアクセスを希望される場合は、W&B サポート(support@wandb.com)までご連絡ください。
オリジナルの Run に影響を与えることなく、実験の特定のポイントから異なる パラメータ や モデル を探索することができます。これを行うには、既存の W&B Run をフォークします。 Run をフォークすると、W&B はソースとなる Run の Run ID と指定された ステップ を使用して、新しい Run を作成します。フォークされた Run には、そのステップまでのソース Run のすべての データ が含まれます。フォークしたステップ以降は、オリジナルの Run とは独立して、フォークされた Run に新しい データを ログ 記録できます。
  • Run のフォークには、wandb SDK バージョン 0.16.5 以上が必要です。
  • Run のフォークには、単調増加するステップが必要です。define_metric() で定義された非単調なステップを使用している Run からはフォークできません。非単調なステップは、Run の履歴やシステム メトリクス の時系列順序を損なうためです。
既存の Run からフォークするには、wandb.init()fork_from パラメータ を使用します。ソースとなる Run の一意な run ID と、フォークを開始したい step を指定してください。
Run ID の詳細や確認方法については、Unique run identifiers を参照してください。

以前にログを記録した Run からのフォーク

以下の コードスニペット は、以前に W&B にログを記録した Run からフォークする方法を示しています。別の スクリプト や ノートブック の Run、または別の ユーザー やサービスアカウントによってログ記録された Run からフォークする場合にこの方法を使用します。 <source-run-id><project>、および <entity> を自身の 値 に置き換えてください。
import wandb

# フォーク元のソース Run の一意な ID
source_run_id = "<source-run-id>"

# フォークするステップを指定
fork_step = 200

# Run をフォークする
with wandb.init(
    project="<project>",
    entity="<entity>",
    fork_from=f"{source_run_id}?_step={fork_step}",
) as forked_run:
    pass

同じスクリプト内の Run からのフォーク

以下の コードスニペット は、同じ スクリプト 内の Run からフォークする方法を示しています。これは、同じ スクリプト や ノートブック 内の特定のポイントから、異なる パラメータ や モデル を探索したい場合に便利です。
import wandb

# Run を初期化
with wandb.init(
    project="<project>",
    entity="<entity>"
) as original_run:
    # ...トレーニングロジックをここに記述...
    pass

# フォークするステップを指定
fork_step = 200

# オリジナルの Run ID を使用し、フォークするステップを指定
with wandb.init(
    project="<project>",
    entity="<entity>",
    fork_from=f"{original_run.id}?_step={fork_step}",
) as forked_run:
    # ...トレーニングロジックをここに記述...
    pass
オリジナルの Run の一意な Run ID を取得するには、original_run.id プロパティを使用します。

スクリプトの例

例えば、以下のコード例では、まず Run をフォークし、次にトレーニングステップ 200 からフォークされた Run に メトリクス を ログ 記録する方法を示しています。 以下の コード を Python スクリプト または ノートブック のセルにコピー&ペーストしてください。<project><entity> は自身の 値 に置き換えてください。
import wandb
import math

# 最初の Run を初期化してメトリクスをログ記録する
with wandb.init(
    project="<project>",
    entity="<entity>"
) as run1:
    for i in range(300):
        run1.log({"metric": i})

# 最初の Run の特定のステップからフォークし、
# ステップ 200 からメトリクスをログ記録する
with wandb.init(
    project="<project>", 
    entity="<entity>", 
    fork_from=f"{run1.id}?_step=200"
) as run2:
    # 新しい Run でログ記録を継続する
    # 最初の数ステップは、run1 と同じメトリクスをログ記録する
    # ステップ 250 以降は、スパイクのあるパターンでログ記録を開始する
    for i in range(200, 300):
        if i < 250:
            # スパイクなしで run1 から継続してログ記録
            metric_value = i
        else:
            # ステップ 250 からスパイクのある振る舞いを導入
            metric_value = i + (2 * math.sin(i / 3.0))  # わずかなスパイクパターンを適用

        # 両方のメトリクスを1回でログ記録し、
        # 同じステップで記録されるようにする
        run2.log({
            "metric": metric_value,
            "additional_metric": i * 1.1
        })
Rewind とフォークの互換性フォークは、Run の管理と試行に柔軟性を持たせることで rewind を補完します。Run をフォークする場合、W&B は特定のポイントで Run から新しいブランチを作成し、異なる パラメータ や モデル を試せるようにします。Run を rewind する場合、W&B は Run の履歴そのものを修正または変更できるようにします。