> ## 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.

> Launch でハイパーパラメーター sweep を自動化する方法を紹介します。

# W&B Launch で sweep を作成する

<Card title="Colab で試す" href="https://colab.research.google.com/drive/1WxLKaJlltThgZyhc7dcZhDQ6cjVQDfil#scrollTo=AFEzIxA6foC7" icon="python" />

このページでは、W\&B Launch を使用してハイパーパラメーター調整ジョブ ([sweeps](/ja/models/sweeps/)) を作成する方法を説明します。これにより、他の launch jobs を実行しているのと同じインフラストラクチャー上で、ハイパーパラメーター探索を自動化できます。Launch で Sweeps では、sweep 対象として指定したハイパーパラメーターとともに、sweep スケジューラー が Launch キュー に送られます。sweep スケジューラー は agent によって取得されると開始し、選択されたハイパーパラメーターを使って sweep runs を同じキューに起動します。これは、sweep が完了するか停止されるまで続きます。

デフォルトの W\&B Sweep スケジューリングエンジン を使用することも、独自の カスタムスケジューラー を実装することもできます。

1. 標準 sweep スケジューラー: [W\&B Sweeps](/ja/models/sweeps/) を制御する、デフォルトの W\&B Sweep スケジューリングエンジン を使用します。おなじみの `bayes`、`grid`、`random` の method を利用できます。
2. カスタム sweep スケジューラー: sweep スケジューラー をジョブとして実行するように設定します。このオプションでは、完全にカスタマイズできます。次のセクションでは、標準の sweep スケジューラー を拡張して logging を追加する方法の例を示します。

