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

时间:2017-11-20 11:04:20

标签: python python-3.x scikit-learn multiprocessing python-multiprocessing

我有一个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中进行多处理的方法(请原谅我的无知)。我已经阅读了很少的搜索结果并提出了这个问题。

如果有人可以帮助编码,那将是一个很好的帮助,或者读取多处理的链接将是公平的。感谢。

1 个答案:

答案 0 :(得分:1)

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

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

我如何理解这些水平,但我的意思是:

  • 最低级别:核心算法是并行的
    • 决策树是RF的核心;不平行(在sklearn中)!
    • 影响单一预测性能
  • 中级:整体算法是并行的
    • RF =多个决策树:并行(在sklearn中)!
    • 影响单一预测性能
  • 高级:批量预测是并行的
    • 这就是你想要做的事情,只有在较低级别不利用你的能力时才有意义!
    • 会影响单一预测效果(如您所知)

一般规则是:

  • 如果使用正确的参数(例如n_jobs=-1;不是默认的!):
    • RF将使用min(number of cores, n_estimators)核心!
      • 如果上面的内容低于你的内核数量,那么只能实现

因此,您应该在训练时使用正确的n_jobs参数来使用并行化。 sklearn将按照说明使用它,可以看到here

如果您已使用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的多处理包装器在sklearn中使用了很多。基本的例子应该可以使用了!

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