我有一个科学知识创建的模型,一个巨大的测试数据集可以预测。现在为了加速预测,我想实现多处理,但真的无法破解,在这方面需要帮助。
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中进行多处理的方法(请原谅我在这里的无知)。我看过很少的搜索结果,并想出了这个。
如果有人能在编码方面有所帮助,这将是一个很大的帮助,或者一个多处理的读取链接将是足够公平的。谢谢。
发布于 2017-11-20 11:28:26
您使用了一个RandomForest (由于预测速度慢,我会猜到这一点)。
这里要传达的信息是:,它已经被并行化了(集成级!)!和你在外层做的所有尝试都会减慢速度!
我解释这些级别有点武断,但我的意思是:
一般规则是:
n_jobs=-1;不是默认的!):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时,那么使用强权b,即sklearn的多处理包装器--人们在sklearn中使用了很多。基本示例应该已经准备好使用了!
如果这样做会加快速度,那么很多事情(IO和co)都会影响到事情的发展。
https://stackoverflow.com/questions/47390514
复制相似问题