run をフォークする機能は現在も活発に開発中で、プライベートプレビューとして提供されています。この機能へのアクセスをリクエストするには、support@wandb.com の W&B Support までお問い合わせください。
元の run に影響を与えることなく、実験内の特定の時点から別のハイパーパラメーターやモデルを試すことができます。これを行うには、既存の W&B run からフォークします。
run からフォークすると、W&B はソース run の一意の IDと指定した step を使って新しい run を作成します。ソース run の summary メトリクスは、フォークした run にコピーされます。フォークした run は、指定した step までのすべての history とファイルをソース run と共有します。
フォークした step 以降は、元の run とは独立して、新しいデータをフォークした run にログできます。
以下のコードで生成されたフォークした run のライブデモをご覧ください。
- run のフォークには
wandb SDK バージョン >= 0.16.5 が必要です
- run のフォークでは、step が単調増加する必要があります。
define_metric() で定義された非単調な step を使用する run からはフォークできません。非単調な step は、run history とシステムメトリクスの時系列順を崩します。
フォークした run を開始するソース run の一意の run ID と step を、wandb.init() の fork_from に引数として指定します。
以下のコードスニペットは、以前にW&Bにログしたrunからフォークする方法を示します。
まず、フォーク元にしたいrunのrun IDを取得します。次に、wandb.init() の fork_from に、run IDとフォーク元にしたいstepを引数として指定します。
以下のコードをPythonスクリプトまたはノートブックのセルにコピー&ペーストします。<source-run-id>、<project>、<entity>を自身の値に置き換えてください。
import wandb
# フォーク元のソース run の一意の ID
source_run_id = "<source-run-id>"
# フォーク元の step を指定する
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からフォークする方法を示しています。これは、W&B Appでrun IDを調べることなく、作成したばかりのrunからフォークしたい場合に該当します。
まず、runを初期化して、いくつかのデータをログします。次に、元のrunオブジェクトのidプロパティを使用して、そのrunのrun IDを取得します。最後に、新しいrunを初期化し、元のrunのIDとフォーク元にしたいstepをwandb.init()のfork_fromに引数として渡します。
import wandb
# runを初期化する
with wandb.init(
project="<project>",
entity="<entity>"
) as original_run:
# ...トレーニングロジックをここに記述する ...
pass
# フォーク元のstepを指定する
fork_step = int("<num>")
# 元のrunのIDを使用してフォーク元のstepを指定する
with wandb.init(
project="<project>",
entity="<entity>",
fork_from=f"{original_run.id}?_step={fork_step}",
) as forked_run:
# ...トレーニングロジックをここに記述する ...
pass
original_run.id プロパティを使用すると、元の run の一意な run ID を取得できます。
たとえば、次のコード例は、まず run をフォークし、その後トレーニングの step 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を特定のstepでフォークし、step 200から
# メトリクスをログする
with wandb.init(
project="<project>",
entity="<entity>",
fork_from=f"{run1.id}?_step=200"
) as run2:
# 新しいrunでログを継続する
# 最初の数stepは、run1のメトリクスをそのままログする
# step 250以降は、スパイクパターンのログを開始する
for i in range(200, 300):
if i < 250:
# スパイクなしでrun1からログを継続する
metric_value = i
else:
# step 250からスパイクの挙動を導入する
metric_value = i + (2 * math.sin(i / 3.0)) # 緩やかなスパイクパターンを適用する
# 同じstepでログされるよう、両方のメトリクスを1回のcallでログする
run2.log({
"metric": metric_value,
"additional_metric": i * 1.1
})
巻き戻しとフォークの互換性フォークは 巻き戻し を補完する機能で、run の管理や実験をより柔軟に行えます。run からフォークすると、W&B は run の特定の時点から新しいブランチを作成し、異なるパラメーターやモデルを試せるようにします。run を巻き戻すと、W&B では run の履歴自体を修正または変更できます。