Многопроцессорный код машинного обучения никогда не заканчивается - PullRequest
0 голосов
/ 05 ноября 2019

Я стараюсь параллельно запустить несколько алгоритмов машинного обучения (из scikit-learn) и использую класс Process с переменной, общей для процессов, чтобы сохранить результаты.

К сожалениюмой код никогда не заканчивается. Может ли это быть проблема с памятью, потому что я использую 10 довольно тяжелых алгоритмов? Или это просто медленно?

Я пытался разделить весь код на две части (я думал, что это сделает его быстрее), однако, это ничего не меняет ...

Обратите внимание, что train_bow и test_bow - это просто плавающие векторы.

from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import MultinomialNB, ComplementNB, BernoulliNB
from sklearn.ensemble import GradientBoostingClassifier, AdaBoostClassifier, VotingClassifier, ExtraTreesClassifier
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier as Knn
from sklearn.feature_extraction.text import TfidfVectorizer

#Custom class
from utilities.db_handler import *
from utilities.utils import *
from multiprocessing import Process, Manager
import json
import pickle as pkl
import os
import numpy as np
import pandas as pd

manager = Manager()
return_dict = manager.dict()

# Use a shared variable in order to get the results
proc = []
fncs1 = [random_forest_classification, SVC_classification, LinearSVC_classification, MultinomialNB_classification,
        LogisticRegression_classification]
fncs2 = [BernoulliNB_classification, GradientBoosting_classification,
        AdaBoost_classification, VotingClassifier_classification, ComplementNB_classification,
        ExtrExtraTrees_classification]

# Instantiating 2 set of processes with relative arguments. Each function
# writes the result on result_dict
for fn in fncs1:
    p = Process(target=fn, args=(train_bow, test_bow, label_train, label_test, return_dict))
    proc.append(p)
    p.start()
for p in proc:
    p.join()

for fn in fncs2:
    p = Process(target=fn, args=(train_bow, test_bow, label_train, label_test, return_dict))
    proc.append(p)
    p.start()
for p in proc:
    p.join()

# then pick te best of the results from return_dict and save them

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

1 Ответ

0 голосов
/ 09 ноября 2019

Мне удалось заставить его работать, просто заменив Process на Thread.

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

Я не запустил поток "контроллера", но все, кажется, работает нормально.

Спасибо за помощь, парни!

...