2017-02-13 22 views
0

Например предположим, у меня есть код:Scikit-Learn с Dask-Распространяется с использованием вложенного параллелизма?

vectorizer = CountVectorizer(input=u'filename', decode_error=u'replace') 
classifier = OneVsRestClassifier(LinearSVC()) 
pipeline = Pipeline([ 
('vect', vectorizer), 
('clf', classifier)]) 

with parallel_backend('distributed', scheduler_host=host_port): 
    scores = cross_val_score(pipeline, X, y, cv=10) 

Если я выполняю этот код можно увидеть в DASK WebView (через Bokeh), что 10 создаются задачи (1 для каждого раза). Однако, если я выполню:

(Я знаю, что X и y следует разделить на обучение и тестирование, но это только для целей тестирования).

with parallel_backend('distributed', scheduler_host=host_port): 
    pipeline.fit(X,y) 

Я вижу 1 задачу для каждого создаваемого класса y (20 в моем случае). Есть ли способ, чтобы cross_val_score выполнялся параллельно? И базовый OneVsRestClassifier работает параллельно? Или это оригинальный код

with parallel_backend('distributed', scheduler_host=host_port): 
    scores = cross_val_score(pipeline, X, y, cv=10) 

запуска OneVsRestClassifier параллельно вместе с cross_val_score в параллель, и я просто не видел его? Должен ли я реализовать это вручную с распределением dask?

ответ

0

Дизайн параллельных бэкэндов joblib в настоящее время слишком ограничен для обработки вложенных параллельных вызовов. Эта проблема отслеживается здесь: https://github.com/joblib/joblib/pull/538

Мы также должны расширить распределенный бэкэнд joblib использовать http://distributed.readthedocs.io/en/latest/api.html#distributed.get_client