4

我正在尝试使用 python/pyfmi 和多处理并行模拟多个 Modelica FMU。但是,一旦 FMU 初始化,我就无法从子进程返回任何 pyfmi FMI 对象。似乎 pyfmi FMI 对象(例如 pyfmi.fmi.FMUModelCS2 或 pyfmi.fmi.FMUState2)是不可挑选的。我也试过用莳萝泡菜,这对我来说不起作用。使用 dill 对象是可腌制的,这意味着没有错误,但是如果我之后尝试重新加载它们,它们就会以某种方式损坏。有谁知道如何解决这个问题?谢谢!

4

3 回答 3

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

于 2016-11-11T16:57:58.273 回答
3

问题是 pyfmi.fmiFMUModelCS2 是一个依赖于外部库的 Cython 类,这使得它无法选择。所以不幸的是这是不可能的。

如果您想使用多处理,我看到的唯一前进方法是您首先创建进程,然后将 FMU 加载到单独的进程中。通过这种方式,您不需要腌制课程。

于 2016-11-11T08:31:03.783 回答
0

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)

我无法掌握。

于 2016-12-05T08:35:04.080 回答