我正在尝试使用 python/pyfmi 和多处理并行模拟多个 Modelica FMU。但是,一旦 FMU 初始化,我就无法从子进程返回任何 pyfmi FMI 对象。似乎 pyfmi FMI 对象(例如 pyfmi.fmi.FMUModelCS2 或 pyfmi.fmi.FMUState2)是不可挑选的。我也试过用莳萝泡菜,这对我来说不起作用。使用 dill 对象是可腌制的,这意味着没有错误,但是如果我之后尝试重新加载它们,它们就会以某种方式损坏。有谁知道如何解决这个问题?谢谢!
3 回答
我在创建 EstimationPy 时遇到了类似的问题。我最终创建了一个包装器,用于使用多个进程运行同一 FMU 的并行仿真。
我建议你看看这里的实现 https://github.com/lbl-srg/EstimationPy/blob/master/estimationpy/fmu_utils/fmu_pool.py
并以示例http://lbl-srg.github.io/EstimationPy/modules/examples/first_order.html#run-multiple-simulations
问题是 pyfmi.fmiFMUModelCS2 是一个依赖于外部库的 Cython 类,这使得它无法选择。所以不幸的是这是不可能的。
如果您想使用多处理,我看到的唯一前进方法是您首先创建进程,然后将 FMU 加载到单独的进程中。通过这种方式,您不需要腌制课程。
pathos模块允许使用与 相似的接口进行多处理,但multiprocessing
依赖于dill而不是pickle
序列化。该Pool
方法适用于 的并行执行model.simulate
,前提是结果在内存中处理:
n_core = 2
n_simulation = 10
# ====
import pyfmi
model = pyfmi.load_fmu(path_fmu)
def worker(*args):
model.reset()
print "================> %d" % args[0]
return model.simulate(options=dict(result_handling="memory"))["y"]
from pathos.multiprocessing import Pool
pool = Pool(n_core)
out = pool.map(worker, range(n_simulation))
pool.close()
pool.join()
请注意,在上面的代码片段中,有必要在内存中处理结果:options=dict(result_handling="memory")
。默认使用临时文件,适用于模拟量较小的情况。但是,排队的时间越长,获得类似物品的机会就越高
Exception in thread Thread-27:
Traceback (most recent call last):
File "/home/USER/anaconda2/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/home/USER/anaconda2/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/USER/anaconda2/lib/python2.7/site-packages/multiprocess/pool.py", line 389, in _handle_results
task = get()
File "/home/USER/anaconda2/lib/python2.7/site-packages/dill/dill.py", line 260, in loads
return load(file)
File "/home/USER/anaconda2/lib/python2.7/site-packages/dill/dill.py", line 250, in load
obj = pik.load()
File "/home/USER/anaconda2/lib/python2.7/pickle.py", line 864, in load
dispatch[key](self)
File "/home/USER/anaconda2/lib/python2.7/pickle.py", line 1139, in load_reduce
value = func(*args)
TypeError: __init__() takes exactly 2 arguments (1 given)
我无法掌握。