Main Content

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

Global Optimization Toolbox で並列処理を使用する方法

マルチコアプロセッサ

マルチコア プロセッサを使用している場合は、並列処理を使用すると処理速度が向上することがあります。Parallel Computing Toolbox™ ライセンスで、いくつかのワーカーの並列プールを設定できます。Parallel Computing Toolbox ソフトウェアの詳細については、Parallel Computing Toolbox 入門 (Parallel Computing Toolbox)を参照してください。

デュアルコア プロセッサが搭載されており、並列計算を使用するとします。次のコードをコマンド ラインで入力します。

parpool

MATLAB® が、マルチコア プロセッサを使用してワーカーのプールを開始します。既定ではないクラスター プロファイルが既に設定されている場合は、次のコードを入力することによって、マルチコア (ローカル) コンピューティングを実行できます。

parpool('local')

メモ

基本設定によっては、MATLAB は並列プールを自動的に起動できます。この機能を有効にするには、[ホーム] タブの [環境] グループで [並列]、[並列基本設定] を選択してから、[並列プールを自動的に作成する] をオンにします。

並列処理を使用するようにソルバーを設定します。

ソルバーコマンドライン設定
ga

options = optimoptions('ga','UseParallel', true, 'UseVectorized', false);

gamultiobj

options = optimoptions('gamultiobj','UseParallel', true, 'UseVectorized', false);

MultiStart

ms = MultiStart('UseParallel', true);

または

ms.UseParallel = true

paretosearch

options = optimoptions('paretosearch','UseParallel',true);

particleswarm

options = optimoptions('particleswarm', 'UseParallel', true, 'UseVectorized', false);

patternsearch

options = optimoptions('patternsearch','UseParallel', true, 'UseCompletePoll', true, 'UseVectorized', false);

surrogateopt

options = optimoptions('surrogateopt','UseParallel',true);

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

options を使用して適用可能なソルバーを実行すると、そのソルバーは自動的に並列計算を使用します。

並列での最適化計算を停止するには、UseParallelfalse に設定します。すべての並列計算を停止するには、次のコードを入力します。

delete(gcp)

メモ

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

プロセッサネットワーク

ネットワーク上に複数のプロセッサがある場合は、Parallel Computing Toolbox 関数と MATLAB Parallel Server™ ソフトウェアを使用して並列計算を設定します。

システムが並列計算用に正しく設定されていることを確認します。システム管理者にチェックを依頼するか、Parallel Computing Toolbox ドキュメンテーションを参照してください。

  1. 次のコードを入力して、基本チェックを実行します。ここで、prof はクラスター プロファイルです。

    parpool(prof)
  2. ワーカーは目的関数のファイルと、該当する場合は非線形制約関数のファイルにアクセスできなければなりません。確実にアクセスするため、次のステップのいずれかを実行します。

    • parpool (Parallel Computing Toolbox) AttachedFiles 引数を使用してワーカーにファイルを分散する。この例では、objfun.m が目的関数ファイルで、constrfun.m が非線形制約関数ファイルです。

      parpool('AttachedFiles',{'objfun.m','constrfun.m'});

      ワーカーはファイルの独自のコピーにアクセスします。

    • 目的または制約関数ファイルへのネットワーク ファイル パスを指定します。

      pctRunOnAll('addpath network_file_path')

      ワーカーはネットワークを通じて関数ファイルにアクセスします。

  3. ファイルがすべてのワーカーのパス上にあるかどうかをチェックします。

    pctRunOnAll('which filename')
    ワーカーにファイルへのパスがない場合は、次のように出力されます。
    filename not found.

並列処理を使用するようにソルバーを設定します。

ソルバーコマンドライン設定
ga

options = optimoptions('ga','UseParallel', true, 'UseVectorized', false);

gamultiobj

options = optimoptions('gamultiobj','UseParallel', true, 'UseVectorized', false);

MultiStart

ms = MultiStart('UseParallel', true);

または

ms.UseParallel = true

paretosearch

options = optimoptions('paretosearch','UseParallel',true);

particleswarm

options = optimoptions('particleswarm', 'UseParallel', true, 'UseVectorized', false);

patternsearch

options = optimoptions('patternsearch','UseParallel', true, 'UseCompletePoll', true, 'UseVectorized', false);

surrogateopt

options = optimoptions('surrogateopt','UseParallel',true);

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

並列計算環境を設定した後は、適用可能なソルバーは、options を使用して呼び出したときにはいつでも自動的に並列計算を使用します。

並列での最適化計算を停止するには、UseParallelfalse に設定します。すべての並列計算を停止するには、次のコードを入力します。

delete(gcp)

