run の履歴を変更するには、run を巻き戻します。run を巻き戻すと、W&B は同じ run ID を維持したまま、run の状態を指定した step にリセットします。
run を巻き戻すオプションは現在プライベートプレビュー段階にあり、活発に開発が進められています。Rewind には既知のパフォーマンス上の制約があるため、W&B は通常、代替手段として Forking を推奨しています。現在、W&B は以下をサポートしていません。
- ログの巻き戻し: 新しい run セグメントではログがリセットされます。
- システムメトリクスの巻き戻し: W&B は巻き戻しポイント以降の新しいシステムメトリクスのみをログします。
- artifact の関連付け: W&B は artifact を、それを生成したソース run に関連付けます。
この機能へのアクセスをリクエストするには、support@wandb.com の W&B Support までお問い合わせください。
W&B は、巻き戻した run の summary メトリクスを、新たにログされた履歴に基づいて再計算します。これは、次のような動作を意味します。
- 履歴の切り詰め: W&B は履歴を巻き戻しポイントで切り詰め、新しいデータをログできるようにします。
- summary メトリクス: 新たにログされた履歴に基づいて再計算されます。
- 設定の保持: W&B は元の設定を保持し、新しい設定をマージできます。
巻き戻しとフォークの互換性フォークは巻き戻しを補完する機能です。run からフォークすると、W&B は特定の時点の run から新しいブランチを作成し、異なるパラメーターやモデルを試せるようにします。run を巻き戻すと、W&B は run の履歴そのものを修正・変更できるようにします。
run を巻き戻す前に、以下の前提条件を満たしていることを確認してください。
- run を巻き戻すには、W&B Python SDK のバージョン
0.17.1 以降が必要です。
- 単調増加する step を使用する必要があります。
define_metric() で定義した非単調な step は、run の履歴とシステムメトリクスに必要な時系列順を乱すため、使用できません。
特定の step から run を巻き戻し、その時点から新しいデータをログします。wandb.init() の resume_from パラメーターには、巻き戻したい run の run ID と step の両方を引数として渡します。resume_from パラメーターは、<run ID>?_step=<step> 形式の文字列を受け取ります。ここで、<run ID> は巻き戻したい run の run ID、<step> は巻き戻しを開始する step です。
300 step にわたって直線をログするとします:
import wandb
# 最初のrunを初期化し、いくつかのメトリクスをログする
with wandb.init(project="<project>", entity="wandb") as run:
for i in range(300):
# 直線をプロットする
run.log({"metric": i, "step": i})
プロジェクトのWorkspaceには、step 0 から step 300 までの折れ線グラフが表示されています。
後で、step 200 から run を巻き戻し、additional_metric という新しいメトリクスに step 200 から step 300 まで i*1.1 をログしたいとします。さらに、step 250 以降は直線ではなく、緩やかに波打つ新しいパターン (i**2 + 2*sin(i/3)) をログしたいとします。
import math
run_ID = "<run_ID>" # 巻き戻したいrunのrun IDに置き換えてください
# 特定のstepから最初のrunを巻き戻し、step 200からメトリクスをログする
with wandb.init(project="<project>", entity="wandb", resume_from=f"{run_ID}?_step=200") as run:
# 最初の数stepはrunのメトリクスをそのままログする
# step 250以降は波形パターンのログを開始する
for i in range(200, 300):
if i < 250:
run.log({"metric": i, "step": i}) # 波形なしでrunのログを継続する
else:
# step 250から波形パターンを導入する
subtle_wave = i + (2 * math.sin(i / 3.0)) # 微細な波形パターンを適用する
run.log({"metric": subtle_wave, "step": i})
# すべてのstepで新しいメトリクスも追加でログする
run.log({"additional_metric": i * 1.1, "step": i})
次の画像は、更新後のプロジェクトのWorkspaceを示しています。巻き戻し後のプロットでは、次のような変更が見られます。
- 折れ線グラフでは、step 0 から step 200 まで元の直線的な線が表示され、step 250 から新しいわずかに波打つパターンが始まっています (左の画像) 。
- W&B は、step 200 から始まる
additional_metric というラベルの新しいプロット (右のプロット) を作成しました。
run を巻き戻した後、W&B App で元のアーカイブ済みの run を確認できます。アーカイブされた run を表示するには、次の step に従ってください。
- Overview タブにアクセスする: run のページの Overview タブ にアクセスします。このタブでは、run の詳細と履歴をまとめて確認できます。
- Forked From フィールドを見つける: Overview タブ内で、
Forked From フィールドを見つけます。このフィールドには、再開の履歴が記録されています。Forked From フィールドにはソース run へのリンクが含まれているため、元の run までたどって巻き戻し履歴全体を把握できます。
Forked From フィールドを使うと、アーカイブされた再開のツリー内を簡単にたどり、各巻き戻しの順序と起点を確認できます。
巻き戻した run からフォークするには、wandb.init() で fork_from 引数を使用し、フォーク元とするソース run ID と、そのソース run の step を指定します。
import wandb
# 特定のstepからrunをフォークする
forked_run = wandb.init(
project="<project>",
entity="<entity>",
fork_from=f"{rewind_run.id}?_step=500",
)
# 新しいrunでログを続ける
for i in range(500, 1000):
forked_run.log({"metric": i*3})
forked_run.finish()