如何在 Global Optimization Toolbox 中使用并行处理
多核处理器
如果您有多核处理器,可以通过使用并行处理来提高处理速度。您可以使用一个 Parallel Computing Toolbox™ 许可证建立由多个工作进程组成的并行池。有关 Parallel Computing Toolbox 软件的描述,请参阅 Parallel Computing Toolbox 快速入门 (Parallel Computing Toolbox)。
假设您有双核处理器,并且要使用并行计算。请在命令行中输入以下代码。
parpool
MATLAB® 会启动使用多核处理器的工作进程池。如果您之前设置了非默认集群配置文件,则可以通过输入以下代码来实现多核(本地)计算。
parpool('local')注意
根据您的预设项,MATLAB 可以自动启动并行池。要启用此功能,请在主页选项卡的环境组中选择并行 > 并行设置...,然后选择自动创建并行池。
将求解器设置为使用并行处理。
| 求解器 | 命令行设置 |
|---|---|
ga |
|
gamultiobj |
|
MultiStart |
或者
|
paretosearch |
|
particleswarm |
|
patternsearch |
|
surrogateopt |
|
从 R2019a 开始,当您将 UseParallel 选项设置为 true 时,patternsearch 会在内部将 UseCompletePoll 设置覆盖为 true,以便该函数轮询。
使用 options 运行适用的求解器时,适用的求解器会自动使用并行计算。
要停止并行计算优化,请将 UseParallel 设置为 false。要停止所有并行计算,请输入以下代码。
delete(gcp)
注意
文档建议在调用 Simulink® 时不要使用 parfor 或 parfeval;请参阅Using sim Function Within parfor (Simulink)。因此,在使用求解器的内置并行功能并行优化 Simulink 仿真时,可能会遇到问题。有关如何使用多个 Global Optimization Toolbox 求解器优化 Simulink 模型的示例,请参阅并行优化 Simulink 模型。
处理器网络
如果网络上有多个处理器,请使用 Parallel Computing Toolbox 函数和 MATLAB Parallel Server™ 软件来建立并行计算。
请确保您的系统针对并行计算进行了正确配置。请咨询系统管理员,或参考 Parallel Computing Toolbox 文档。
通过输入以下代码执行基本检查,其中
prof是您的集群配置文件。parpool(prof)
工作进程必须能够访问您的目标函数文件,以及(如果适用)您的非线性约束函数文件。完成以下步骤之一以确保可以访问:
使用
parpool(Parallel Computing Toolbox)AttachedFiles参量将文件分发给工作进程。在此示例中,objfun.m是您的目标函数文件,constrfun.m是您的非线性约束函数文件。parpool('AttachedFiles',{'objfun.m','constrfun.m'});
工作进程可以访问它们自己的文件副本。
给出目标或约束函数文件的网络文件路径。
pctRunOnAll('addpath network_file_path')工作进程通过网络访问函数文件。
检查文件是否在每个工作进程的路径中。
如果任一工作进程没有该文件的路径,则它会报告pctRunOnAll('which filename')filename not found.
将求解器设置为使用并行处理。
| 求解器 | 命令行设置 |
|---|---|
ga |
|
gamultiobj |
|
MultiStart |
或者
|
paretosearch |
|
particleswarm |
|
patternsearch |
|
surrogateopt |
|
从 R2019a 开始,当您将 UseParallel 选项设置为 true 时,patternsearch 会在内部将 UseCompletePoll 设置覆盖为 true,以便该函数轮询。
建立并行计算环境后,只要您使用 options 调用适用的求解器,它们就会自动使用并行计算。
要停止并行计算优化,请将 UseParallel 设置为 false。要停止所有并行计算,请输入以下代码。
delete(gcp)
注意
文档建议在调用 Simulink 时不要使用 parfor 或 parfeval;请参阅Using sim Function Within parfor (Simulink)。因此,在使用求解器的内置并行功能并行优化 Simulink 仿真时,可能会遇到问题。有关如何使用多个 Global Optimization Toolbox 求解器优化 Simulink 模型的示例,请参阅并行优化 Simulink 模型。
并行搜索函数或混合函数
要使 patternsearch 搜索函数并行运行,或使 ga 或 simulannealbnd 的混合函数并行运行,请执行以下操作。
patternsearch 搜索函数
patternsearch 在以下条件下使用并行搜索函数:
UseCompleteSearch为true。搜索方法不是
@searchneldermead或custom。如果搜索方法是
patternsearch轮询方法或拉丁超立方体搜索,则UseParallel为true。使用optimoptions在命令行中设置:options = optimoptions('patternsearch','UseParallel',true,... 'UseCompleteSearch',true,'SearchFcn',@GPSPositiveBasis2N);
如果搜索方法是
ga,则搜索方法选项将UseParallel设置为true。使用optimoptions在命令行中设置:iterlim = 1; % iteration limit, specifies # ga runs gaopt = optimoptions('ga','UseParallel',true); options = optimoptions('patternsearch','SearchFcn',... {@searchga,iterlim,gaopt});
并行混合函数
ga、particleswarm 和 simulannealbnd 可以让其他求解器在其迭代之后或中间运行。这些其他的求解器被称为混合函数。有关使用带有 gamultiobj 的混合函数的信息,请参阅 使用 gamultiobj 进行并行计算。patternsearch 和 fmincon 都可以是混合函数。您可以设置选项,以便 patternsearch 并行运行,或者 fmincon 并行估计梯度。
按照 混合函数选项 对于 ga、混合函数 对于 particleswarm 或 混合函数选项 对于 simulannealbnd 的描述设置混合函数的选项。总结一下:
如果您的混合函数是
patternsearch创建
patternsearch选项:hybridopts = optimoptions('patternsearch','UseParallel',true,... 'UseCompletePoll',true);
设置
ga或simulannealbnd选项以使用patternsearch作为混合函数: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:创建
fmincon选项:hybridopts = optimoptions(@fmincon,'UseParallel',true,... 'Algorithm','interior-point'); % You can use any Algorithm except trust-region-reflective
设置
ga或simulannealbnd选项以使用fmincon作为混合函数:options = optimoptions('ga','UseParallel',true); options = optimoptions('ga',options,'HybridFcn',{@fmincon,hybridopts}); % or, for simulannealbnd: options = optimoptions(@simulannealbnd,'HybridFcn',{@fmincon,hybridopts});
有关并行
fmincon的更多信息,请参阅 并行计算。
测试并行优化
按照以下步骤进行操作,以测试您的问题是否能以并行方式正确运行。
在不使用并行计算的情况下尝试运行您的问题,以确保它以串行方式运行。在进行下一个测试之前,需确保此测试成功(给出正确的结果)。
将
UseParallel设置为true,并通过输入delete(gcp)确保不存在并行池。要确保 MATLAB 不会创建并行池,请在主页选项卡的环境组中选择并行 > 并行设置...,然后清除自动创建并行池。您的问题将以串行方式运行parfor,循环迭代顺序与for循环相反。在进行下一个测试之前,需确保此测试成功(给出正确的结果)。将
UseParallel设置为true,并使用parpool创建一个并行池。除非您有多核处理器或网络设置,否则此测试不会提高处理速度。此测试只简单用于验证计算的正确性。
请记住使用 options 参量调用您的求解器来测试或使用并行功能。