run をフォークする機能は現在も活発に開発中です。Multi-tenant Cloud と専用クラウドではプレビューとして提供されており、セルフマネージドではまだ利用できません。
元の 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})
# 特定の step で最初の run からフォークし、
# 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回の呼び出しでログする
run2.log({
"metric": metric_value,
"additional_metric": i * 1.1
})
巻き戻しとフォークの互換性フォークは 巻き戻し を補完する機能で、run の管理や実験をより柔軟に行えます。run からフォークすると、W&B は run の特定の時点から新しいブランチを作成し、異なるパラメーターやモデルを試せるようにします。run を巻き戻すと、W&B では run の履歴自体を修正または変更できます。