我想使用differential_evolution参数在多个核中运行workers函数。
我遵循了文档的指示,并开发了以下脚本来检查函数的运行时间,无论是否使用了workers参数:
import time
if __name__ == '__main__':
from scipy.optimize import differential_evolution, rosen
bounds = [( 0, 2 ), ( 0, 2 ), ( 0, 2 ), ( 0, 2 ), ( 0, 2 )]
print( 'Beginning optimisation without parallelisation' )
start = time.time()
result = differential_evolution( rosen, bounds,
workers=1,
popsize=200,
maxiter=1000,
tol=0.001,
seed=1 )
end = time.time()
print( 'Optimisation finished after {} seconds'.format( round( end - start, 2 ) ) )
print( '\nBeginning optimisation with workers parameter set to 10' )
start = time.time()
result = differential_evolution( rosen, bounds,
updating='deferred',
workers=10,
popsize=200,
maxiter=1000,
tol=0.001,
seed=1 )
end = time.time()
print( 'Optimisation finished after {} seconds'.format( round( end - start, 2 ) ) )运行脚本后,以下是每个调用返回的运行时间:
Beginning optimisation without parallelisation
Optimisation finished after 59.0 seconds
Beginning optimisation with workers parameter set to 10
Optimisation finished after 60.43 seconds正如您所看到的,将workers参数设置为10的执行速度甚至比第一个要慢。你能帮我做这个吗?为了在differential_evolution函数中实现并行化,还有什么需要做的吗?
我目前正在使用Python3.8,我的scipy版本是1.8.1。
发布于 2022-10-13 02:39:14
@9769953是正确的。multiprocessing引入了一些开销:创建进程,将计算划分到子进程,等等。只有当计算是CPU密集型的,而rosen不需要这种开销,这种开销才能被克服。
如果你的目标函数可以向量化,那么向量化可以提供一个速度增益。如果您可以消除矢量化中的中间计算(这是整个计算中常见的),则收益将更大:
import time
import numpy as np
from scipy.optimize import differential_evolution, rosen
bounds = [( 0, 2 ), ( 0, 2 ), ( 0, 2 ), ( 0, 2 ), ( 0, 2 )]
print( 'Beginning optimisation without parallelisation' )
start = time.time()
result = differential_evolution( rosen, bounds,
workers=1,
popsize=200,
updating='deferred',
seed=1 )
end = time.time()
print( f'Optimisation finished after {end - start} seconds')
print( '\nBeginning optimisation with vectorisation' )
start = time.time()
result = differential_evolution( rosen, bounds,
updating='deferred',
popsize=200,
seed=1,
vectorized=True
)
end = time.time()
print( f'Optimisation finished after {end-start} seconds')给予:
Beginning optimisation without parallelisation
Optimisation finished after 46.94838500022888 seconds
Beginning optimisation with vectorisation
Optimisation finished after 40.34918713569641 secondshttps://stackoverflow.com/questions/73633572
复制相似问题