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

# 並列化

> Ionworks がマルチスタートと集団ベースの最適化を、需要に応じて自動スケールするワーカープールに分散する方法

Ionworks は最適化処理を、需要に応じて自動的にスケールするワーカープロセスのプールに分散します。このページでは、マルチスタート実行間でのリソースの割り当て方法と、集団ベースのオプティマイザを高速化するために分散評価が使用されるタイミングについて説明します。

## 2 つの並列化レベル

Ionworks は最適化中に 2 つのレベルで並列化を適用します:

### バッチレベル: マルチスタート実行

複数のマルチスタートを設定すると、すべての実行は単一のドライバープロセスから調整され、1 つのワーカープールを共有します。ドライバーは各スタートの評価をプールにディスパッチし、ワーカーが完了するたびに結果を処理します。スタートごとに個別のタスクを起動したり専用 CPU を確保したりすることは**ありません**。スタート間の並行性はプールサイズによって制限されます。合計需要が利用可能なワーカー数を超える場合、評価はキューに入り、ワーカーが解放されると実行されます。

### オプティマイザレベル: 分散評価

集団ベースのオプティマイザは、各世代で候補解の集団を評価します。これらの評価は共有ワーカープールに分散され、プールはそれらをホストするためにスケールします。

以下のオプティマイザは**集団ベース**であり、分散評価をサポートしています:

| オプティマイザ                           | 説明                                              |
| --------------------------------- | ----------------------------------------------- |
| **Differential Evolution**（デフォルト） | 適応的変異と交叉によるグローバル探索                              |
| **CMA-ES**                        | Covariance Matrix Adaptation Evolution Strategy |
| **PSO**                           | Particle Swarm Optimization                     |
| **XNES**                          | Exponential Natural Evolution Strategy          |

非集団ベースのオプティマイザ(例: Nelder-Mead)は一度に 1 つの候補を評価するため、単一の実行は内部で並列化できません。複数の非集団ベースのマルチスタートは、共有プール上で同時に実行されます（スタートごとに 1 つの評価が進行中）。

#### ストリーミング(非同期)評価

ドライバーは結果をストリーミングします。世代全体の完了を待つのではなく、ワーカーが完了するとすぐに各候補の結果をそのオプティマイザにフィードバックします。これにより、個々の評価の所要時間にばらつきがある場合のアイドル時間が削減されます。高速な評価は即座に処理され、遅い評価はバックグラウンドで継続します。これはすべての集団ベースオプティマイザ（Differential Evolution、CMA-ES、PSO、XNES、SNES）で自動的に適用されます。

<Note>
  ストリーミング評価は最適化結果を変更しません。ワーカーが完了する順序に関係なく、各オプティマイザは同じ候補-結果のペアを受け取ります。スループットのみに影響します。
</Note>

## リソース割り当て

ワーカープールはフィットの**需要**に基づいてサイズが決まります: `num_starts × 世代幅 × per-point tasks`。世代幅は集団ベースのオプティマイザでは集団サイズ（非集団ベースのオプティマイザでは 1）であり、per-point tasks は目的関数レベルの並列化が有効な場合に目的関数の数と等しくなります。この需要は利用可能なワーカーの総供給量によって上限が設けられます（`min(需要, 供給)`）。ジョブごとの固定ワーカー数はありません。

プールはジョブの開始・終了に応じてスケールアップ/ダウンします。自分のマシン上で実行する場合は、現在利用可能な CPU 数が供給の上限として使用されます。プールは常に少なくとも 1 つのワーカーで構築されます。ワーカーが 1 つだけ利用可能な場合、フィットの評価は実質的にそのワーカー上で逐次実行されます。

<Note>
  プールサイズはフィットの需要と利用可能な供給から自動的に決定されます。手動でのワーカー数設定は不要です。
</Note>

## シナリオ

以下の例は、異なる設定でリソースがどのように割り当てられるかを示しています。

### シナリオ 1: 集団ベースオプティマイザでの複数マルチスタート

**CMA-ES で 4 マルチスタート**

4 つのスタートはすべてドライバーから調整され、1 つのワーカープールを共有します。プールはすべてのスタートにわたる合計需要（`num_starts × population × per-point tasks`）に基づいてサイズが決まり、利用可能な供給によって上限が設けられます。プールは処理をホストするためにスケールし、各スタートの集団評価がプールに分散されます。

### シナリオ 2: 集団ベースオプティマイザでの単一マルチスタート

**PSO で 1 マルチスタート**

ドライバーが 1 つの実行を調整します。ワーカープールはその実行の需要（`1 × population × per-point tasks`）に基づいてサイズが決まり、利用可能な供給によって上限が設けられます。すべてのワーカーがその単一実行の集団評価に専念します。

### シナリオ 3: 多数のマルチスタート

**CMA-ES で 32 マルチスタート**

共有ワーカープールはすべての 32 スタートにわたる合計需要に基づいてサイズが決まり、総供給量によって上限が設けられます。プールは需要に応じてスケールします。完全にスケールアップするまで、評価はキューに入り、ワーカーが利用可能になると開始されます。

### シナリオ 4: 自分のマシンでの複数マルチスタート

**ローカルで CMA-ES の 4 マルチスタート**

プールはフィットの需要に基づいてサイズが決まり、マシンの現在利用可能な CPU（供給）によって上限が設けられます。スタートはそれにより得られるプールを共有します。フィットの需要よりも利用可能な CPU が少ない場合、評価はキューに入り、ワーカーが解放されると実行されます。

### シナリオ 5: 非集団ベースオプティマイザでの単一マルチスタート

**Nelder-Mead で 1 マルチスタート**

ドライバーが 1 つの実行を調整します。Nelder-Mead は集団ベースではないため、一度に 1 つの候補を評価し、この単一実行は実質的に 1 つのワーカー上で逐次実行されます。

## まとめ

| シナリオ                  | プールサイズ                  | 並列評価  | ストリーミング結果 | 動作                             |
| --------------------- | ----------------------- | ----- | --------- | ------------------------------ |
| N マルチスタート、集団ベース       | 需要駆動、供給で上限              | あり    | あり        | プールが処理をホストするためにスケール、結果は到着次第処理  |
| N マルチスタート、集団ベース(ローカル) | 需要駆動、ローカルの空き CPU で上限    | あり    | あり        | 空きローカル CPU でプールを上限、結果は到着次第処理   |
| 1 マルチスタート、集団ベース       | 需要駆動、供給で上限              | あり    | あり        | ストリーミングディスパッチでワーカーが集団を並列評価     |
| N マルチスタート、非集団ベース      | 需要駆動（スタートごとに 1 点）、供給で上限 | スタート間 | あり        | スタートはプール上で同時に実行され、各スタートは内部的に逐次 |
| 1 マルチスタート、非集団ベース      | ワーカー 1 つ                | なし    | —         | 単一実行、逐次処理                      |

## 次のステップ

* [最適化テンプレート](/ja/optimize/templates)で利用可能なテンプレートについて学ぶ
* [最適化の実行](/ja/optimize/running-optimization)のガイドでステップバイステップの手順を確認する
