2015-05-29 25 views
1

我想采用现有的函数(例如scikit-learn,特别是“预测”函数),并将其应用于多个核心数据集。ipython并行集群并行装饰器和高阶函数

我的第一个幼稚的做法:

def parallel_predict(classifier): 
    @dview.parallel(block=True) 
    def predict(matrix): 
     return classifier.predict(matrix) 
    return predict 

不行的(多个内核不开始旋转起来)。有没有办法做到这一点?

或者某种方式将“不可迭代”函数传递给@dview.parallel函数?

+0

您是否试图并行化一个调用来预测()?并行化的简单方法基本上都是对函数进行多次调用的方式,以便它们可以在不同的内核或不同的机器上运行。将串行功能转换为并行功能通常涉及更多。 –

+0

是的,我试图并行化一个调用来预测()。 @ dview.parallel装饰一个函数,以便在迭代器上运行时,它将可迭代器分开并将它们分别发送到不同的客户端:这就是我想要做的。不幸的是,它似乎要求参数都是可迭代的。 –

+0

您是否可以将函数调用封装在只展示要并行处理的迭代参数的lambda表中? –

回答

0

几个想法,都基于remote execution doc。我习惯了@remote修饰者,而不是您使用过的@parallel,但希望他们仍然适用于您的情况。 (出于某种原因,今天似乎无法获得that doc的加载时间)。

由于classifier模块在引擎上无法访问,因此远程执行不起作用吗?如果是这样,可以通过使用with dview.import_sync(): import classifier(根据this example)或添加@require('classifier'):装饰器(来自文档的相同部分),明确地向装饰函数添加import语句来解决此问题。至于最后一个选项,不知道多个装饰器如何交互(可能最简单的方法就是重击)。

第二个想法是,您可以检查远程异常(s)(here's the doc on that)。这比明白无误地明确得多。例如,类似于:

x = e0.execute('1/0') 
print x.metadata['error'] 

x = predict 
print x.metadata['error']