wandb.init() で resume パラメーターを設定すると、run が停止またはクラッシュした場合に W&B がどのように処理するかを指定できます。run を初期化すると、W&B は run ID がすでに存在するかどうかを確認し、resume の値で定義された動作を適用します。
次の表は、resume パラメーターに渡す引数と、run ID の有無に応じた W&B の動作をまとめたものです。
auto と allow の使い分け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 を指定する
既存のrunを上書きせずにrunを再開する
既存のrunを上書きせずに、停止またはクラッシュしたrunを再開できます。これは、プロセスが正常に終了しなかった場合に特に役立ちます。次回W&Bを起動すると、W&Bは最後のstepからログを開始します。 W&Bでrunを初期化する際に、resume パラメーターを "allow" (resume="allow") に設定します。停止またはクラッシュしたrunのrun IDを指定してください。次のコードスニペットは、W&B Python SDKでこれを実現する方法を示しています。
run が自動的に自動再開されるようにする
次のコードスニペットは、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 を再開する
プリエンプションシグナルを処理することで、W&B は中断された sweep run を別のエージェントが実行できるよう自動的にキューに入れ直します。このパターンは、SLURM のプリエンプト可能なキュー、Amazon EC2 Spot Instance、Google Cloud のプリエンプト可能な VM など、sweep エージェントをプリエンプト可能なコンピューティング環境で実行する場合に役立ちます。 以下の手順は、wandb agent CLI を使用して sweep エージェントを起動する場合に適用されます。CLI はトレーニングプログラムをサブプロセスとして起動します。Python API の wandb.agent() のみを使用する場合、これらの手順は完全には適用されません。Python API はトレーニング関数をスレッド内で実行するため、OS シグナルの配信と転送は CLI エージェントの動作とは異なります。
プリエンプションシグナルを処理する
スケジューラまたはプラットフォームで使われるプリエンプションシグナル (たとえばSIGUSR1 や SIGTERM) のシグナルハンドラーを登録してください。ハンドラーでは、次の操作を行います。
- run がアクティブなときに、
mark_preempting()を呼び出します。 - checkpoint の保存など、必要なクリーンアップを行います。
- 非ゼロのコードで終了します。シグナルによる終了時には、一般的に
128 + signumを使います。
wandb.init() の直後に、無条件で mark_preempting() を呼び出してはいけません。そうすると、コードの bug を含むあらゆる失敗がプリエンプションとしてマークされ、run が繰り返しキューに入れ直される可能性があります。
実行可能な例、CLI エージェント での --forward-signals、および mark_preempting() のさまざまな使い方をまとめた詳細な表については、Signal handling and sweep runs を参照してください。
このパターンに従うと、W&B はおおむね次のように run の状態を記録します。
sweep エージェント がプリエンプトされた run を取得した場合、トレーニングプロセスは 60 分以内に
wandb.init() を呼び出す必要があります。run の取得後、wandb.init() を呼び出す前にプロセスが失敗するなどして初期化が行われなかった場合、60 分間のリース期限が切れるまで、W&B はその run を別の エージェント が利用できるようにしません。