运行 sk-learn model.predict 与 python 多处理
Running sk-learn model.predict with python multiprocessing
我有一个 scikit-learn 创建的模型,一个巨大的测试数据集来预测。现在为了加速预测我想实现multiprocessing,但是实在无法破解,需要这方面的帮助。
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 中进行多处理的方法(请原谅我的无知)。我阅读了很少的搜索结果并想到了这个。
如果有人可以帮助编码,那将是一个很大的帮助,或者 link 阅读多处理就足够了。谢谢。
您使用了 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
会占用更多内存!
使用你最喜欢的 OS-monitor,确保正确设置分类器(并行 -> n_jobs)并观察原始预测期间的 CPU-usage。这不是为了评估并行化的效果,而是为了某种迹象表明它正在使用并行化!
如果您仍然需要并行化,例如当有 32 个内核并使用 n_estimators=10
时,然后使用 joblib,sklearn-people 的 multiprocessing-wrapper 在 sklearn 中使用了很多。基本的例子应该可以用了!
这是否会加快速度取决于很多事情(IO 和合作)。
我有一个 scikit-learn 创建的模型,一个巨大的测试数据集来预测。现在为了加速预测我想实现multiprocessing,但是实在无法破解,需要这方面的帮助。
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 中进行多处理的方法(请原谅我的无知)。我阅读了很少的搜索结果并想到了这个。
如果有人可以帮助编码,那将是一个很大的帮助,或者 link 阅读多处理就足够了。谢谢。
您使用了 RandomForest(由于预测速度较慢,我会猜到)。
这里的要点是:它已经并行化了(整体级!)! 并且你在外层进行的所有尝试都会减慢速度!
我对这些级别的解释有点武断,但我的意思是:
- 最低级:核心算法是并行的
- 决策树是RF的核心;不平行(在 sklearn 中)!
- 影响单次预测性能
- 中级:集成算法是并行的
- RF = 多个决策树:并行(在 sklearn 中)!
- 影响单次预测性能
- 高级:批量预测是并行的
- 这就是您想要做的,并且只有在较低级别尚未利用您的能力的情况下才有意义!
- 不会影响单一预测性能(如您所知)
一般规则是:
- 如果使用正确的参数(例如
n_jobs=-1
;不是默认值!):- RF 将使用
min(number of cores, n_estimators)
个内核!- 加速 只能 实现,如果上述低于您的核心数!
- RF 将使用
所以你应该在训练时使用正确的 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
会占用更多内存!
使用你最喜欢的 OS-monitor,确保正确设置分类器(并行 -> n_jobs)并观察原始预测期间的 CPU-usage。这不是为了评估并行化的效果,而是为了某种迹象表明它正在使用并行化!
如果您仍然需要并行化,例如当有 32 个内核并使用 n_estimators=10
时,然后使用 joblib,sklearn-people 的 multiprocessing-wrapper 在 sklearn 中使用了很多。基本的例子应该可以用了!
这是否会加快速度取决于很多事情(IO 和合作)。