使用python多处理运行sk learn model.predict

使用python多处理运行sk learn model.predict,python,python-3.x,scikit-learn,multiprocessing,python-multiprocessing,Python,Python 3.x,Scikit Learn,Multiprocessing,Python Multiprocessing,我有一个scikit学习创建的模型,一个巨大的测试数据集要预测。现在为了加快预测速度,我想实现多处理,但实际上无法破解它,需要这方面的帮助 import pandas as pd from sklearn.externals import joblib dataset = pd.read_csv('testdata.csv') # 8mln rows feature_cols = ['col1', 'col2', 'col3'] #load model model = joblib.load

我有一个scikit学习创建的模型,一个巨大的测试数据集要预测。现在为了加快预测速度,我想实现多处理,但实际上无法破解它,需要这方面的帮助

import pandas as pd
from sklearn.externals import joblib
dataset = pd.read_csv('testdata.csv')  # 8mln rows
feature_cols = ['col1', 'col2', 'col3']

#load model
model = joblib.load(model_saved_path)                # random-forest classifier

#predict Function
def predict_func(model, data, feature_cols):
    return model.predict(data[fetaure_cols])

#Normal Execution
predict_vals = predict_func(model, dataset, feature_cols) #130 secs
现在我想使用多处理来预测(将数据集分块,并在每个核心中的每个块上分别运行predict函数,然后返回结果)

但我们不能这样做

我试过了

import multiprocessing as mp
def mp_handler():
    p = multiprocessing.Pool(3) #I think it starts 3 processes
    p.map(predict_func, testData) #How to pass parameters
mp_handler()
我不知道这是否是用python进行多处理的方法(请原谅我的无知)。我读了一些搜索结果,并提出了这个

如果有人能在编码方面提供帮助,那将是一个很大的帮助,或者多处理上的阅读链接就足够了。谢谢。

您使用了a(我会猜到,因为预测速度慢)

这里的要点是:它已经并行化了(集成级!)而您在外部级别上的所有尝试都会减慢速度

我对这些层次的理解有点武断,但我的意思是:

  • 最低级别:核心算法是并行的
    • 决策树是RF的核心;不平行(在学习中)
    • 影响单一预测性能
  • 中级:集成算法是并行的
    • RF=多决策树:并行(在sklearn中)
    • 影响单一预测性能
  • 高级:批量预测是并行的
    • 这是你想要做的,只有在下级没有利用你的能力时才有意义
    • 是否不影响单个预测性能(如您所知)
一般规则是:

  • 如果使用正确的参数(例如
    n_jobs=-1
    ;非默认值!):
    • RF将使用
      min(磁芯数,n_估计器)
      磁芯!
      • 只有当上述核数低于您的核数时,才能实现加速
因此,您应该在培训时使用正确的
n_jobs
参数来使用并行化。sklearn将使用解释过的方法,可以看到

如果您已经使用
n_jobs=1
(非并行)对分类器进行了培训,事情就会变得更加困难。它可能会解决以下问题:

请记住,使用
n_jobs>1
会占用更多内存

使用您喜爱的OS监视器,确保正确设置分类器(并行->n_作业),并在原始预测期间观察CPU使用情况。这不是为了评估并行化的效果,而是为了表明它正在使用并行化

如果您仍然需要并行化,例如,当您拥有32个内核并使用
n_estimators=10
时,请使用sklearn的多处理包装器,sklearn人员在sklearn中使用了很多。基本示例应该已经准备好使用

这是否会加快速度取决于很多因素(IO和co)。

您使用了a(我会猜是因为预测速度慢)

这里的要点是:它已经并行化了(集成级!)而您在外部级别上的所有尝试都会减慢速度

我对这些层次的理解有点武断,但我的意思是:

  • 最低级别:核心算法是并行的
    • 决策树是RF的核心;不平行(在学习中)
    • 影响单一预测性能
  • 中级:集成算法是并行的
    • RF=多决策树:并行(在sklearn中)
    • 影响单一预测性能
  • 高级:批量预测是并行的
    • 这是你想要做的,只有在下级没有利用你的能力时才有意义
    • 是否不影响单个预测性能(如您所知)
一般规则是:

  • 如果使用正确的参数(例如
    n_jobs=-1
    ;非默认值!):
    • RF将使用
      min(磁芯数,n_估计器)
      磁芯!
      • 只有当上述核数低于您的核数时,才能实现加速
因此,您应该在培训时使用正确的
n_jobs
参数来使用并行化。sklearn将使用解释过的方法,可以看到

如果您已经使用
n_jobs=1
(非并行)对分类器进行了培训,事情就会变得更加困难。它可能会解决以下问题:

请记住,使用
n_jobs>1
会占用更多内存

使用您喜爱的OS监视器,确保正确设置分类器(并行->n_作业),并在原始预测期间观察CPU使用情况。这不是为了评估并行化的效果,而是为了表明它正在使用并行化

如果您仍然需要并行化,例如,当您拥有32个内核并使用
n_estimators=10
时,请使用sklearn的多处理包装器,sklearn人员在sklearn中使用了很多。基本示例应该已经准备好使用


如果这能加快速度,将取决于许多因素(IO和co)。

考虑使用。如果你的分类器/回归器还没有并行化,也要检查它(显示的代码不完整,无法决定这一点)@sascha-以上是我到目前为止写的,如果你有任何关于“还检查你的分类器/回归器,如果它还没有为此并行化”的示例参考,请发布链接。谢谢,不用了。也许你应该发布更多的信息。你的评论也没有什么新的内容。是的,是你写的,但它不起作用。我刚才提到了一个抽象层,它是所有SKEXCEL并行化的核心(就这种并行化而言,忽略SIMD或OpenMP)。信息类似于?重读我的第一条评论。请考虑使用。如果你的分类器/回归器还没有并行化,也要检查它
# untested
model = joblib.load(model_saved_path)
#model.n_jobs = -1                     # unclear if -1 is substituted earlier
model.n_jobs = 4                       # more explicit usage