<Note>
  このガイドでは、W\&B Launch が事前に設定済みであることを前提としています。W\&B Launch が設定されていない場合は、Launch ドキュメントの [how to get started](./#how-to-get-started) セクションを参照してください。
</Note>

<Note>
  Launch で Sweeps を初めて使用する場合は、`basic` method で sweep を作成することをおすすめします。標準の W\&B スケジューリングエンジン で要件を満たせない場合は、Launch 上の custom sweeps scheduler を使用してください。
</Note>

<div id="create-a-sweep-with-a-wb-standard-scheduler">
  ## W\&B の標準スケジューラーで sweep を作成する
</div>

このセクションでは、標準のスケジューリングエンジンを使用して Launch で W\&B Sweeps を作成する方法を説明します。W\&B App を使用してインタラクティブに sweep を作成することも、W\&B CLI を使用してプログラムから作成することもできます。スケジューラーのカスタマイズを含む Launch sweeps の高度な設定を行う場合は、CLI を使用してください。

<Note>
  W\&B Launch で sweep を作成する前に、まず sweep の対象となるジョブを作成してください。詳細については、[Create a Job](/ja/platform/launch/create-launch-job/) ページを参照してください。
</Note>

<Tabs>
  <Tab title="W&B App">
    W\&B App を使用してインタラクティブに sweep を作成します。

    1. W\&B App で W\&B のプロジェクトにアクセスします。
    2. プロジェクトのサイドバーで sweeps アイコン (ほうきのアイコン) を選択します。
    3. **Create Sweep** ボタンを選択します。
    4. **Configure Launch** ボタンをクリックします。
    5. **Job** ドロップダウン メニューから、ジョブ名と、そこから sweep を作成するジョブバージョンを選択します。
    6. **Queue** ドロップダウン メニューから、sweep を実行するキューを選択します。
    7. **Job Priority** ドロップダウンで、launch ジョブの優先度を指定します。launch キューが優先度設定をサポートしていない場合、launch ジョブの優先度は "Medium" に設定されます。
    8. 任意: run または sweep スケジューラーの override 引数を設定します。たとえば、scheduler overrides を使用して、スケジューラーが管理する同時実行 run 数を `num_workers` で設定できます。
    9. 任意: **Destination Project** ドロップダウン メニューから、sweep の保存先 project を選択します。
    10. **Save** をクリックします。
    11. **Launch Sweep** を選択します。

    <Frame>
      <img src="https://mintcdn.com/wb-21fd5541/w-lBKSCruauC3-2f/images/launch/create_sweep_with_launch.png?fit=max&auto=format&n=w-lBKSCruauC3-2f&q=85&s=c4d423bb7bdb1a5a60417e35b0dde378" alt="Launch sweep の設定" width="2518" height="1868" data-path="images/launch/create_sweep_with_launch.png" />
    </Frame>
  </Tab>

  <Tab title="CLI">
    W\&B CLI を使用して、Launch で W\&B Sweep をプログラムから作成します。

    1. Sweep 設定を作成します。
    2. sweep 設定内で完全なジョブ名を指定します。
    3. sweep エージェントを初期化します。

    <Note>
      手順 1 と 3 は、通常 W\&B Sweep を作成するときと同じです。
    </Note>

    たとえば、次の code snippet では、ジョブの値として `'wandb/jobs/Hello World 2:latest'` を指定しています。

    ```yaml theme={null}
    # launch-sweep-config.yaml

    job: 'wandb/jobs/Hello World 2:latest'
    description: launch ジョブを使用した sweep の例

    method: bayes
    metric:
      goal: minimize
      name: loss_metric
    parameters:
      learning_rate:
        max: 0.02
        min: 0
        distribution: uniform
      epochs:
        max: 20
        min: 0
        distribution: int_uniform

    # 任意の scheduler パラメーター:

    # scheduler:
    #   num_workers: 1  # 同時実行する sweep runs
    #   docker_image: [BASE-IMAGE-FOR-THE-SCHEDULER]
    #   resource: [RESOURCE-TYPE-FOR-EXAMPLE-LOCAL-CONTAINER]
    #   resource_args:  # runs に渡される resource 引数
    #     env: 
    #         - WANDB_API_KEY

    # 任意の Launch パラメーター
    # launch: 
    #    registry: [REGISTRY-FOR-IMAGE-PULLING]
    ```

    sweep 設定の作成方法については、[Define sweep configuration](/ja/platform/launch/sweeps-on-launch/) ページを参照してください。

    4. sweep を初期化します。設定ファイルへのパス、ジョブキュー名、W\&B entity、project 名を指定します。

    ```bash theme={null}
    wandb launch-sweep [PATH-TO-YAML-FILE] --queue [QUEUE-NAME] --entity [YOUR-ENTITY] --project [PROJECT-NAME]
    ```

    W\&B Sweeps の詳細については、[Tune Hyperparameters](/ja/models/sweeps/) 章を参照してください。
  </Tab>
</Tabs>

<div id="create-a-custom-sweep-scheduler">
  ## カスタム sweep スケジューラーを作成する
</div>

このセクションでは、標準のスケジューリングエンジンが要件を満たさない場合に、カスタム sweep スケジューラーを作成する方法について説明します。W\&B スケジューラーまたはカスタムスケジューラーを使用して、カスタム sweep スケジューラーを作成できます。

<Note>
  `scheduler` ジョブを使用するには、`wandb` CLI バージョン >= `0.15.4` が必要です
</Note>

<Tabs>
  <Tab title="W&B スケジューラ">
    W\&B の sweep スケジューリング ロジックをジョブとして使用し、Launch sweep を作成します。

    1. 公開されている wandb/sweep-jobs project 内の W\&B scheduler ジョブを特定するか、次のジョブ名を使用します。
       `'wandb/sweep-jobs/job-wandb-sweep-scheduler:latest'`。
    2. 次の例のように、この名を指す `job` キーを含む `scheduler` ブロックを追加した設定 yaml を作成します。
    3. 新しい設定を使用して `wandb launch-sweep` コマンドを実行します。

    設定例:

    ```yaml theme={null}
    # launch-sweep-config.yaml  
    description: Launch sweep config using a scheduler job
    scheduler:
      job: wandb/sweep-jobs/job-wandb-sweep-scheduler:latest
      num_workers: 8  # 同時に8つのsweep runを実行可能にする

    # sweep runが実行するトレーニング/チューニングジョブ
    job: wandb/sweep-jobs/job-fashion-MNIST-train:latest
    method: grid
    parameters:
      learning_rate:
        min: 0.0001
        max: 0.1
    ```
  </Tab>

  <Tab title="カスタム スケジューラ">
    スケジューラージョブを作成して、カスタムスケジューラを作成します。このガイドでは、`WandbScheduler` を変更して、より詳細にログを記録できるようにします。

    1. `wandb/launch-jobs` リポジトリ (具体的には `wandb/launch-jobs/jobs/sweep_schedulers`) をクローンします
    2. 必要に応じてログ出力を増やせるように `wandb_scheduler.py` を変更します。例: 関数 `_poll` にログを追加します。これは、新しい sweep run が起動される前に、各ポーリングサイクルごとに 1 回 (間隔は設定可能) 呼び出されます。
    3. 次のコマンドで変更したファイルを実行し、ジョブを作成します: `python wandb_scheduler.py --project [PROJECT] --entity [ENTITY] --name CustomWandbScheduler`
    4. 作成されたジョブ名を、UI または前の呼び出しの出力で確認します。特に指定がない限り、これは code-artifact ジョブです。
    5. スケジューラが新しいジョブを参照するように、sweep 設定を作成します。

    ```yaml theme={null}
    ...
    scheduler:
      job: '[ENTITY]/[PROJECT]/job-CustomWandbScheduler:latest'
    ...
    ```
  </Tab>

  <Tab title="Optuna スケジューラ">
    Optuna は、さまざまなアルゴリズムを使用して、指定したモデルに最適なハイパーパラメーターを見つけるハイパーパラメーター最適化フレームワークです (W\&B と同様) 。Optuna では、[sampling algorithms](https://optuna.readthedocs.io/en/stable/reference/samplers/index.html) に加えて、パフォーマンスの低い runs を早期に終了するために使用できるさまざまな [pruning algorithms](https://optuna.readthedocs.io/en/stable/reference/pruners.html) も提供されています。これは、多数の runs を実行する場合に、時間とリソースの節約に役立ちます。これらのクラスは設定可能です。必要なパラメーターを、config file の `scheduler.settings.pruner/sampler.args` ブロックに渡してください。

    ジョブを使用して、Optuna のスケジューリングロジックによる Launch sweep を作成します。

    1. まず、独自のジョブを作成するか、事前構築済みの Optuna scheduler image job を使用します。
       * 独自のジョブを作成する方法の examples については、[`wandb/launch-jobs`](https://github.com/wandb/launch-jobs/blob/main/jobs/sweep_schedulers) リポジトリーを参照してください。
       * 事前構築済みの Optuna image を使用するには、`wandb/sweep-jobs` project の `job-optuna-sweep-scheduler` にアクセスするか、ジョブ名 `wandb/sweep-jobs/job-optuna-sweep-scheduler:latest` を使用してください。

    2. ジョブを作成したら、sweep を作成できます。次の例のように、Optuna scheduler job を指す `job` キーを含む `scheduler` ブロックを含めた sweep config を作成します。

    ```yaml theme={null}
      # optuna_config_basic.yaml
      description: A basic Optuna scheduler
      job: wandb/sweep-jobs/job-fashion-MNIST-train:latest
      run_cap: 5
      metric:
        name: epoch/val_loss
        goal: minimize

      scheduler:
        job: wandb/sweep-jobs/job-optuna-sweep-scheduler:latest
        resource: local-container  # イメージから取得したスケジューラージョブに必須
        num_workers: 2

        # Optuna 固有の設定
        settings:
          pruner:
            type: PercentilePruner
            args:
              percentile: 25.0  # runs の 75% を強制終了する
              n_warmup_steps: 10  # 最初の x ステップはプルーニングを無効化する

      parameters:
        learning_rate:
          min: 0.0001
          max: 0.1
    ```

    3. 最後に、`launch-sweep` コマンドを使用して、アクティブなキューに対して sweep を起動します:

    ```bash theme={null}
    wandb launch-sweep [CONFIG-YAML] -q [QUEUE] -p [PROJECT] -e [ENTITY]
    ```

    Optuna sweep scheduler ジョブの正確な実装については、[wandb/launch-jobs](https://github.com/wandb/launch-jobs/blob/main/jobs/sweep_schedulers/optuna_scheduler/optuna_scheduler.py)を参照してください。Optuna scheduler で実現できることの他の例については、[wandb/examples](https://github.com/wandb/examples/tree/master/examples/launch/launch-sweeps/optuna-scheduler)をご覧ください。
  </Tab>
</Tabs>

カスタム sweep スケジューラージョブの例は、[wandb/launch-jobs](https://github.com/wandb/launch-jobs) リポジトリの `jobs/sweep_schedulers` にあります。このガイドでは、公開されている **W\&B スケジューラー Job** の使い方を示すとともに、カスタム sweep スケジューラージョブを作成する手順も説明します。

<div id="resume-sweeps-on-launch">
  ## Launch で Sweeps を再開する
</div>

このセクションでは、以前に実行した sweep から Launch sweep を再開する方法について説明します。これは、更新したスケジューラー設定や別のキューで探索を続けたい場合に便利です。ハイパーパラメーターとトレーニングジョブは変更できませんが、スケジューラー固有のパラメーターと、送信先のキューは変更できます。

<Note>
  最初の sweep で `latest` のようなエイリアスを持つトレーニングジョブを使用していた場合、前回の run 以降に最新のジョブバージョンが変更されていると、再開時に異なる結果になる可能性があります。
</Note>

1. 以前に実行した Launch sweep の sweep 名または ID を特定します。sweep ID は 8 文字の文字列 (例: `hhd16935`) で、W\&B App のプロジェクト内で確認できます。
2. スケジューラーのパラメーターを変更する場合は、更新した設定ファイルを作成します。
3. ターミナルで次のコマンドを実行します。`[` と `]` で囲まれた内容は、自分の情報に置き換えてください。

```bash theme={null}
wandb launch-sweep [OPTIONAL-CONFIG-YAML] --resume_id [SWEEP-ID] --queue [QUEUE-NAME]
```
