Многопроцессорный пул становится все медленнее после нескольких вызовов - PullRequest
1 голос
/ 11 октября 2019

Я хочу итеративно обучать 1000 случайных лесов на наборе данных. Чтобы ускорить процесс, я пытаюсь использовать несколько ядер во время повторного цикла обучения. Ниже приведен рабочий пример:

from sklearn.ensemble import RandomForestClassifier
from multiprocessing import Pool,cpu_count
import numpy as np
import pandas as pd
from time import time

n = 2000
ndims = 5000

X = pd.DataFrame(np.random.normal(0,1,n*ndims).reshape((n,ndims)))
y = pd.Series(np.random.choice([0, 1], size=(n)))


def draw_batches(n,size=100):
    steps = np.arange(0,n,size)
    if not n%size == 0:
        steps = np.append(steps,n%size)[1:]
    for step in steps:
        if not step%size == 0:
            yield step
        else:
            yield size


def pool(method,iters):
    output = []
    p = Pool(4)
    try:
        output = p.map(method,iters)
    except Exception as e:
        print(e)
        pass
    finally:
        p.close()
        p.join()
        del p
    return output


def importances(args):
    model, i = args
    y_ = y.copy()
    model.fit(X,y_)
    return model.feature_importances_

n_iters = 100
model_cls = RandomForestClassifier

for batch in draw_batches(n_iters,4):
    print(batch)
    t = time()
    train_args = [(model_cls(n_estimators=50),i) for i in np.arange(batch)]
    imps = pool(importances,train_args)
    print((time()-t)/batch)

Хотя это и не так ярко выражено, как в коде, с которым я работаю, приведенное выше показывает, что время обработки для каждой модели постепенно увеличивается с увеличением количества выполняемых пакетов. Я не ожидал бы, что это так, поскольку обработка пула полностью завершена, и все удаляется в конце каждого запуска.

Что вызывает замедление?

...