Вложенные процессы с моделями Dask и машинного обучения

#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, в нем есть многое из того, что вам нужно.