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 の run ID を明示的に指定することを推奨しています。resume="auto" オプションでは run ID を指定する必要はありませんが、同じディレクトリーで複数の runs が失敗した場合や、ファイルのディレクトリー構造が変わった場合に、予期しない動作につながることがあります。また、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でこれを実現する方法を示しています。
run が自動的に自動再開されるようにする
- W&B Python SDK
- Shell script
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 agent を実行する場合に適用されます。この CLI は、トレーニングプログラムをサブプロセスとして起動します。一方、Python API の wandb.agent() のみを使用する場合には、これは完全には当てはまりません。この経路では、トレーニング関数は別プロセスではなくスレッド内で実行されるため、OS シグナルの配信と転送が CLI agent のモデルと一致しないからです。
推奨パターン: スケジューラまたはプラットフォームで使われるプリエンプションシグナル (たとえば SIGUSR1 や SIGTERM) のシグナルハンドラーを登録してください。ハンドラーでは、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 に備えてキューに入れられます |