Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

ソルバーが並列計算を行う仕組み

Global Optimization Toolbox における並列処理タイプ

並列処理は最適化アルゴリズムを高速化する魅力的な方法です。並列処理を使用するには、Parallel Computing Toolbox™ ライセンスと並列ワーカー プール (parpool) が必要です。詳細については、Global Optimization Toolbox で並列処理を使用する方法を参照してください。

Global Optimization Toolbox ソルバーはさまざまな方法で並列コンピューティングを使用します。

ソルバー平行?並列特性

GlobalSearch

×

並列機能はありません。ただし、fminconGlobalSearch で実行されるときに並列勾配推定を使用できます。Optimization Toolbox での並列計算の使用を参照してください。

MultiStart

開始ポイントは複数のプロセッサに分散されます。これらのポイントから、ローカル ソルバーが完了まで実行されます。詳細については、マルチスタートおよびGlobal Optimization Toolbox で並列処理を使用する方法を参照してください。
fmincon の場合、並列 MultiStart による並列勾配推定は行われません。

ga, gamultiobj

反復ごとに 1 回ずつ並列で評価される集団。詳細については、遺伝的アルゴリズムおよびGlobal Optimization Toolbox で並列処理を使用する方法を参照してください。
適合度または制約関数のベクトル化はありません。

particleswarm

反復ごとに 1 回ずつ並列で評価される集団。詳細については、粒子群およびGlobal Optimization Toolbox で並列処理を使用する方法を参照してください。
目的関数または制約関数のベクトル化はありません。

patternsearch, paretosearch

ポーリング ポイントは並列で評価され、反復ごとに 1 回発生します。詳細については、パターン探索およびGlobal Optimization Toolbox で並列処理を使用する方法を参照してください。
目的関数または制約関数のベクトル化はありません。

simulannealbnd

×

並列機能はありません。ただし、simulannealbnd は並列実行されるハイブリッド関数を使用できます。シミュレーテッド アニーリングを参照してください。

surrogateopt

検索ポイントは並列で評価されます。
目的関数または制約関数のベクトル化はありません。

さらに、いくつかのソルバーには、終了後に実行されるハイブリッド関数があります。一部のハイブリッド関数は並列で実行できます。また、ほとんどの patternsearch 検索方法は並列で実行できます。詳細については、並列検索機能またはハイブリッド機能を参照してください。

ツールボックス関数がプロセスを分散する方法

parfor の特徴と注意点

ネストされた parfor ループはありません.  ほとんどのソルバーは並列計算を実行するために Parallel Computing Toolbox parfor (Parallel Computing Toolbox) 関数を使用します。2 つのソルバー surrogateoptparetosearch は、代わりに parfeval (Parallel Computing Toolbox) を使用します。

メモ

parfor は、別の parfor ループ内から呼び出された場合、並列で動作しません。

メモ

ドキュメンテーションでは、Simulink® を呼び出す場合は parfor または parfeval を使用しないように推奨されています。parfor 内での関数 sim の使用 (Simulink)を参照してください。そのため、ソルバーの組み込み並列機能を使用して Simulink シミュレーションを並列で最適化すると問題が発生する可能性があります。

たとえば、目的関数 userfcnparfor を呼び出し、MultiStart と並列処理を使用して fmincon を呼び出すとします。また、並列最適化機能 に示されているように、fmincon の並列勾配評価の条件が満たされていると仮定します。図parfor を並列で実行した場合は次の3つのケースを示しています。

  1. 最も外側のループは並列の MultiStart です。そのループのみを並列に実行します。

  2. 最も外側の parfor ループは fmincon 内にあります。fmincon のみを並列に実行します。

  3. 最も外側の parfor ループは userfcn 内にあります。この場合、userfcnparfor を並列に使用できます。

parfor を並列で実行した場合

並列乱数は再現不可能.  MATLAB® の乱数シーケンスは疑似乱数であり、シード、つまり初期設定から決定されます。並列計算では、必ずしも制御可能または再現可能ではないシードが使用されます。たとえば、MATLAB の各インスタンスには、ランダム シーケンスの現在のシードを決定するデフォルトのグローバル設定があります。

patternsearch の場合、ポーリングまたは検索方法として MADS を選択した場合、並列パターン検索では再現可能な実行がありません。検索方法として遺伝的アルゴリズムまたはラテンハイパーキューブを選択した場合、並列パターン検索では再現可能な実行がありません。

ga および gamultiobj の場合、並列集団生成では再現不可能な結果が生成されます。

MultiStartは違います。並列 MultiStart から再現可能な実行を 得ることができますMultiStart は疑似ランダムな開始点をローカルで生成し、その開始点を並列プロセッサに配布するため、実行は再現可能です。したがって、並列プロセッサは乱数を使用しません。詳細については、並列処理と乱数ストリームを参照してください。