メモ

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

並列検索機能またはハイブリッド機能

patternsearch 検索関数を並列で実行したり、ga または simulannealbnd のハイブリッド関数を並列で実行するには、次の手順を実行します。

  1. マルチコアプロセッサ または プロセッサネットワーク の説明に従って並列処理を設定します。

  2. 検索機能またはハイブリッド機能に、次のセクションで概説されている条件が満たされていることを確認します。

パターン検索検索機能

patternsearch は、以下の条件下で並列検索機能を使用します。

  • UseCompleteSearchtrue です。

  • 検索方法は @searchneldermead または custom ではありません。

  • 検索方法が patternsearch ポーリング法またはラテンハイパーキューブ検索の場合、 UseParalleltrue になります。optimoptions を使用してコマンドラインで設定します。

    options = optimoptions('patternsearch','UseParallel',true,...
        'UseCompleteSearch',true,'SearchFcn',@GPSPositiveBasis2N);
  • 検索方法が ga の場合、検索方法オプションでは UseParalleltrue に設定されています。optimoptions を使用してコマンドラインで設定します。

    iterlim = 1; % iteration limit, specifies # ga runs
    gaopt = optimoptions('ga','UseParallel',true);
    options = optimoptions('patternsearch','SearchFcn',...
        {@searchga,iterlim,gaopt});

検索オプションの詳細については、検索オプション を参照してください。例については、検索と投票を参照してください。

並列ハイブリッド関数

gaparticleswarm、および simulannealbnd では、反復の後に他のソルバーを実行したり、反復の間に他のソルバーを散在させたりすることができます。これらの他のソルバーはハイブリッド関数と呼ばれます。gamultiobj でのハイブリッド関数の使用については、gamultiobj による並列コンピューティング を参照してください。patternsearchfmincon はどちらもハイブリッド関数になることができます。patternsearch が並列で実行されるように、または fmincon が並列で勾配を推定するようにオプションを設定できます。

ga の場合は ハイブリッド機能オプションparticleswarm の場合は ハイブリッド機能simulannealbnd の場合は ハイブリッド機能オプション の説明に従って、ハイブリッド機能のオプションを設定します。要約:

  • ハイブリッド関数がpatternsearchの場合

    1. patternsearch オプションを作成します:

      hybridopts = optimoptions('patternsearch','UseParallel',true,...
          'UseCompletePoll',true);
    2. patternsearch をハイブリッド関数として使用するには、ga または simulannealbnd オプションを設定します。

      options = optimoptions('ga','UseParallel',true); % for ga
      options = optimoptions('ga',options,...
          'HybridFcn',{@patternsearch,hybridopts});
      % or, for simulannealbnd:
      options = optimoptions(@simulannealbnd,'HybridFcn',{@patternsearch,hybridopts});

    並列 patternsearch の詳細については、 パターン探索 を参照してください。

  • ハイブリッド関数が fmincon の場合:

    1. fmincon オプションを作成します:

      hybridopts = optimoptions(@fmincon,'UseParallel',true,...
          'Algorithm','interior-point');
      % You can use any Algorithm except trust-region-reflective
    2. fmincon をハイブリッド関数として使用するには、ga または simulannealbnd オプションを設定します。

      options = optimoptions('ga','UseParallel',true);
      options = optimoptions('ga',options,'HybridFcn',{@fmincon,hybridopts});
      % or, for simulannealbnd:
      options = optimoptions(@simulannealbnd,'HybridFcn',{@fmincon,hybridopts});

    並列 fmincon の詳細については、 並列計算 を参照してください。

並列最適化のテスト

次の手順に従って、問題が並列で正しく動作するかどうかをテストします。

  1. 並列計算を使用せずに問題を試し、それが逐次実行されることを確認します。次のテストに進む前に、このテストが成功する (正しい結果が得られる) ことを確認します。

  2. UseParalleltrue に設定し、delete(gcp) を入力して並列プールが存在しないことを確認します。MATLAB が並列プールを作成しないことを確認するには、[ホーム] タブの [環境] グループで [並列]、[並列基本設定] を選択してから、[並列プールを自動的に作成する] をオフにします。for ループとは逆順のループの反復により parfor で逐次的に問題を実行します。次のテストに進む前に、このテストが成功する (正しい結果が得られる) ことを確認します。

  3. UseParalleltrue に設定し、parpool を使用して並列プールを作成します。マルチコア プロセッサまたはネットワークを設定していない場合は、このテストの処理速度が向上しません。このテストは計算の正確性を検証するためのものです。

options 引数を使用してソルバーを呼び出し、並列機能をテストまたは使用するようにしてください。

関連するトピック