#python #multiprocessing #dask #dask-distributed #dask-ml
#python #многопроцессорная обработка #dask #dask-распределенный #dask-ml
Вопрос:
У меня есть набор данных, состоящий из 100000 выборок.
Мне нужно разделить этот набор данных на 100 подмножеств и для каждого подмножества обучить модель ML. Поскольку обученные модели независимы, легко распараллелить эту часть, выполнив что-то вроде
from dask import compute, delayed
from sklearn.linear_model import Lasso
X, y = load_data()
n_windows = 100
model = Lasso()
results = []
for i in range(0, len(X), n_windows):
results.append(delayed(model.fit)(X, y))
results = compute(results)
Но, скажем, сама модель должна порождать процессы, например, если модель представляет собой конвейер, который содержит перекрестную проверку типа GridSearchCV
или HyperBandSearchCV
.
Как это работает тогда? Как я должен распараллелить этот код? Мне непонятно, как заставить это работать, особенно если я использую sklearn
такие оценки, как GridSearchCV
или ColumnTransformer
которые используют joblib
вместо dask
того, чтобы распараллеливать вычисления.
На самом деле, в зависимости от того, использую ли я a Client
или нет, так:
from dask.distributed import Client
client = Client()
и в зависимости от того, создается ли этот экземпляр client
в основном скрипте или импортируется из другого модуля, я получаю либо предупреждение, либо ошибку.
В первом случае код успешно выполняется, но я получаю предупреждение::
Multiprocessing-backed parallel loops cannot be nested, setting n_jobs=1
Во втором случае код никогда не завершается, интерпретатор стекается, и я получаю эту ошибку:
daemonic processes are not allowed to have children
Буду признателен за любую помощь в решении этой проблемы. Спасибо
Ответ №1:
Взгляните на Dask ML, в нем есть многое из того, что вам нужно.