制限事項とパフォーマンスに関する考慮事項.  parfor に関連するその他の注意事項は 並列 for ループ (parfor) (Parallel Computing Toolbox) に記載されています。

並列計算の速度に影響する要因と並列計算の結果に影響する要因については、並列計算によるパフォーマンスの向上 を参照してください。Global Optimization Toolbox 関数を使用した並列計算にも同じ考慮事項が適用されます。

マルチスタート

MultiStart は、問題と開始ポイントを複数のプロセスまたはプロセッサに自動的に分散できます。問題は独立して実行され、MultiStart は個別の局所最小値を GlobalOptimSolution オブジェクトのベクトルに結合します。MultiStart は、次の場合に並列コンピューティングを使用します。

  • Parallel Computing Toolbox ソフトウェアのライセンスを所持している。

  • Parallel Computing Toolbox 関数である parpool を使用して並列計算を有効にします。

  • MultiStart オブジェクトの UseParallel プロパティを true に設定します。

    ms = MultiStart('UseParallel',true);

これらの条件が満たされると、MultiStart は問題と開始ポイントをプロセスまたはプロセッサに 1 つずつ分散します。アルゴリズムは、停止条件に達するか、配布する開始ポイントがなくなると停止します。MultiStart Display プロパティが 'iter' の場合、MultiStart は次のように表示されます。

Running the local solvers in parallel.

並列 MultiStart の例については、 並列マルチスタート を参照してください。

並列マルチスタートの実装上の問題.  fmincon は、並列 MultiStart と併用すると、勾配を並列に推定できません。この並列勾配推定の欠如は、ネストされた parfor ループはありません で説明されている parfor の制限によるものです。

fmincon は、直列ではなく並列で勾配を推定するのに時間がかかることがあります。この場合、fmincon での並列勾配推定とともに MultiStart を使用すると、速度低下が増幅されます。たとえば、ms MultiStart オブジェクトの UseParallelfalse に設定されているとします。problem.options.UseParalleltrue に設定されている状態で、 fminconproblem を解くのに 1 秒長くかかるとします。すると、run(ms,problem,200) は、problem.options.UseParallelfalse に設定して同じ実行を行った場合よりも 200 秒長くかかります。

メモ

逐次実行した場合、parfor ループは for ループよりも実行が遅くなります。したがって、最高のパフォーマンスを得るには、MultiStart UseParallel プロパティが true の場合、ローカル ソルバーの UseParallel オプションを false に設定します。

メモ

並列で実行する場合でも、ソルバーはホスト マシンで目的関数と非線形制約関数を逐次的に呼び出すことがあります。したがって、関数がシリアルおよび並列で評価されるかどうかについて想定されていないことを確認してください。

グローバルサーチ

GlobalSearch は問題と開始ポイントを複数のプロセスまたはプロセッサに分散しません。ただし、GlobalSearchfmincon ローカル ソルバーを実行する場合、fmincon は並列有限差分によって勾配を推定できます。fmincon は、次の場合に並列コンピューティングを使用します。

  • Parallel Computing Toolbox ソフトウェアのライセンスを所持している。

  • Parallel Computing Toolbox 関数である parpool を使用して並列計算を有効にします。

  • UseParallel オプションを optimoptions とともに true に設定します。problem 構造でこのオプションを設定します。

    opts = optimoptions(@fmincon,'UseParallel',true,'Algorithm','sqp');
    problem = createOptimProblem('fmincon','objective',@myobj,...
        'x0',startpt,'options',opts);

詳細については、Optimization Toolbox での並列計算の使用を参照してください。

パターン探索

patternsearch は、パターン内のポイントに関連付けられた目的関数と制約関数の評価を複数のプロセスまたはプロセッサに自動的に分散できます。patternsearch は、次の場合に並列コンピューティングを使用します。

  • Parallel Computing Toolbox ソフトウェアのライセンスを所持している。

  • Parallel Computing Toolbox 関数である parpool を使用して並列計算を有効にします。

  • optimoptions を使用して次のオプションを設定します。

    • UseCompletePolltrue です。

    • UseVectorizedfalse (デフォルト) です。

    • UseParalleltrue です。

これらの条件が満たされると、ソルバーはポーリング中にパターン検索の目的関数と制約値を並列に計算します。さらに、patternsearchCache オプションの設定を上書きし、デフォルトの 'off' 設定を使用します。

R2019a 以降では、UseParallel オプションを true に設定すると、patternsearch が内部的に UseCompletePoll 設定を true にオーバーライドし、関数が並列にポーリングするようになります。

