以数据框为输入的模型上的多处理
Multiprocessing on a model with data frame as input
我想在模型上使用多处理,以使用数据框作为输入来获得预测。我有以下代码:
def perform_model_predictions(model, dataFrame, cores=4):
try:
with Pool(processes=cores) as pool:
result = pool.map(model.predict, dataFrame)
return result
# return model.predict(dataFrame)
except AttributeError:
logging.error("AttributeError occurred", exc_info=True)
我得到的错误是:
raise TypeError("sparse matrix length is ambiguous; use getnnz()"
TypeError: sparse matrix length is ambiguous; use getnnz() or shape[0]
我认为问题在于我将数据框作为第二个参数传递给 pool.map
函数。任何建议或帮助将不胜感激。
诀窍是将您的数据框分成块。 map
需要 model.predict
将要处理的对象列表。这是一个完整的工作示例,模型显然被嘲笑了:
import numpy as np
import pandas as pd
from multiprocessing import Pool
no_cores = 4
large_df = pd.concat([pd.Series(np.random.rand(1111)), pd.Series(np.random.rand(1111))], axis = 1)
chunk_size = len(large_df) // no_cores + no_cores
chunks = [df_chunk for g, df_chunk in large_df.groupby(np.arange(len(large_df)) // chunk_size)]
class model(object):
@staticmethod
def predict(df):
return np.random.randint(0,2)
def perform_model_predictions(model, dataFrame, cores):
try:
with Pool(processes=cores) as pool:
result = pool.map(model.predict, dataFrame)
return result
# return model.predict(dataFrame)
except AttributeError:
logging.error("AttributeError occurred", exc_info=True)
perform_model_predictions(model, chunks, no_cores)
请注意,此处选择的块数应与核心数(或您要分配的任何数量)相匹配。这样每个核心都能得到公平的份额,并且 multiprocessing
不会在对象序列化上花费太多时间。
如果您想单独处理每一行 (pd.Series
),序列化所花费的时间可能是一个问题。在这种情况下,我建议使用 joblib
并阅读其各种后端的文档。我没有在上面写,因为你似乎想在 pd.Dataframe
.
上调用 predict
额外警告
有可能 multiprocessing
不会让您获得更好的表现,反而会使情况变得更糟。当您的 model.predict
调用本身生成线程的外部模块时,它会在极少数情况下发生。我写了关于这个问题 。长话短说,joblib
又是一个答案。
我想在模型上使用多处理,以使用数据框作为输入来获得预测。我有以下代码:
def perform_model_predictions(model, dataFrame, cores=4):
try:
with Pool(processes=cores) as pool:
result = pool.map(model.predict, dataFrame)
return result
# return model.predict(dataFrame)
except AttributeError:
logging.error("AttributeError occurred", exc_info=True)
我得到的错误是:
raise TypeError("sparse matrix length is ambiguous; use getnnz()"
TypeError: sparse matrix length is ambiguous; use getnnz() or shape[0]
我认为问题在于我将数据框作为第二个参数传递给 pool.map
函数。任何建议或帮助将不胜感激。
诀窍是将您的数据框分成块。 map
需要 model.predict
将要处理的对象列表。这是一个完整的工作示例,模型显然被嘲笑了:
import numpy as np
import pandas as pd
from multiprocessing import Pool
no_cores = 4
large_df = pd.concat([pd.Series(np.random.rand(1111)), pd.Series(np.random.rand(1111))], axis = 1)
chunk_size = len(large_df) // no_cores + no_cores
chunks = [df_chunk for g, df_chunk in large_df.groupby(np.arange(len(large_df)) // chunk_size)]
class model(object):
@staticmethod
def predict(df):
return np.random.randint(0,2)
def perform_model_predictions(model, dataFrame, cores):
try:
with Pool(processes=cores) as pool:
result = pool.map(model.predict, dataFrame)
return result
# return model.predict(dataFrame)
except AttributeError:
logging.error("AttributeError occurred", exc_info=True)
perform_model_predictions(model, chunks, no_cores)
请注意,此处选择的块数应与核心数(或您要分配的任何数量)相匹配。这样每个核心都能得到公平的份额,并且 multiprocessing
不会在对象序列化上花费太多时间。
如果您想单独处理每一行 (pd.Series
),序列化所花费的时间可能是一个问题。在这种情况下,我建议使用 joblib
并阅读其各种后端的文档。我没有在上面写,因为你似乎想在 pd.Dataframe
.
额外警告
有可能 multiprocessing
不会让您获得更好的表现,反而会使情况变得更糟。当您的 model.predict
调用本身生成线程的外部模块时,它会在极少数情况下发生。我写了关于这个问题 joblib
又是一个答案。