メインコンテンツへスキップ
wandb.init()resume パラメーターを設定すると、run が停止またはクラッシュした場合に W&B がどのように処理するかを指定できます。run を初期化すると、W&B は run ID がすでに存在するかどうかを確認し、resume の値で定義された動作を適用します。 次の表は、resume パラメーターに渡す引数と、run ID の有無に応じた W&B の動作をまとめたものです。
ArgumentDescriptionRun ID existsRun ID does not existUse case
"must"W&B は、run ID で指定された run を必ず再開します。W&B は同じ run ID で run を再開します。最後の step から再開します。W&B はエラーを返します。同じ run ID を必ず使用する run を再開する場合。
"allow"run ID が存在する場合、W&B に run の再開を許可します。W&B は同じ run ID で run を再開します。最後の step から再開します。W&B は指定された run ID で新しい run を初期化します。既存の run を上書きせずに run を再開する場合。
"never"W&B が run ID で指定された run を再開しないようにします。指定された ID の run がすでに存在する場合はエラーを返します。W&B は指定された run ID で新しい run を初期化します。
"auto"run ID が存在する場合、W&B が自動的に run の再開を試みることを許可します。失敗したプロセスと同じディレクトリーから run を再起動してください。W&B は同じ run ID で run を再開します。W&B は指定された run ID で新しい run を初期化します。Runs を自動的に再開できるようにする場合。
autoallow の使い分けW&B では、resume="allow" を使用し、再開したい run の run ID を明示的に指定することを推奨しています。resume="auto" オプションでは run ID を指定する必要はありませんが、同じディレクトリーで複数の runs が失敗した場合や、ファイルのディレクトリー構造が変わった場合に、予期しない動作につながることがあります。また、resume="auto" を使用する場合は、失敗したプロセスと同じディレクトリーから run を再起動する必要があります。
以下のすべての例では、<> で囲まれた値を実際の値に置き換えてください。

同じ run ID を使用して再開する必要がある run

run が停止、クラッシュ、または失敗した場合は、同じ run ID を使用して再開できます。そのためには、run を初期化して、次を指定します。
  • resume パラメーターを "must" に設定する (resume="must")
  • 停止またはクラッシュした run の run ID を指定する
以下のコードスニペットは、W&B Python SDK でこれを実現する方法を示しています。
with wandb.init(entity="<entity>", project="<project>", resume="must") as run:
        # トレーニングコードをここに記述
複数のプロセスで同じ id を同時に使用すると、予期しない結果が生じます。複数のプロセスを管理する方法について詳しくは、分散トレーニング実験をログするを参照してください。

既存のrunを上書きせずにrunを再開する

既存のrunを上書きせずに、停止またはクラッシュしたrunを再開できます。これは、プロセスが正常に終了しなかった場合に特に役立ちます。次回W&Bを起動すると、W&Bは最後のstepからログを開始します。 W&Bでrunを初期化する際に、resume パラメーターを "allow" (resume="allow") に設定します。停止またはクラッシュしたrunのrun IDを指定してください。次のコードスニペットは、W&B Python SDKでこれを実現する方法を示しています。
import wandb

with wandb.init(entity="<entity>", project="<project>", id="<run ID>", resume="allow") as run:
        # トレーニングコードをここに記述

run が自動的に自動再開されるようにする

次のコードスニペットは、Python SDK または環境変数を使用して、run の自動再開を有効にする方法を示しています。
run を初期化するときに、resume パラメーターの引数として auto を渡します。失敗したプロセスと同じディレクトリから run を再起動してください。次のコードスニペットをコピー&ペーストし、<> で囲まれた値をご自身の値に置き換えてください。
with wandb.init(entity="<entity>", project="<project>", id="<run ID>", resume="auto") as run:
        # ここにトレーニングコードを記述します
自動再開は、失敗したプロセスと同じファイルシステム上でプロセスを再起動した場合にのみ機能します。
たとえば、Users/AwesomeEmployee/Desktop/ImageClassify/training/ というディレクトリで train.py という Python スクリプトを実行するとします。train.py では、自動再開が有効な run を作成します。その後、トレーニングスクリプトが停止したとします。この run を再開するには、Users/AwesomeEmployee/Desktop/ImageClassify/training/ 内で train.py スクリプトを再起動する必要があります。
ファイルシステムを共有できない場合は、WANDB_RUN_ID 環境変数を指定するか、W&B Python SDK で run ID を渡してください。run ID の詳細については、「What are runs?」ページの Custom run IDs セクションを参照してください。

プリエンプト可能な Sweeps run を再開する

プリエンプションを正しく処理すると、中断されたsweep run は自動的にキューに入れ直され、別の agent が取得できるようになります。このパターンは、sweep agent がプリエンプト可能な環境で実行される場合に特に有効です。たとえば、プリエンプト可能なキュー内の SLURM ジョブ、EC2 Spot インスタンス、Google Cloud のプリエンプト可能 VM などです。 以下の動作は、wandb agent CLI で sweep agent を実行する場合に適用されます。この CLI は、トレーニングプログラムをサブプロセスとして起動します。一方、Python API の wandb.agent() のみを使用する場合には、これは完全には当てはまりません。この経路では、トレーニング関数は別プロセスではなくスレッド内で実行されるため、OS シグナルの配信と転送が CLI agent のモデルと一致しないからです。 推奨パターン: スケジューラまたはプラットフォームで使われるプリエンプションシグナル (たとえば SIGUSR1SIGTERM) のシグナルハンドラーを登録してください。ハンドラーでは、run がアクティブなときに mark_preempting() を呼び出し、必要なクリーンアップ (checkpoint の保存など) を行ってから、非ゼロのコードで終了します (一般的には、シグナルによる終了時に 128 + signum を使います) 。wandb.init() の直後に、無条件で mark_preempting() を呼び出してはいけません。そうすると、コードの bug を含むあらゆる失敗がプリエンプションとしてマークされ、run が繰り返しキューに入れ直される可能性があります。 実行可能な例、CLI agent での --forward-signals、および mark_preempting() のさまざまな使い方をまとめた詳細な表については、Signal handling and sweep runs を参照してください。 このパターンに従うと、W&B はおおむね次のように run の状態を記録します。
シナリオrun の状態
終了コード 0 で run が正常に完了するFINISHED
非ゼロの終了コードで run が失敗するFAILED
run が未処理のシグナル (たとえば SIGKILL) を受信する約 5 分後に CRASHED
run が処理済みのプリエンプションシグナル (たとえば SIGTERM または SIGUSR1) を受信し、ハンドラーが mark_preempting() を呼び出し、プロセスが非ゼロで終了するPREEMPTED。run は次の agent request に備えてキューに入れられます
Sweep agent は、sweep が search アルゴリズムから新しいハイパーパラメーターの組み合わせを生成する前に、run キューを先に消化します。キューが空になると、sweep は通常のスケジューリングを再開します。