メモ

並列実行している場合でも、patternsearch はホスト マシン上で目的関数と非線形制約関数を順次呼び出すことがあります。このため、関数が逐次的または並列のいずれで評価されるのかについて、仮定がなされていないことを確認してください。

並列検索機能.  patternsearch はオプションで各反復で検索関数を呼び出すことができます。次の場合、検索は並列になります。

  • UseCompleteSearchtrue に設定します。

  • 検索方法を @searchneldermead または custom に設定しないでください。

  • 検索方法を patternsearch ポーリング方式またはラテンハイパーキューブ検索に設定し、 UseParalleltrue に設定します。

  • または、検索方法を ga に設定する場合は、 UseParalleltrue に設定した検索方法オプションを作成します。

並列パターン検索における実装上の問題.  パターン探索 にリストされている patternsearch オプションの制限は、部分的には parfor の制限から生じ、部分的には並列処理の性質から生じます。

  • Cache'off' にオーバーライドされます — patternsearchCache を永続変数として実装します。parfor は、変数がプロセッサによって異なる設定になる可能性があるため、永続変数を処理しません。

  • UseCompletePolltrue です — UseCompletePoll は、patternsearch がより良いポイントを見つけるとすぐに投票を停止するかどうかを決定します。並列検索の場合、parfor はすべての評価を同時にスケジュールし、patternsearch はすべての評価が完了した後に続行します。patternsearch は、評価の開始後に評価を停止することはできません。

    R2019a 以降では、UseParallel オプションを true に設定すると、patternsearch が内部的に UseCompletePoll 設定を true にオーバーライドし、関数が並列にポーリングするようになります。

  • UseVectorizedfalse です — UseVectorized は、patternsearch が 1 回の関数呼び出しでパターン内のすべてのポイントをベクトル化された方法で評価するかどうかを決定します。UseVectorizedtrue の場合、 patternsearch は関数の評価を分散しないため、 parfor は使用されません。

遺伝的アルゴリズム

gagamultiobj は、集団に関連付けられた目的関数と非線形制約関数の評価を複数のプロセッサに自動的に分散できます。ga は、次の場合に並列コンピューティングを使用します。

  • Parallel Computing Toolbox ソフトウェアのライセンスを所持している。

  • Parallel Computing Toolbox 関数である parpool を使用して並列計算を有効にします。

  • optimoptions を使用して次のオプションを設定します。

    • UseVectorizedfalse (デフォルト) です。

    • UseParalleltrue です。

これらの条件が満たされると、ga は集団内の個体の目的関数と非線形制約値を並列に計算します。

メモ

並列実行している場合でも、ga はホスト マシン上で適応度関数と非線形制約関数をシリアルに呼び出すことがあります。このため、関数が逐次的または並列のいずれで評価されるのかについて、仮定がなされていないことを確認してください。

並列遺伝的アルゴリズムの実装上の問題.  遺伝的アルゴリズム にリストされているオプションの制限は、部分的には parfor の制限から生じ、部分的には並列処理の性質から生じます。

  • UseVectorizedfalse です — UseVectorized は、ga がベクトル化された方法で 1 回の関数呼び出しで集団全体を評価するかどうかを決定します。UseVectorizedtrue の場合、 ga は関数の評価を分散しないため、 parfor は使用されません。

ga は終了後に実行されるハイブリッド関数を持つことができます。遺伝的アルゴリズムにおけるハイブリッド方式 を参照してください。ハイブリッド関数で並列計算を活用するには、UseParalleltrue になるようにオプションを個別に設定します。ハイブリッド関数が patternsearch の場合、patternsearch が並列に実行されるように UseCompletePolltrue に設定します。

ハイブリッド関数が fmincon の場合、並列勾配推定を行うには、次のオプションを optimoptions とともに設定します。

  • GradObj'on' であってはなりません — 'off' または [] にすることができます。

  • または、非線形制約関数がある場合、GradConstr'on' であってはならず、'off' または [] になります。

ハイブリッド関数のオプションの記述方法については、並列ハイブリッド関数 を参照してください。

gamultiobj による並列コンピューティング

gamultiobj を使用した並列計算は、 ga を使用した場合とほぼ同じように動作します。詳細については、遺伝的アルゴリズムを参照してください。

gamultiobjga を使用した並列コンピューティングの違いは、ハイブリッド関数に関係しています。gamultiobj では、ハイブリッド関数 fgoalattain のみが許可されます。この関数は、gamultiobj の実行が終了した後にオプションで実行されます。計算されたパレート境界内の各個体、つまり gamultiobj によって発見された最終的な集団は、 fgoalattain を使用した最適化の開始点になります。これらの最適化は並行して実行されます。これらの最適化を実行するプロセッサの数は、個体数と parpool のサイズのうち小さい方になります。

