将IPython并行集群对象传递到自定义类中以进行批处理执行



我是一名新手程序员,尝试使用python进行科学编程。我认为这些帖子(如何在IPython.parallel中使用交互式定义的类?和IPython parallel推送自定义对象)触及了类似的问题,但对我没有用处。我想将我的代码作为脚本运行(用于PBS或SGE排队调度器),但我不知道该如何使用dill。

从本质上讲,我试图使用Ipython并行集群来拆分在自定义类方法中定义的计算。

我想将一个集群对象传递到我的自定义类实例中,然后使用集群来拆分对定义为成员的数据片段进行操作的计算。

  1. 在使用CCD_ 1(CCD_
  2. 然后,我想运行,python test_parallel.py
  3. 其中,test_parallel.py

class Foo(object):
    def __init__(self):
        from numpy import arange
        self.data = arange(10)*10
    def A(self, y):
        print "in A:", y
        self.data[y]
    def parallelA(self, z, cl):
        print "in parallelA:", cl[:].map_sync(self.A, z)
    def serialA(self, z):
        print "in serialA:", map(self.A, z)
if __name__ == "__main__":
    from IPython.parallel import Client
    f = '/path/to/security/ipcontroller-client.json'
    c = Client(f)
    asdf = Foo()
    asdf.serialA([1, 3, 5])      ## works
    asdf.parallelA([1, 3, 5], c) ## doesn't work

输出为


$ ~/Projects/parcellation$ python test_parallel.py 
in serialA: in A: 1
in A: 3
in A: 5
[None, None, None]
in parallelA:
Traceback (most recent call last):
  File "test_parallel.py", line 24, in <module>
    asdf.parallelA([1, 3, 5], c) ## doesn't work
  File "test_parallel.py", line 11, in parallelA
    print "in parallelA:", cl[:].map_sync(self.A, z)
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/view.py", line 366, in map_sync
    return self.map(f,*sequences,**kwargs)
  File "<string>", line 2, in map
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/view.py", line 66, in sync_results
    ret = f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/view.py", line 624, in map
    return pf.map(*sequences)
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/remotefunction.py", line 271, in map
    ret = self(*sequences)
  File "<string>", line 2, in __call__
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/remotefunction.py", line 78, in sync_view_results
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/remotefunction.py", line 243, in __call__
    ar = view.apply(f, *args)
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/view.py", line 233, in apply
    return self._really_apply(f, args, kwargs)
  File "<string>", line 2, in _really_apply
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/view.py", line 66, in sync_results
    ret = f(self, *args, **kwargs)
  File "<string>", line 2, in _really_apply
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/view.py", line 51, in save_ids
    ret = f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/view.py", line 567, in _really_apply
    ident=ident)
  File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/client/client.py", line 1263, in send_apply_request
    item_threshold=self.session.item_threshold,
  File "/usr/local/lib/python2.7/dist-packages/IPython/kernel/zmq/serialize.py", line 145, in pack_apply_message
    arg_bufs = flatten(serialize_object(arg, buffer_threshold, item_threshold) for arg in args)
  File "/usr/local/lib/python2.7/dist-packages/IPython/utils/data.py", line 30, in flatten
    return [x for subseq in seq for x in subseq]
  File "/usr/local/lib/python2.7/dist-packages/IPython/kernel/zmq/serialize.py", line 145, in <genexpr>
    arg_bufs = flatten(serialize_object(arg, buffer_threshold, item_threshold) for arg in args)
  File "/usr/local/lib/python2.7/dist-packages/IPython/kernel/zmq/serialize.py", line 89, in serialize_object
    buffers.insert(0, pickle.dumps(cobj, PICKLE_PROTOCOL))
cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

理解为什么这不起作用的任何帮助,以及需要最少代码更改的修复都将非常有用。

谢谢!

我找到了一个解决方案:

class Foo(object):
    def __init__(self):
        from numpy import arange
        self.data = arange(10)*10
    @staticmethod
    def A(data, y):
        print "in A:", y ## doesn't produce an output
        return data[y]
    def parallelA(self, z, cl):
        print "in parallelA:", cl[:].map_sync(self.A, [self.data]*len(z), z)
if __name__ == "__main__":
    from IPython.parallel import Client
    f = '/path/to/security/ipcontroller-client.json'
    c = Client(f)
    asdf = Foo()
    asdf.parallelA([1, 3, 5], c)

运行上述代码时输出:

$ python test_parallel.py 
in parallelA: [10, 30, 50]

最新更新