wandb.init() で resume パラメーターを設定して、run が停止またはクラッシュした場合に W&B がどのように処理するかを指定します。run を初期化すると、W&B は run ID がすでに存在するかどうかを確認し、resume の値で定義された動作を適用します。
次の表は、resume パラメーターに渡す引数と、run ID の有無に応じた W&B の動作を示しています。
| Argument | Description | Run ID exists | Run ID does not exist | Use 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 を自動的に再開できるようにします。 |
auto と allow の使い分けW&B では、resume="allow" を使用し、再開したい特定の run ID を指定することを推奨しています。resume="auto" オプションでは run ID を指定する必要はありませんが、同じディレクトリで複数の run が失敗した場合や、ファイルのディレクトリ構造が変更された場合に、予期しない動作につながる可能性があります。また、resume="auto" を使用する場合は、失敗したプロセスと同じディレクトリから run を再起動する必要があります。<> で囲まれた値を実際の値に置き換えてください。
同じ run ID を使用して再開する必要がある run を再開する
resumeパラメーターを"must"に設定します (resume="must")- 停止またはクラッシュした run の run ID を指定します
既存の run を上書きせずに run を再開する
resume パラメーターを "allow" (resume="allow") に設定します。停止またはクラッシュした run の run ID を指定してください。次のコード例は、W&B Python SDK でこれを実現する方法を示しています。
Runs の自動再開を有効にする
- W&B Python SDK
- シェルスクリプト
run を初期化するときに、
resume パラメーターの引数として auto を渡します。失敗したプロセスと同じディレクトリから 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 を再開する
wandb agent CLI を使用して sweep エージェントを実行し、トレーニングプログラムを サブプロセス として起動する場合に適用されます。Python API の wandb.agent() だけを使用する場合は、完全には当てはまりません。この経路では、トレーニング関数は別プロセスではなくスレッド内で実行されるため、OS シグナルの配信や転送のされ方が CLI エージェントのモデルとは一致しないためです。
推奨パターン: スケジューラーまたはプラットフォームで使用されるプリエンプションシグナル (たとえば SIGUSR1 や SIGTERM) に対するシグナルハンドラーを登録します。ハンドラー内では、run がアクティブであれば mark_preempting() を呼び出し、必要なクリーンアップ (チェックポイントの保存など) を行ってから、非ゼロのコードで終了してください (一般的な慣例として、シグナルによる終了では 128 + signum が使われます) 。wandb.init() の直後に、無条件で mark_preempting() を呼び出しては いけません。そうすると、コードのバグを含むすべての失敗がプリエンプションとして扱われ、run が繰り返しキューに入れ直される可能性があります。
実行可能な例、CLI エージェントの --forward-signals、および mark_preempting() のさまざまな使い方についての完全なリファレンス表は、Signal handling and sweep runs を参照してください。
このパターンに従うと、W&B は run の状態をおおむね次のように記録します。
| Scenario | Run state |
|---|---|
| Run が終了コード 0 で正常に完了する | FINISHED |
| Run が非ゼロの終了コードで失敗する | FAILED |
Run が未処理のシグナル (たとえば SIGKILL) を受信する | 約 5 分後に CRASHED |
Run が処理済みのプリエンプションシグナル (たとえば SIGTERM または SIGUSR1) を受信し、ハンドラーが mark_preempting() を呼び出して、プロセスが非ゼロで終了する | PREEMPTED。run は次のエージェント要求に向けてキューに入れられます |