2015-05-29 1 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 украшает функцию, так что при запуске на iterable она разбивает итерацию вверх и отправляет каждый из них другому клиенту: вот что я хочу сделать здесь. К сожалению, кажется, что аргументы ВСЕ Итерабельны. –

+0

Можете ли вы обернуть вызов функции в лямбда, который выдает только итерируемые аргументы, которые вы хотите распараллелить? –

ответ

0

Пара мыслей, как на основе remote execution doc. Я привык к декоратору @remote, а не @parallel, который вы использовали, но, надеюсь, они все равно будут применяться к вашему делу. (по-видимому, по какой-то причине не получается that doc).

В этом случае удаленное выполнение не работает, потому что модуль classifier недоступен на двигателе? Если это так, это можно решить, добавив оператор import к вашей украшенной функции явно, используя with dview.import_sync(): import classifier (согласно this example) или добавив декоратор @require('classifier'): (из того же раздела документа). Что касается последнего варианта, не знаете, как взаимодействуют несколько декораторов (возможно, проще всего просто дать ему удар).

Вторая мысль заключается в том, что вы можете проверить удаленные исключения (here's the doc on that). Это было бы намного более явным, чем просто ничего не вернуть. Например, что-то вроде:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^