fgoalattain を並列実行するには、オプションを正しく設定します。

fgoalopts = optimoptions(@fgoalattain,'UseParallel',true)
gaoptions = optimoptions('ga','HybridFcn',{@fgoalattain,fgoalopts});
gamultiobjgaoptions と一緒に実行すると、fgoalattain が並行して実行されます。ハイブリッド機能の設定の詳細については、ハイブリッド機能オプション を参照してください。

gamultiobjparfor ループを使用して fgoalattain を呼び出すため、 fgoalattaingamultiobj とのハイブリッド関数として使用される場合、並列で勾配を推定しません。詳細については、ネストされた parfor ループはありませんを参照してください。

粒子群

particleswarm は、集団に関連付けられた目的関数の評価を複数のプロセッサに自動的に分散できます。particleswarm は、次の場合に並列コンピューティングを使用します。

  • Parallel Computing Toolbox ソフトウェアのライセンスを所持している。

  • Parallel Computing Toolbox 関数である parpool を使用して並列計算を有効にします。

  • optimoptions を使用して次のオプションを設定します。

    • UseVectorizedfalse (デフォルト) です。

    • UseParalleltrue です。

これらの条件が満たされると、particleswarm は集団内の粒子の目的関数を並列に計算します。

メモ

並列実行している場合でも、particleswarm はホスト マシン上で目的関数をシリアルに呼び出すことがあります。したがって、目的関数がシリアルで評価されるか並列で評価されるかについての仮定がないことを確認してください。

並列粒子群最適化における実装上の問題.  粒子群 にリストされているオプションの制限は、部分的には parfor の制限から生じ、部分的には並列処理の性質から生じます。

  • UseVectorizedfalse です — UseVectorized は、particleswarm がベクトル化された方法で 1 回の関数呼び出しで集団全体を評価するかどうかを決定します。UseVectorizedtrue の場合、 particleswarm は関数の評価を分散しないため、 parfor は使用されません。

particleswarm は終了後に実行されるハイブリッド関数を持つことができます。遺伝的アルゴリズムにおけるハイブリッド方式 を参照してください。ハイブリッド関数で並列計算を活用するには、UseParalleltrue になるようにオプションを個別に設定します。ハイブリッド関数が patternsearch の場合、patternsearch が並列に実行されるように UseCompletePolltrue に設定します。

ハイブリッド関数が fmincon の場合、並列勾配推定を行うには、GradObj オプションを 'off' または []optimoptions とともに設定します。

ハイブリッド関数のオプションの記述方法については、並列ハイブリッド関数 を参照してください。

シミュレーテッド アニーリング

simulannealbnd は自動的に並列実行されません。ただし、並列コンピューティングを活用するハイブリッド関数を呼び出すことはできます。ハイブリッド関数のオプションの記述方法については、並列ハイブリッド関数 を参照してください。

パレート検索

paretosearch は、集団に関連付けられた目的関数の評価を複数のプロセッサに自動的に分散できます。paretosearch は、次の場合に並列コンピューティングを使用します。

  • Parallel Computing Toolbox ソフトウェアのライセンスを所持している。

  • Parallel Computing Toolbox 関数である parpool を使用して並列計算を有効にします。

  • optimoptions を使用して次のオプションを設定します。

    • UseParalleltrue です。

これらの条件が満たされると、paretosearch は集団内の粒子の目的関数を並列に計算します。

メモ

並列実行している場合でも、paretosearch はホスト マシン上で目的関数をシリアルに呼び出すことがあります。したがって、目的関数がシリアルで評価されるか並列で評価されるかについての仮定がないことを確認してください。

アルゴリズムの詳細については、並列計算とベクトル化関数評価のための変更 を参照してください。

代理最適化

surrogateopt は、集団に関連付けられた目的関数の評価を複数のプロセッサに自動的に分散できます。surrogateopt は、次の場合に並列コンピューティングを使用します。

  • Parallel Computing Toolbox ソフトウェアのライセンスを所持している。

  • Parallel Computing Toolbox 関数である parpool を使用して並列計算を有効にします。

  • optimoptions を使用して次のオプションを設定します。

    • UseParalleltrue です。

これらの条件が満たされると、surrogateopt は集団内の粒子の目的関数を並列に計算します。

メモ

並列実行している場合でも、surrogateopt はホスト マシン上で目的関数をシリアルに呼び出すことがあります。したがって、目的関数がシリアルで評価されるか並列で評価されるかについての仮定がないことを確認してください。

アルゴリズムの詳細については、並列surrogateoptアルゴリズム を参照してください。

関連するトピック