求解器如何并行计算
Global Optimization Toolbox 中的并行处理类型
并行处理是加速优化算法的一种有吸引力的方法。要使用并行处理,您必须拥有 Parallel Computing Toolbox™ 许可证,并拥有并行工作进程池 (parpool
)。有关详细信息,请参阅如何在 Global Optimization Toolbox 中使用并行处理。
Global Optimization Toolbox 求解器以各种方式使用并行计算。
求解器 | 并行? | 并行特征 |
---|---|---|
| × | 无并行功能。但是,fmincon 在 GlobalSearch 中运行时可以使用并行梯度计算。请参阅 在 Optimization Toolbox 中使用并行计算。 |
|
| 起点分布到多个处理器。从这些点开始,局部求解器运行直至完成。有关详细信息,请参阅MultiStart和 如何在 Global Optimization Toolbox 中使用并行处理。 |
对于 fmincon ,没有与 MultiStart 并行的并行梯度计算。 | ||
|
| 并行评估群体,每次迭代进行一次。有关详细信息,请参阅遗传算法和 如何在 Global Optimization Toolbox 中使用并行处理。 |
不对适应度或约束函数进行向量化。 | ||
|
| 并行评估群体,每次迭代进行一次。有关详细信息,请参阅粒子群和 如何在 Global Optimization Toolbox 中使用并行处理。 |
不对目标或约束函数进行向量化。 | ||
|
| 轮询点以并行方式进行评估,每次迭代进行一次。有关详细信息,请参阅模式搜索和 如何在 Global Optimization Toolbox 中使用并行处理。 |
不对目标或约束函数进行向量化。 | ||
| × | 无并行功能。但是,simulannealbnd 可以使用并行运行的混合函数。请参阅 模拟退火。 |
|
| 并行评估搜索点。 |
不对目标或约束函数进行向量化。 |
此外,一些求解器具有在完成后运行的混合函数。一些混合函数可以并行运行。此外,大多数 patternsearch
搜索方法可以并行运行。有关详细信息,请参阅并行搜索函数或混合函数。
工具箱函数如何分配进程
parfor 特性和注意事项
无嵌套 parfor 循环. 大多数求解器采用 Parallel Computing Toolbox parfor
(Parallel Computing Toolbox) 函数来执行并行计算。两个求解器 surrogateopt
和 paretosearch
改用 parfeval
(Parallel Computing Toolbox)。
注意
当从另一个 parfor
循环中调用时,parfor
不能并行工作。
注意
文档建议在调用 Simulink® 时不要使用 parfor
或 parfeval
;请参阅Using sim Function Within parfor (Simulink)。因此,在使用求解器的内置并行功能并行优化 Simulink 仿真时,可能会遇到问题。有关如何使用多个 Global Optimization Toolbox 求解器优化 Simulink 模型的示例,请参阅并行优化 Simulink 模型。
例如,假设您的目标函数 userfcn
调用 parfor
,并且您想使用 MultiStart
和并行处理调用 fmincon
。还假设 fmincon
的并行梯度评估条件得到满足,如 并行优化功能 所示。图当 parfor 并行运行时显示了三种情况:
最外层的循环是并行
MultiStart
。仅该循环并行运行。最外层的
parfor
循环在fmincon
中。只有fmincon
并行运行。最外层的
parfor
循环在userfcn
中。在这种情况下,userfcn
可以并行使用parfor
。
当 parfor 并行运行时
并行随机数不可重现. MATLAB® 中的随机数序列是伪随机的,由种子或初始设置确定。并行计算使用不一定可控制或可重现的种子。例如,MATLAB 的每个实例都有一个默认的全局设置,用于确定随机序列的当前种子。
对于 patternsearch
,如果您选择 MADS 作为轮询或搜索方法,并行模式搜索将无法重现运行。如果选择遗传算法或拉丁超立方体作为搜索方法,并行模式搜索就无法重现运行。
对于 ga
和 gamultiobj
,平行种群代会产生不可重复的结果。
MultiStart
不同。您可以从并行 MultiStart
进行可重复的运行。运行是可重现的,因为 MultiStart
在本地生成伪随机起点,然后将起点分发到并行处理器。因此,并行处理器不使用随机数。有关详细信息,请参阅并行处理和随机数流。
限制和性能注意事项. 与 parfor
相关的更多警告出现在 并行 for 循环 (parfor) (Parallel Computing Toolbox) 中。
有关影响并行计算速度的因素以及影响并行计算结果的因素的信息,请参阅 利用并行计算提高性能。同样的考虑也适用于使用 Global Optimization Toolbox 函数进行并行计算。
MultiStart
MultiStart
可以自动将问题和起点分配给多个进程或处理器。这些问题独立运行,并且 MultiStart
将不同的局部极小值组合成 GlobalOptimSolution
对象的向量。MultiStart
在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool
、Parallel Computing Toolbox 函数启用并行计算。将
MultiStart
对象中的UseParallel
属性设置为true
:ms = MultiStart('UseParallel',true);
当这些条件成立时,MultiStart
会将问题和起点逐个分配给进程或处理器。当达到停止条件或用尽要分配的起点时,算法就会停止。如果 MultiStart
Display
属性为 'iter'
,则 MultiStart
显示:
Running the local solvers in parallel.
有关并行 MultiStart
的示例,请参阅 并行 MultiStart。
并行 MultiStart 中的实现问题. fmincon
与并行 MultiStart
一起使用时无法并行估计梯度。缺乏并行梯度计算是由于 无嵌套 parfor 循环 中描述的 parfor
的限制造成的。
fmincon
并行估计梯度比串行估计梯度可能需要更长的时间。在这种情况下,使用 MultiStart
与 fmincon
中的并行梯度计算会放大减速。例如,假设 ms
MultiStart
对象将 UseParallel
设置为 false
。假设 fmincon
解决 problem
的时间长 1 秒,且 problem.options.UseParallel
设置为 true
。然后 run(ms,problem,200)
比将 problem.options.UseParallel
设置为 false
的相同运行时间长 200 秒
注意
当串行执行时,parfor
循环比 for
循环运行得慢。因此,为了获得最佳性能,当 MultiStart
UseParallel
属性为 false
时,请将局部求解器 UseParallel
选项设置为 true
。
注意
即使并行运行,求解器偶尔也会在主机上串行调用目标和非线性约束函数。因此,确保您的函数对于它们是否以串行和并行方式评估没有任何假设。
GlobalSearch
GlobalSearch
不分配问题并且起点指向多个进程或处理器。然而,当 GlobalSearch
运行 fmincon
局部求解器时,fmincon
可以通过并行有限差分来估计梯度。fmincon
在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool
、Parallel Computing Toolbox 函数启用并行计算。将
UseParallel
选项设置为true
和optimoptions
。在problem
结构体中设置此选项:opts = optimoptions(@fmincon,'UseParallel',true,'Algorithm','sqp'); problem = createOptimProblem('fmincon','objective',@myobj,... 'x0',startpt,'options',opts);
有关详细信息,请参阅在 Optimization Toolbox 中使用并行计算。
模式搜索
patternsearch
可以自动将与模式中的点相关的目标和约束函数的评估分配给多个进程或处理器。patternsearch
在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool
、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions
设置以下选项:UseCompletePoll
为true
。UseVectorized
是false
(默认)。UseParallel
为true
。
当这些条件成立时,求解器在轮询期间并行计算模式搜索的目标函数和约束值。此外,patternsearch
会覆盖 Cache
选项的设置,并使用默认的 'off'
设置。
从 R2019a 开始,当您将 UseParallel
选项设置为 true
时,patternsearch
会在内部将 UseCompletePoll
设置覆盖为 true
,以便该函数轮询。
注意
即使在并行运行时,patternsearch
偶尔也会在主机上串行调用目标和非线性约束函数。因此,请确保您的函数没有关于它们是串行还是并行评估的假设。
并行搜索函数. patternsearch
可以选择在每次迭代时调用搜索函数。当您执行以下操作时,搜索是并行的:
将
UseCompleteSearch
设置为true
。不要将搜索方法设置为
@searchneldermead
或custom
。将搜索方法设置为
patternsearch
轮询方法或拉丁超立方体搜索,并将UseParallel
设置为true
。或者,如果将搜索方法设置为
ga
,则创建一个将UseParallel
设置为true
的搜索方法选项。
并行模式搜索的实现问题. 模式搜索 中列出的 patternsearch
选项的限制部分源于 parfor
的限制,部分源于并行处理的性质:
Cache
被覆盖为'off'
-patternsearch
将Cache
实现为持久变量。parfor
不处理持久变量,因为该变量在不同的处理器上可能有不同的设置。UseCompletePoll
是true
-UseCompletePoll
确定一旦patternsearch
找到更好的点,轮询是否停止。当并行搜索时,parfor
会同时安排所有评估,而patternsearch
会在所有评估完成后继续。patternsearch
无法在评估开始后停止评估。从 R2019a 开始,当您将
UseParallel
选项设置为true
时,patternsearch
会在内部将UseCompletePoll
设置覆盖为true
,以便该函数轮询。UseVectorized
是false
-UseVectorized
确定patternsearch
是否以向量化方式通过一次函数调用评估模式中的所有点。如果UseVectorized
是true
,则patternsearch
不分配函数的求值,因此不使用parfor
。
遗传算法
ga
和 gamultiobj
可以自动将与种群相关的目标和非线性约束函数的评估分配给多个处理器。ga
在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool
、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions
设置以下选项:UseVectorized
是false
(默认)。UseParallel
为true
。
当这些条件成立时,ga
会并行计算种群中个体的目标函数和非线性约束值。
注意
即使在并行运行时,ga
偶尔也会在主机上串行调用适应度和非线性约束函数。因此,请确保您的函数没有关于它们是串行还是并行评估的假设。
并行遗传算法的实现问题. 遗传算法 中列出的选项的限制部分源于 parfor
的限制,部分源于并行处理的性质:
UseVectorized
是false
-UseVectorized
确定ga
是否以向量化方式通过一次函数调用评估整个种群。如果UseVectorized
是true
,则ga
不分配函数的求值,因此不使用parfor
。
ga
可以具有在完成后运行的混合函数;请参阅 遗传算法中的混合方案。如果希望混合函数利用并行计算,请单独设置其选项,使得 UseParallel
为 true
。如果混合函数是 patternsearch
,则将 UseCompletePoll
设置为 true
,以便 patternsearch
并行运行。
如果混合函数为 fmincon
,则使用 optimoptions
设置以下选项以进行并行梯度计算:
GradObj
不能是'on'
- -它可以是'off'
或[]
。或者,如果存在非线性约束函数,
GradConstr
不能是'on'
- - 它可以是在'off'
或[]
。
要了解如何为混合函数编写选项,请参阅 并行混合函数。
使用 gamultiobj 进行并行计算
使用 gamultiobj
进行并行计算与使用 ga
进行并行计算几乎相同。有关详细信息,请参阅 遗传算法。
gamultiobj
和 ga
并行计算的区别在于混合函数。gamultiobj
只允许一个混合函数,即 fgoalattain
。该函数可选择在 gamultiobj
运行完成后运行。计算出的帕累托前沿中的每个个体(即 gamultiobj
找到的最终种群)都成为使用 fgoalattain
进行优化的起点。这些优化并行运行。执行这些优化的处理器数量是个体数量和 parpool
的大小中较小者。
为了使 fgoalattain
并行运行,请正确设置其选项:
fgoalopts = optimoptions(@fgoalattain,'UseParallel',true) gaoptions = optimoptions('ga','HybridFcn',{@fgoalattain,fgoalopts});
gamultiobj
与 gaoptions
一起运行,并且 fgoalattain
并行运行。有关设置混合函数的更多信息,请参阅混合函数选项。gamultiobj
使用 fgoalattain
循环调用 parfor
,因此 fgoalattain
在与 gamultiobj
用作混合函数时不会并行估计梯度。有关详细信息,请参阅无嵌套 parfor 循环。
粒子群
particleswarm
可以自动将与种群相关的目标函数的评估分配给多个处理器。particleswarm
在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool
、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions
设置以下选项:UseVectorized
是false
(默认)。UseParallel
为true
。
当这些条件成立时,particleswarm
会并行计算种群中粒子的目标函数。
注意
即使在并行运行时,particleswarm
偶尔也会在主机上串行调用目标函数。因此,请确保您的目标函数没有关于它是串行评估还是并行评估的假设。
并行粒子群优化中的实现问题. 粒子群 中列出的选项的限制部分源于 parfor
的限制,部分源于并行处理的性质:
UseVectorized
是false
-UseVectorized
确定particleswarm
是否以向量化方式通过一次函数调用评估整个种群。如果UseVectorized
是true
,则particleswarm
不分配函数的求值,因此不使用parfor
。
particleswarm
可以具有在完成后运行的混合函数;请参阅 遗传算法中的混合方案。如果希望混合函数利用并行计算,请单独设置其选项,使得 UseParallel
为 true
。如果混合函数是 patternsearch
,则将 UseCompletePoll
设置为 true
,以便 patternsearch
并行运行。
如果混合函数是 fmincon
,则将 GradObj
选项设置为 'off'
或 []
与 optimoptions
以进行并行梯度计算。
要了解如何为混合函数编写选项,请参阅 并行混合函数。
模拟退火
simulannealbnd
不会自动并行运行。但是,它可以调用利用并行计算的混合函数。要了解如何为混合函数编写选项,请参阅 并行混合函数。
帕累托搜索
paretosearch
可以自动将与种群相关的目标函数的评估分配给多个处理器。paretosearch
在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool
、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions
设置以下选项:UseParallel
为true
。
当这些条件成立时,paretosearch
会并行计算种群中粒子的目标函数。
注意
即使在并行运行时,paretosearch
偶尔也会在主机上串行调用目标函数。因此,请确保您的目标函数没有关于它是串行评估还是并行评估的假设。
有关算法的详细信息,请参阅 并行计算和向量化函数求值的修改。
替代优化
surrogateopt
可以自动将与种群相关的目标函数的评估分配给多个处理器。surrogateopt
在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool
、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions
设置以下选项:UseParallel
为true
。
当这些条件成立时,surrogateopt
会并行计算种群中粒子的目标函数。
注意
即使在并行运行时,surrogateopt
偶尔也会在主机上串行调用目标函数。因此,请确保您的目标函数没有关于它是串行评估还是并行评估的假设。
有关算法的详细信息,请参阅 并行 surrogateopt 算法。