W&B Launch を使用してスイープを作成する

スイープのローンチでハイパーパラメータスイープを自動化する方法を発見する。

ハイパーパラメータチューニングジョブを W&B Launch を使って作成します。Launch の Sweeps を使用すると、指定されたハイパーパラメーターでスイープするためのスイープスケジューラーが、Launch Queue にプッシュされます。スイープスケジューラーはエージェントによってピックアップされると開始され、選択されたハイパーパラメーターでスイープする run を同じキューにローンチします。これはスイープが終了するか、または停止するまで続きます。

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

  1. 標準スイープスケジューラー: デフォルトの W&B Sweep スケジューリングエンジンを使用して W&B Sweeps を制御します。bayesgridrandom メソッドが利用可能です。
  2. カスタムスイープスケジューラー: スイープスケジューラーをジョブとして動作するように設定します。このオプションにより、完全なカスタマイズが可能です。標準のスイープスケジューラーを拡張して追加のログを含める方法の例は、以下のセクションに記載されています。

W&B 標準スケジューラーを使用したスイープの作成

Launch で W&B Sweeps を作成します。W&B App を使用してインタラクティブにスイープを作成することも、W&B CLI を使用してプログラム的にスイープを作成することもできます。Launch スイープの高度な設定、スケジューラーのカスタマイズを可能にする CLI を使用します。

W&B App を使って、インタラクティブにスイープを作成します。

  1. W&B App であなたの W&B プロジェクトへ移動します。
  2. 左側のパネルからスイープのアイコン(ほうきのイメージ)を選択します。
  3. 次に、Create Sweep ボタンを選択します。
  4. Configure Launch 🚀 ボタンをクリックします。
  5. Job ドロップダウンメニューから、スイープを作成したい仕事の名前とバージョンを選択します。
  6. Queue ドロップダウンメニューを使用して、スイープを実行するキューを選択します。
  7. Job Priority ドロップダウンで、Launch ジョブの優先度を指定します。Launch Queue が優先度をサポートしていない場合、Launch ジョブの優先度は「Medium」に設定されます。
  8. (オプション) run またはスイープスケジューラーの引数を override 設定します。例えば、スケジューラーオーバーライドを使用して、スケジューラーが管理する同時 run の数を num_workers を使って設定します。
  9. (オプション) Destination Project ドロップダウンメニューを使用してスイープを保存するプロジェクトを選択します。
  10. Save をクリックします。
  11. Launch Sweep を選択します。

W&B CLI を使って、Launch でプログラム的に W&B Sweep を作成します。

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

例えば、以下のコードスニペットでは、ジョブの値に 'wandb/jobs/Hello World 2:latest' を指定しています。

# launch-sweep-config.yaml

job: 'wandb/jobs/Hello World 2:latest'
description: launch jobsを使ったスイープの例

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:
#   num_workers: 1  # 同時にスイープを実行するスレッド数
#   docker_image: <スケジューラー用のベースイメージ>
#   resource: <例: local-container...>
#   resource_args:  # run に渡されるリソース引数
#     env: 
#         - WANDB_API_KEY

# Launch 用のオプションパラメーター
# launch: 
#    registry: <イメージのプル用のレジストリ>

スイープ設定の作成方法についての情報は、Define sweep configuration ページを参照してください。

  1. 次に、スイープを初期化します。設定ファイルのパス、ジョブキューの名前、W&B エンティティ、プロジェクトの名前を指定します。
wandb launch-sweep <path/to/yaml/file> --queue <queue_name> --entity <your_entity> --project <project_name>

W&B Sweeps についての詳細は、Tune Hyperparameters チャプターを参照してください。

カスタムスイープスケジューラーの作成

W&B スケジューラーまたはカスタムスケジューラーを使用してカスタムスイープスケジューラーを作成します。

W&B スイープスケジューリングロジックをジョブとして使用して Launch スイープを作成します。

  1. パブリックの wandb/sweep-jobs プロジェクトで Wandb スケジューラージョブを識別するか、以下のジョブ名を使用します: 'wandb/sweep-jobs/job-wandb-sweep-scheduler:latest'
  2. この名前を指す job キーを含む追加の scheduler ブロックで設定 yaml を構築します。例は以下の通りです。
  3. 新しい設定で wandb launch-sweep コマンドを使用します。

