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

萨蒂亚

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

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

现在我想使用多处理来预测,(分块数据集并在每个核心中的每个块上分别运行预测函数,然后连接结果)。

但不能这样做。

我试过了

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 中进行多处理的方式(请原谅我的无知)。我已经阅读了一些搜索结果并想出了这个。

如果有人可以帮助编码,那将是一个很大的帮助,或者用于阅读多处理的链接将足够公平。谢谢。

萨沙

您使用了RandomForest(由于预测缓慢,我会猜到)。

这里的外卖信息是:它已经并行化了(集成级!)!你在外层做的所有尝试都会减慢速度!

我如何解释这些级别有点随意,但我的意思是:

  • 最低层:核心算法是并行的
    • 决策树是RF的核心;不平行(在 sklearn 中)!
    • 影响单次预测性能
  • 中级:集成算法是并行的
    • RF = 多个决策树:并行(在 sklearn 中)!
    • 影响单次预测性能
  • 高级:批量预测是并行的
    • 这就是您想要做的,并且只有在较低级别尚未利用您的能力时才有意义!
    • 不会影响单预测的性能(如你已经知道)

一般规则是:

  • 如果使用正确的参数(例如n_jobs=-1;不是默认值!):
    • RF 将使用min(number of cores, n_estimators)内核!
      • 加速可以才可以实现,如果上面的比你的内核数量低!

所以你应该n_jobs在训练时使用正确的参数来使用并行化。sklearn 将按照说明使用它,可以在此处查看

如果您已经用n_jobs=1(非并行)训练了分类器,事情会变得更加困难。这样可能会奏效

# untested
model = joblib.load(model_saved_path)
#model.n_jobs = -1                     # unclear if -1 is substituted earlier
model.n_jobs = 4                       # more explicit usage

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

使用您最喜欢的操作系统监视器,确保正确设置分类器(并行 -> n_jobs)并在原始预测期间观察 CPU 使用情况。这不是为了评估并行化的效果,而是为了某些指示它正在使用并行化!

如果您仍然需要并行化,例如当有 32 个内核并使用 时n_estimators=10,则使用joblib,sklearn-people 的 multiprocessing-wrapper 在 sklearn 中使用了很多。基本示例应该可以使用了!

如果这会加快速度将取决于许多事情(IO 和合作)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章