Ich versuche joblib zu verwenden, um eine benutzerdefinierte zufällige Waldimplementierungszug parallel zu machen.Untersuchen der Joblib Verlangsamung
Die Aufgabe ist peinlich parallel, also nahm ich an, dass eine Beschleunigung mit joblib nicht zu schwer sein sollte.
Hier ist ein Beispielcode:
class RandomForest(object):
def __init__(self, settings, data):
self.forest = [None] * settings.n_trees
self.parallel = Parallel(n_jobs=settings.njobs, backend="threading")
def fit(self, data, train_ids_current_minibatch, settings, param, cache):
self.forest = self.parallel(
delayed(_parallel_build_trees_batch)(
i_t, data, train_ids_current_minibatch, settings, param, cache)
for i_t, tree in enumerate(self.forest))
def partial_fit(self, data, train_ids_current_minibatch, settings, param, cache):
self.forest = self.parallel(
delayed(_parallel_build_trees_partial)(
tree, i_t, data, train_ids_current_minibatch, settings, param, cache)
for i_t, tree in enumerate(self.forest))
jedoch die Ausbildung ist viel langsamer, wenn mehrere Jobs verwenden, sowohl im Batch- und inkrementellen Fall. Die Daten- und Cache-Argumente sind Dicts, die (große) numpige Arrays enthalten, also frage ich mich, ob das der Grund ist.
Ich habe versucht, die gleiche Codierung mit multiprocessing.Pool
und die Ergebnisse sind noch schlimmer, da nicht die threading
Backend von Joblib, nehme ich an, weil die Fit-Funktionen verwenden stark numpy/scipy Code.
Irgendwelche Ideen zum Debuggen/Reparieren der Verlangsamung?
hat mein Beitrag Ihre Frage beantworten? – hansaplast