【问题标题】:mpi4py Pickling error when trying to send classes尝试发送课程时出现 mpi4py Pickling 错误
【发布时间】:2014-02-13 14:25:17
【问题描述】:

我使用 mpi4py 在几个 proc 之间拆分一些计算。基本上我只是计算一些凸包的体积,我使用 tvtk 和 mayavi 创建。

只有第一个 proc 导入这些库:

...
if rank==0:
   from tvtk.api import tvtk
   from mayavi Import mlab
   ...
   mlab.figure(size=(1024,768),bgcolor=(1,1,1))
   ...

然后,我尝试在所有 procs 之间共享对象 mlab 和 tvtk:

for i in range(comm.Get_size()):
    comm.send(mlab,dest=i)
    comm.send(tvtk,dest=i)
....

以下步骤类似于...

Points=local_data
ug=tvtk.UnstructuredGrid(Points=Points)
...
dataname="Data %s " % rank
ds=mlab.pipeline.add_dataset(ug,name=dataname)
delaunay=mlab.pipeline.delaunay3d(ds,name=dataname)
... calc volume...

但是,显然不可能发送实例/类(或任何 mlab 和 tvtk),因为我总是收到以下错误:

comm.send(mlab,dest=i)
File "Comm.pyx", line 753, in mpi4py.MPI.Comm.send (src/mpi4py.MPI.c:53848)
File "pickled.pxi", line 122, in mpi4py.MPI.PyMPI_send (src/mpi4py.MPI.c:20409)
 File "pickled.pxi", line 39, in mpi4py.MPI._p_Pickle.dump (src/mpi4py.MPI.c:19503)
cPickle.PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed

有没有办法在所有 procs 之间“共享”实例 mlab 和 tvtk?

编辑:简短示例;你能让这个工作吗?

from mpi4py import MPI
comm=MPI.COMM_WORLD

size=comm.Get_size()
rank=comm.Get_rank()

if rank==0:
        from tvtk.api import tvtk
        from mayavi import mlab

if __name__=='__main__':
        if rank==0:
                for i in range(size):
                        comm.send(mlab,dest=i)
                        comm.send(tvtk,dest=i)
        else:
                local_mlab=comm.recv(mlab,source=0)
                local_tvtk=comm.recv(tvtk,source=0)

【问题讨论】:

    标签: pickle mayavi mpi4py


    【解决方案1】:

    我猜以下可能适用于您的情况

    from mpi4py import MPI
    MPI._p_pickle.dumps = dill.dumps
    MPI._p_pickle.loads = dill.loads
    

    【讨论】:

    • 对于 mpi4py v2.0.0 所需的命令是 MPI.pickle.dumps = dill.dumpsMPI.pickle.loads = dill.loads
    【解决方案2】:

    我认为问题在于你不能以这种方式发送包,你可以在所有正在运行的实例上导入它们并在需要的地方使用它们,这似乎可以让你做你想做的事

    但是,这不会共享任何全局模块数据,这可能是您尝试做的,因此这需要您单独发送它,我建议使用:

    global_data = None
    
    if rank == 0:
        global_data = {'value_of_interest': mlab.some_parameter}
    
    global_data = MPI.COMM_WORLD.bcast(global_data, root=0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 2014-03-22
      • 2017-02-18
      • 2016-03-18
      • 2012-08-23
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多