2 つの並列化レベル
Ionworks は最適化中に 2 つのレベルで並列化を適用します:バッチレベル: マルチスタート実行
複数のマルチスタートを設定すると、すべての実行は単一のドライバープロセスから調整され、1 つのワーカープールを共有します。ドライバーは各スタートの評価をプールにディスパッチし、ワーカーが完了するたびに結果を処理します。スタートごとに個別のタスクを起動したり専用 CPU を確保したりすることはありません。スタート間の並行性はプールサイズによって制限されます。合計需要が利用可能なワーカー数を超える場合、評価はキューに入り、ワーカーが解放されると実行されます。オプティマイザレベル: 分散評価
集団ベースのオプティマイザは、各世代で候補解の集団を評価します。これらの評価は共有ワーカープールに分散され、プールはそれらをホストするためにスケールします。 以下のオプティマイザは集団ベースであり、分散評価をサポートしています:
非集団ベースのオプティマイザ(例: Nelder-Mead)は一度に 1 つの候補を評価するため、単一の実行は内部で並列化できません。複数の非集団ベースのマルチスタートは、共有プール上で同時に実行されます(スタートごとに 1 つの評価が進行中)。
ストリーミング(非同期)評価
ドライバーは結果をストリーミングします。世代全体の完了を待つのではなく、ワーカーが完了するとすぐに各候補の結果をそのオプティマイザにフィードバックします。これにより、個々の評価の所要時間にばらつきがある場合のアイドル時間が削減されます。高速な評価は即座に処理され、遅い評価はバックグラウンドで継続します。これはすべての集団ベースオプティマイザ(Differential Evolution、CMA-ES、PSO、XNES、SNES)で自動的に適用されます。ストリーミング評価は最適化結果を変更しません。ワーカーが完了する順序に関係なく、各オプティマイザは同じ候補-結果のペアを受け取ります。スループットのみに影響します。
リソース割り当て
ワーカープールはフィットの需要に基づいてサイズが決まります:num_starts × 世代幅 × per-point tasks。世代幅は集団ベースのオプティマイザでは集団サイズ(非集団ベースのオプティマイザでは 1)であり、per-point tasks は目的関数レベルの並列化が有効な場合に目的関数の数と等しくなります。この需要は利用可能なワーカーの総供給量によって上限が設けられます(min(需要, 供給))。ジョブごとの固定ワーカー数はありません。
プールはジョブの開始・終了に応じてスケールアップ/ダウンします。自分のマシン上で実行する場合は、現在利用可能な CPU 数が供給の上限として使用されます。プールは常に少なくとも 1 つのワーカーで構築されます。ワーカーが 1 つだけ利用可能な場合、フィットの評価は実質的にそのワーカー上で逐次実行されます。
プールサイズはフィットの需要と利用可能な供給から自動的に決定されます。手動でのワーカー数設定は不要です。
シナリオ
以下の例は、異なる設定でリソースがどのように割り当てられるかを示しています。シナリオ 1: 集団ベースオプティマイザでの複数マルチスタート
CMA-ES で 4 マルチスタート 4 つのスタートはすべてドライバーから調整され、1 つのワーカープールを共有します。プールはすべてのスタートにわたる合計需要(num_starts × population × per-point tasks)に基づいてサイズが決まり、利用可能な供給によって上限が設けられます。プールは処理をホストするためにスケールし、各スタートの集団評価がプールに分散されます。
シナリオ 2: 集団ベースオプティマイザでの単一マルチスタート
PSO で 1 マルチスタート ドライバーが 1 つの実行を調整します。ワーカープールはその実行の需要(1 × population × per-point tasks)に基づいてサイズが決まり、利用可能な供給によって上限が設けられます。すべてのワーカーがその単一実行の集団評価に専念します。