wandb agent --count 1 SWEEP_ID を実行してください。エージェントは 1 つのトレーニング run を実行すると終了するため、リソースの見積もりが簡単になり、SLURM スケジューラーでジョブ間のハイパーパラメーター探索を並列化しやすくなります。
マルチ GPU または分散トレーニング ジョブでは、追加のルールが 1 つあります。各 SLURM ジョブで wandb.agent() を呼び出すプロセスは 1 つだけにしてください。すべての rank がエージェントを呼び出すと、各 rank が sweep コントローラーからそれぞれ別のハイパーパラメーター設定を取得してしまい、同じモデルをトレーニングしなくなります。
以下のセクションでは、単一プロセス ジョブのサブミッション コマンド、分散トレーニングを伴うマルチ GPU ジョブでの rank-gating パターン、グローバル rank とローカル rank のどちらでゲートするべきか、そして rank 0 以外からログする方法を説明します。
単一プロセスまたは単一 GPU ジョブ
分散トレーニングでのマルチ GPU ジョブ
--gpus-per-node を使用するマルチ GPU ジョブ) 、SLURM_PROCID 環境変数を使って、wandb.agent() が 1 つの rank でのみ実行されるようにしてください。ほかの rank では、sweep エージェント や wandb.init() を呼び出さずに分散トレーニングを実行してください。分散トレーニング全般における W&B 側の扱いについては、分散トレーニングの実験をログする を参照してください。
- 各 SLURM ジョブは、sweep コントローラーに対して 1 つの run だけを登録します。
- rank 0 以外の rank は、重複した孤立 run を作成することなく、分散トレーニングの担当部分を実行します。
- sweep コントローラーは進捗を正しくトラッキングし、新しいハイパーパラメーター設定をスケジュールします。
submitit または同様のランチャーを使用する場合も、wandb.agent() を呼び出す前に、トレーニングのエントリポイントで同じチェックを行ってください。
SLURM_PROCID と SLURM_LOCALID の使い分け
SLURM_PROCID は、SLURM ジョブ全体でのグローバルrankです。分散グループ全体に対してエージェントを 1 つだけ起動したい場合は、SLURM_PROCID == 0 を条件にします。これは、Sweeps で一般的なケースです。
SLURM_LOCALID は、単一ノード内でのrankです。ノードごとに 1 つのエージェントを起動したい場合は、SLURM_LOCALID == 0 を条件にします。たとえば、独立した sweep run をノード間で並列に起動する場合です。
rank 0 以外の rank からログする
Sweeps Experiments