Python 多处理机器学习代码永远不会结束

Python 多处理机器学习代码永远不会结束,python,scikit-learn,process,multiprocessing,sleep,Python,Scikit Learn,Process,Multiprocessing,Sleep,我正在努力并行运行几个机器学习算法(来自scikit learn),并且我正在使用进程类和进程之间共享的变量,以保存结果 不幸的是,我的代码永远不会结束。这会不会是内存问题,因为我正在运行10个相当繁重的算法?或者只是速度慢 我试着把整个代码分成两部分(我想这会使它更快),但是,它没有改变任何东西 请注意,train_bow和test_bow只是浮动向量 from sklearn.linear_model import LogisticRegression from sklearn.naive_

我正在努力并行运行几个机器学习算法(来自scikit learn),并且我正在使用进程类和进程之间共享的变量,以保存结果

不幸的是,我的代码永远不会结束。这会不会是内存问题,因为我正在运行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

这段代码给出了一些属于算法的警告,但没有显示任何与多处理相关的错误或警告。

也许您应该详细调试。检查“长”时间段的迭代次数。迭代是在进行中还是在某个地方卡住了?您的初始算法是否工作正常(尝试不进行多重处理)?如果是,那么您可以将问题隔离到多处理,并查看管理器是如何进行接口的

此外,请包括您的系统规格,一般的经验法则是,您应该只运行n个进程的n个核心在您的电脑上

检查任务管理器上的性能规格,查看您使用的内存/内核数量

您还可能希望启动一个线程,检查进程是否处于活动状态或已完成状态,以查看哪些算法没有运行


个人对ML的看法,除非你有一台beast PC,否则它的速度很慢:)

我设法让它工作,只是用
线程
替换
进程

我认为这是可行的,可能是因为创建许多流程的速度较慢,一些经理/调度员/较低级别的实体必须处理并管理这些流程

我没有启动“controller”线程,但似乎一切正常


谢谢你们的帮助

欢迎来到StackOverflow,Friderico。你能不能也分享一下你的导入,以简化你所看到的情况和警告的复制?你能告诉我在这些算法完成训练后你打算用它们做什么吗?我用它们来分类,我从多重处理中检索最佳结果,然后存储它们,以便预测其他数据的标签。所以您只使用性能最佳的模型来预测?或者以某种方式使用所有这些方法,可能是通过投票?我只使用最好的方法,但在所有方法中,我也使用投票分类器。事实上,我的任务经理似乎什么都不做,似乎在无所事事。。。我将尝试优化与核心相关的进程数量。感谢如果您的任务管理器显示0处理,则可能意味着它在流程中的某个位置被卡住了。可能是竞争,也可能是培训代码中存在缺陷。您是否尝试过在不使用培训代码进行多处理的情况下运行其中一个分类器?我认为它可能在某个地方阻止了进程.join()的完成。确保该过程能够真正完成。