> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wandb.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# SLURM で sweep を実行するにはどうすればよいですか？

[SLURM scheduling system](https://slurm.schedmd.com/documentation.html) で W\&B sweeps を実行する場合は、スケジュールされた各ジョブで `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 以外からログする方法を説明します。

<div id="single-process-or-single-gpu-jobs">
  ## 単一プロセスまたは単一 GPU ジョブ
</div>

スケジュールされた各ジョブで次を送信してください:

```bash theme={null}
wandb agent --count 1 SWEEP_ID
```

<div id="multi-gpu-jobs-with-distributed-training">
  ## 分散トレーニングでのマルチ GPU ジョブ
</div>

分散トレーニングで W\&B sweep を実行する場合 (たとえば `--gpus-per-node` を使用するマルチ GPU ジョブ) 、`SLURM_PROCID` 環境変数を使って、`wandb.agent()` が 1 つの rank でのみ実行されるようにしてください。ほかの rank では、sweep エージェント や `wandb.init()` を呼び出さずに分散トレーニングを実行してください。分散トレーニング全般における W\&B 側の扱いについては、[分散トレーニングの実験をログする](/ja/models/track/log/distributed-training) を参照してください。

```python theme={null}
import os
import wandb

def train():
    with wandb.init() as run:
        config = run.config
        # 設定を他のランクにブロードキャストし、分散トレーニングを実行します。
        ...

if os.environ.get("SLURM_PROCID", "0") == "0":
    wandb.agent(sweep_id, function=train, count=1)
else:
    # ランク0以外のランクはランク0から設定を受け取り、
    # wandb.agent() や wandb.init() を呼び出さずにトレーニングを実行します。
    run_worker()
```

このパターンにより、次のことが保証されます。

* 各 SLURM ジョブは、sweep コントローラーに対して 1 つの run だけを登録します。
* rank 0 以外の rank は、重複した孤立 run を作成することなく、分散トレーニングの担当部分を実行します。
* sweep コントローラーは進捗を正しくトラッキングし、新しいハイパーパラメーター設定をスケジュールします。

`submitit` または同様のランチャーを使用する場合も、`wandb.agent()` を呼び出す前に、トレーニングのエントリポイントで同じチェックを行ってください。

<div id="choose-between-slurm_procid-and-slurm_localid">
  ### `SLURM_PROCID` と `SLURM_LOCALID` の使い分け
</div>

`SLURM_PROCID` は、SLURM ジョブ全体でのグローバルrankです。分散グループ全体に対してエージェントを 1 つだけ起動したい場合は、`SLURM_PROCID == 0` を条件にします。これは、Sweeps で一般的なケースです。

`SLURM_LOCALID` は、単一ノード内でのrankです。ノードごとに 1 つのエージェントを起動したい場合は、`SLURM_LOCALID == 0` を条件にします。たとえば、独立した sweep run をノード間で並列に起動する場合です。

<div id="log-from-non-rank-0-ranks">
  ### rank 0 以外の rank からログする
</div>

上記の例は、rank 0 のみが W\&B にログする [単一のプロセスをトラッキングする](/ja/models/track/log/distributed-training#track-a-single-process) パターンに従っています。rank ごとのシステムメトリクスも取得したいなど、rank 0 以外の rank も同じ run にログする場合は、shared mode を使用し、rank 0 の Run ID を各ワーカーに渡してください。詳しくは、[すべてのプロセスを単一の run にトラッキングする](/ja/models/track/log/distributed-training#track-all-processes-to-a-single-run) を参照してください。

***

<Badge stroke shape="pill" color="orange" size="md">[Sweeps](/ja/support/models/tags/sweeps)</Badge><Badge stroke shape="pill" color="orange" size="md">[Experiments](/ja/support/models/tags/experiments)</Badge>