例の設定:

# launch-sweep-config.yaml  
description: スケジューラージョブを使用したLaunchスイープ設定
scheduler:
  job: wandb/sweep-jobs/job-wandb-sweep-scheduler:latest
  num_workers: 8  # 8つの同時スイープ実行を許可

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

カスタムスケジューラーは、スケジューラージョブを作成することで作成できます。このガイドの目的のために、WandbScheduler を変更してより多くのログを提供します。

  1. wandb/launch-jobs リポジトリをクローンします(特定の場所: wandb/launch-jobs/jobs/sweep_schedulers
  2. これで、wandb_scheduler.py を修正して、ログの増加を達成できます。例: _poll 関数にログを追加します。これは、毎回のポーリングサイクル(設定可能なタイミング)で呼び出され、次のスイープ run をローンチする前に行います。
  3. 修正したファイルを実行して、以下のコマンドでジョブを作成します: python wandb_scheduler.py --project <project> --entity <entity> --name CustomWandbScheduler
  4. 作成されたジョブの名前を、UI または前の呼び出しの出力で識別します。特に指定がない場合、これはコードアーティファクトジョブです。
  5. スケジューラーが新しいジョブを指すようにスイープの設定を作成します。
...
scheduler:
  job: '<entity>/<project>/job-CustomWandbScheduler:latest'
...

Optuna は、指定されたモデルに最適なハイパーパラメーターを見つけるために様々なアルゴリズムを使用するハイパーパラメータ最適化フレームワークです(W&B と似ています)。サンプリングアルゴリズム に加え、Optuna は数多くの プルーニングアルゴリズム も提供し、パフォーマンスが低い run を早期に終了させることができます。多数の run を実行する際、これは時間とリソースを節約するのに特に有用です。クラスは非常に設定可能で、scheduler.settings.pruner/sampler.args ブロックに期待されるパラメーターを渡すだけです。

Optuna のスケジューリングロジックをジョブとして使用して Launch スイープを作成します。

  1. まず、独自のジョブを作成するか、ビルド済みの Optuna スケジューラーイメージジョブを使用します。

    • 独自のジョブを作成する方法の例については、wandb/launch-jobs リポジトリを参照してください。
    • ビルド済みの Optuna イメージを使用するには、wandb/sweep-jobs プロジェクトで job-optuna-sweep-scheduler へ移動するか、ジョブ名を使用します: wandb/sweep-jobs/job-optuna-sweep-scheduler:latest
  2. ジョブを作成した後、スイープを作成できます。Optuna スケジューラージョブを指す job キーを含む scheduler ブロックを含むスイープ設定を構築します(以下の例)。

  # optuna_config_basic.yaml
  description: ベーシックな Optuna スケジューラー
  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  # 75% の run を終了
          n_warmup_steps: 10  # 最初の x ステップではプルーニングを無効に

  parameters:
    learning_rate:
      min: 0.0001
      max: 0.1
  1. 最後に、launch-sweep コマンドでアクティブキューにスイープをローンチします。
wandb launch-sweep <config.yaml> -q <queue> -p <project> -e <entity>

Optuna スイープスケジューラージョブの正確な実装については、wandb/launch-jobs を参照してください。Optuna スケジューラーで可能な例については、wandb/examples をチェックしてください。

カスタムスイープスケジューラージョブで可能な例は、jobs/sweep_schedulers 以下の wandb/launch-jobs リポジトリにあります。このガイドは、公開されている Wandb スケジューラージョブ の使用方法を示し、またカスタムスイープスケジューラージョブを作成するプロセスを示しています。

launch で sweeps を再開する方法

以前に実行されたスイープから launch-sweep を再開することも可能です。ハイパーパラメーターとトレーニングジョブは変更できませんが、スケジューラー固有のパラメーターおよび送信先キューは変更可能です。

  1. 以前に実行された launch-sweep のスイープ名/ID を特定します。スイープ ID は 8 文字の文字列です(例:hhd16935)。W&B App のプロジェクトで見つけることができます。
  2. スケジューラーパラメーターを変更する場合、更新された設定ファイルを構成します。
  3. ターミナルで、次のコマンドを実行します。<> で囲まれている内容を自身の情報で置き換えます。
wandb launch-sweep <optional config.yaml> --resume_id <sweep id> --queue <queue_name>